openapi: 3.1.0
info:
  title: Praxedo Public REST APIs
  version: 1.0.68
  description: |-
    Please find new REST APIs developped by Praxedo.

    Praxedo offer three range of Rate Limit :
    - High : 4000 PTH & 120 PTM
    - Standard : 2000 PTH & 60 PTM
    - Low : 1000 PTH & 30 PTM
  contact:
    name: Praxedo
    url: https://www.praxedo.com/
    email: support@praxedo.com
servers:
  - url: https://ws-{node}.praxedo.com
    description: The node of your Praxedo instance (eu1, am1...).
    variables:
      node:
        default: eu1
security:
  - BearerAuthentication: []
tags:
  - name: Referentials
    description: Manage referentials (customers, sites, assets).
  - name: Business organization
    description: Manage staff (web users, field users, skills, machines,
      characteristics...) and item catalog.
  - name: Rostering
    description: Optimize adequation between constraints and resources.
  - name: Diagnostic
    description: Create and diagnostic work order (notes, instructions, expected items...).
  - name: Project management
    description: Link work orders to their parent (project, route or standard service order).
  - name: Scheduling
    description: Schedule work orders and retrieve their scheduling datas. Pair with
      the `status.scheduled` webhook for real-time updates.
  - name: Field Service
    description: Retrieve field services datas (used items for instance).
  - name: Field tracking
    description: Retrieve field tracking datas (activity & positions)
  - name: Webhooks
    description: Subscribe to Praxedo webhooks
x-topics:
  - title: Praxedo domains
    content: |-
      # Praxedo domains

      > info
      > Praxedo's API is organised around business **domains**. Each domain groups a set of related objects and is typically mastered either in Praxedo or in one of your systems.

      ## Supporting Domains (Enabling Infrastructure)

      These domains configure and support core operations.

      **Referentials — Master data that grounds the system**

      - Objects: Customers, Sites, Assets, Contracts.
      - They are usually managed in your ERP/CRM system.

      #### Business Organization — Organizational structure and roles management

      - Objects: Users (web or mobile), Business Units, Item Catalog.
      - They are usually managed in your HR system for staffs or CRM/ERP system for business units and catalog

      #### Contracting — Contractor and sub-contractor management

      - Objects: Contractors, Sub-contractors.
      - They are usually managed in your Billing system.

      #### Inventory — Stock and spare parts management

      - Objects: Stores, Stocks, Available items.
      - They are usually managed in your ERP system.

      
      ## Core Domains (Business Critical)

      These domains directly support field service operations and are central to Praxedo's value.

      **Diagnostic — Service request analysis and work type determination**

      - Objects: Work Order, Work Order Type, Slas, Instructions, required Skills or Characteristics...
      - They are usually managed in both Praxedo and an ERP / CRM system. Define ownership clearly.

      #### Rostering — Resource availability and shift management

      - Objects: Resources, Availabilities, Unavailabilities, Slots, Zones.
      - They are usually managed in Praxedo.

      #### Scheduling — Work order scheduling, resource allocation, and routing

      - Objects: Work Orders, Resources.
      - They are usually managed in Praxedo.

      #### Field Service — On-site execution and real-time operation

      - Objects: Status, Report, PDF, Item Usage.
      - They are usually managed in Praxedo.

      #### Field Tracking — Technician location and activity history

      - Objects: Positions, Activities.
      - They are usually managed in Praxedo.

      #### Electronic Document Management — Archiving and document management

      - Objects: Attachments
      - They are usually managed in Praxedo.
  - title: Getting started
    content: |-
      # Getting Started
      Guidelines for using Praxedo REST APIs

      Before starting any integration please read our [documentation](<https://support.praxedo.com/hc/en-us/sections/25001109724562-REST-Web-Services>)

      ## Authentication

      OAuth 2.0 application is required to authenticate your API calls

      ```plaintext
      Authorization: Bearer <access_token>
      ```

      See here how to configure in Praxedo your [Oauth2 application](<https://support.praxedo.com/hc/en-us/articles/16700630262162-Configuring-your-OAuth-2-0-application>)

      ## Rate Limiting

      Find here the different range of Rate limit set for our endpoints.

      | **Rate limit range** | **Bandwidth**         |
      | --------------------- | ---------------------- |
      | High                  | 4000/PT1H or 110/PT1M |
      | Standard              | 2000/PT1H or 55/PT1M  |
      | Low                   | 1000/PT1H or 30/PT1M  |

      ## HTTP errors code

      | Code | Status                | Description                                                                                  |
      | ---- | ---------------------- | ---------------------------------------------------------------------------------------------- |
      | 200  | OK                    | The request was successfully completed.                                                      |
      | 201  | Created               | A new resource was successfully created.                                                     |
      | 204  | Updated               | A resource was successfully updated.                                                         |
      | 400  | Bad Request           | The request was invalid.                                                                     |
      | 401  | Unauthorized          | The request did not include an authentication token or the authentication token was expired. |
      | 403  | Forbidden             | The client did not have permission to access the requested resource.                         |
      | 404  | Not Found             | The requested resource was not found.                                                        |
      | 500  | Internal Server Error | The request was not completed due to an internal error on the server side.                   |

      #### **Error Responses**

      All errors include:

      * errorReference: A unique identifier for each error—provide this when contacting support
      * errors: An array of specific error messages with codes
      * message: Human-readable description

      #### Empty and null management in POST & PUT actions

      * If non-required fields have an empty string value, they will be saved and retrieved as empty string.
      * If non-required fields have a null value, they will be saved and retrieved as null.
      * If non-required fields are absent, they will be saved and retrieved as null.

      ### **Date Formats**

      All dates follow ISO-8601UTC :

      * **Date only**: YYYY-MM-DD (e.g., 2024-12-25)
      * **DateTime**: YYYY-MM-DDTHH:MM (e.g., 2024-12-25T15:30)
      * **Time only**: HH:MM (e.g., 14:36)

      ### **Resource name**

      * singular, lower camelCase
      * the same rule applies for sub resources

      ### **Nullable fields**

      Fields marked as nullable can be omitted from requests or included as null. Both are valid. In responses, null fields indicate the property wasn't set.

      ### **Case Sensitivity**

      Code fields (customerCode, siteCode, etc.) are **case-insensitive**. Internally, they're normalized to uppercase. Queries like customer-123 and CUSTOMER-123 return the same result.

      ### **Hierarchical Resources**

      Some resources support parent-child relationships (sub-customers, sub-sites, sub-assets). A resource cannot be its own parent, and hierarchy depth is limited to 10 levels.

      ### **Custom Fields**

      Custom fields are included as a map of field codes to field values. Field availability depends on your configuration. Invalid or unknown field codes will be rejected with a 400 error.

      ### **Pagination for Lists**

      The endpoint returns paginated results. Use the continuationToken from the response to fetch the next page. An empty continuation token indicates the final page.

      ###
  - title: Webhooks guide
    content: |-
      # Webhooks

      Webhooks let you receive real-time event notifications from Praxedo instead of polling the API. This feature is currently in **Beta**.

      > info
      > Before using webhooks, please contact our Customer Care team (support@praxedo.com) or your Account Manager.

      ## Managing subscriptions

      Subscriptions are managed through the `Webhooks` endpoints below (create, list and delete a subscription). A few rules apply:

      - You can create up to 3 subscriptions per OAuth 2.0 application.
      - Subscriptions cannot be modified once created — to change a callback URL (e.g. from staging to production), create a new subscription.
      - You only receive notifications from the office and sub-offices associated with your OAuth 2.0 application.

      See [Configuring your OAuth 2.0 application](https://support.praxedo.com/hc/en-us/articles/16700630262162-Configuring-your-OAuth-2-0-application) to set up the application your subscriptions will be attached to.

      ## Event delivery

      Once a subscription is active, matching events are sent as JSON to your callback URL. The payload and headers for each event type are documented in the Webhooks section below.

      **Retry policy**

      - Acknowledge every callback with a `200` status within 5 seconds, or a retry will be triggered.
      - Automatic retries use an exponential back-off, up to a 10-minute interval between attempts.
      - Retries stop after 1 hour of attempts for a given event.
      - Because retries can occur, the same event may be delivered more than once. Acknowledge immediately and process the notification asynchronously, and make your handler idempotent (for example, de-duplicate on the callback's `id` field).

      **Subscription policy**

      - During the Beta phase, subscriptions are not automatically disabled, but this will change for callback servers that continuously error.
      - Praxedo may delete a subscription that causes system stress. When this happens, all data for that subscription and its event history are permanently deleted and cannot be recovered.

      ## Headers

      Each callback request includes standard infrastructure headers plus the following:

      | Header | Description |
      | --- | --- |
      | `x-praxedo-event` | The event type carried by this callback (e.g. `workorder.deletion`). |
      | `x-praxedo-secret` | The custom security header defined when the subscription was created, used to verify the callback's authenticity. `null` if none was set. |

      Any custom headers you configured at subscription creation are also included as-is.

      ## Service Level Agreement

      - **Uptime**: Praxedo guarantees 99.9% monthly uptime for the webhooks service, excluding scheduled maintenance.
      - **Client responsibility**: you are responsible for the uptime and accessibility of your callback URL. Praxedo attempts delivery for up to 1 hour and is not responsible for data loss once that retry window has expired.
      - **Traceability**: delivered events are stored and traceable for 15 days in case of delivery failure.
      - **Support**: contact support@praxedo.com with your subscription ID and a description of the issue. Support is available 9:00 AM–5:00 PM CET, Monday to Friday, with an initial response to critical issues within 24 hours.

      Note: This is a Beta version — features, endpoints and payloads may change before general availability.
paths:
  /eTech/rest/ws/fieldTracking/v1/technicians/code:{technicianCode}/positions:
    get:
      tags:
        - Field tracking
      summary: Get list of technician positions
      description: >-
        This API endpoint returns paginated lists of technician positions. Data
        is sorted by timestamp. Pagination is fixed at 500 objects per page. An
        empty response indicates the final page.


        Rate limit range : Low
      operationId: get-fieldTracking-technicianCode-positions
      parameters:
        - $ref: "#/components/parameters/technicianCode"
        - $ref: "#/components/parameters/positionsStartDate"
        - $ref: "#/components/parameters/continuationToken"
      responses:
        "200":
          $ref: "#/components/responses/200_fieldTracking_positions"
        "400":
          $ref: "#/components/responses/400_fieldTracking_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "404":
          $ref: "#/components/responses/404_fieldTracking_technician_not_found"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /eTech/rest/ws/fieldTracking/v1/workOrders/code:{workOrderCode}/activities:
    get:
      tags:
        - Field tracking
      summary: Get list of work order activities
      description: >-
        This API endpoint returns paginated lists of work order activities. Data
        is sorted by startDate. Pagination is fixed at 200 objects per page. An
        empty response indicates the final page.


        Pair with the Praxedo webhook for near-real-time invoicing or stock
        synchronisation.


        Rate limit range : High
      operationId: get-fieldTracking-workOrderCode-activities
      parameters:
        - $ref: "#/components/parameters/workOrderCode"
        - $ref: "#/components/parameters/validationStatus"
        - $ref: "#/components/parameters/invoicingStatus"
        - $ref: "#/components/parameters/continuationToken"
      responses:
        "200":
          $ref: "#/components/responses/200_fieldTracking_activities"
        "400":
          $ref: "#/components/responses/400_fieldTracking_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "404":
          $ref: "#/components/responses/404_fieldTracking_workOrder_not_found"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /eTech/rest/ws/fieldTracking/v1/workOrders/uuid:{workOrderUuid}/activities:
    get:
      tags:
        - Field tracking
      summary: Get list of work order activities by uuid
      description: >-
        This API endpoint returns paginated lists of work order activities. Data
        is sorted by startDate. Pagination is fixed at 200 objects per page. An
        empty response indicates the final page.


        Pair with the Praxedo webhook for near-real-time invoicing or stock
        synchronisation.


        Rate limit range : High
      operationId: get-fieldTracking-workOrderUuid-activities
      parameters:
        - $ref: "#/components/parameters/workOrderUuid"
        - $ref: "#/components/parameters/validationStatus"
        - $ref: "#/components/parameters/invoicingStatus"
        - $ref: "#/components/parameters/continuationToken"
      responses:
        "200":
          $ref: "#/components/responses/200_fieldTracking_activities"
        "400":
          $ref: "#/components/responses/400_fieldTracking_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "404":
          $ref: "#/components/responses/404_fieldTracking_workOrder_not_found"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /rest/v3/slots/search:
    servers:
      - url: https://availableslots-production-1.praxedo.com/
        description: EU servers URL
      - url: https://availableslots-production-2.praxedo.com/
        description: AM2 server URL
      - url: https://availableslots-production-3.praxedo.com/
        description: AM1 server URL
    post:
      tags:
        - Rostering
      summary: Search for available slots
      description: >-
        Finds the available time ranges for qualified field resources to carry
        out a given type of work order. Given a work order type and a location,
        the service allows to find the available intervals during which field
        resources possessing the needed skills have enough time to travel to the
        work order site from the previous site, perform the work order, and
        travel to the site of the next work order.  

        Use https://availableslots-production-1.praxedo.com/rest/v3/slots/search
        for EU instances.  

        Use https://availableslots-production-2.praxedo.com/rest/v3/slots/search
        for AM2.  

        Use https://availableslots-production-3.praxedo.com/rest/v3/slots/search
        for AM1.
      operationId: getSlots
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SlotQuery"
            examples:
              Minimal slot search:
                $ref: "#/components/examples/SlotSearchMinimal"
              Slot search over a time range with skills and offices:
                $ref: "#/components/examples/SlotSearchWithRequirements"
              Slot search with result configuration:
                $ref: "#/components/examples/SlotSearchWithConfiguration"
              Slot search ignoring the capacity model:
                $ref: "#/components/examples/SlotSearchIgnoreCapacityModel"
        required: true
      responses:
        "200":
          $ref: "#/components/responses/200_rostering_slots"
        "400":
          $ref: "#/components/responses/400_rostering_slots_bad_request"
        "1001":
          description: The work order type is missing
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BusinessErrorCode"
        "1002":
          description: A list of time ranges or a an appointment date is missing
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BusinessErrorCode"
        "1003":
          description: Received a request requesting slots related to field resources in
            charge of an area (enableZoneFilter = 'true'). However, no zip code
            has been provided to help identify the area in which the work order
            will take place
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BusinessErrorCode"
        "2001":
          description: The provided work order type does not exist
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BusinessErrorCode"
        "2002":
          description: At least one of the provided offices does not exist
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BusinessErrorCode"
        "2003":
          description: The provided dates are in the past
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BusinessErrorCode"
        "2004":
          description: The end date of the search interval is earlier than the start date
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BusinessErrorCode"
        "2005":
          description: The slot search period is too long. The maximum is 200 weeks
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BusinessErrorCode"
        "2006":
          description: The 'offices' list accepts either 'codes' or 'ids', but not both.
            Please provide only one
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BusinessErrorCode"
        "2007":
          description: The provided areas do not exist
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BusinessErrorCode"
        "2008":
          description: Maximal value for maximumSlotNumber is 700
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BusinessErrorCode"
        "2009":
          description: The skills list accepts either 'codes' or 'ids', but not both.
            Please provide only on
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BusinessErrorCode"
        "2010":
          description: The 'workOrder' can either be a code or an id. Please provide only
            one
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BusinessErrorCode"
        "2011":
          description: "Invalid value '%s' for parameter 'areaScope'. Allowed values are:
            'RESOURCE', 'TIMESLOT'"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BusinessErrorCode"
        "2012":
          description: The parameter 'customerPortalUser' cannot be used with the
            'RESOURCE' area scopes
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BusinessErrorCode"
        "2013":
          description: The parameter 'values' of 'startingHours' cannot be used with the
            'FIRST_OF_THE_DAY' "perResource" option
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BusinessErrorCode"
        "2014":
          description: The parameter 'appointmentDate' of 'availabilities' cannot be used
            with the 'FIRST_OF_THE_DAY' "perResource" option
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BusinessErrorCode"
        "3011":
          description: The provided address couldn't be geocoded
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BusinessErrorCode"
        "3021":
          description: "The provided [latitude, longitude] is out of range : [%s, %s].
            Expected values : -90 < latitude < 90 and -180 < longitude < 180"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BusinessErrorCode"
        "3022":
          description: Coordinates (0,0) are not accepted
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BusinessErrorCode"
        "3031":
          description: The travel times and distances could not be computed
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BusinessErrorCode"
        '3032':
          description: No route could be found to reach the work order destination (e.g. closed road, unreachable area)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BusinessErrorCode'
  /eTech/rest/ws/rostering/v1/crews:
    get:
      tags:
        - Rostering
      summary: List crews active over a period
      description: |-
        Returns the crews active over the requested period, with the participation intervals of each resource, so that you can match technician time with equipment time (for invoicing, for instance).

        **Rules**
        - Crews carrying a disabling date, or whose main resource is inactive, are not returned.
        - A crew is returned when at least one of its resources belongs to the office of the OAuth2 application or below. Secondary resources outside that hierarchy are hidden; the main resource is always shown.
        - The main resource is not repeated among the secondary resources. The report filler is not part of a crew.
        - Past periods can be queried: crews are returned as they are stored at call time.

        Rate limit range : High
      operationId: get-rostering-crews
      parameters:
        - $ref: "#/components/parameters/crewsStartDate"
        - $ref: "#/components/parameters/crewsEndDate"
        - $ref: "#/components/parameters/continuationToken"
        - $ref: "#/components/parameters/crewsSize"
      responses:
        "200":
          $ref: "#/components/responses/200_rostering_crews"
        "400":
          $ref: "#/components/responses/400_rostering_crews_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /eTech/rest/ws/staff/v1/skills/code:{skillCode}:
    put:
      tags:
        - Business organization
      summary: Create or update a skill
      description: |-
        Creates a new skill if the `skillCode` provided does not exist, else
        updates the existing skill.

        Rate limit range : Standard
      operationId: put-staff-skill
      parameters:
        - $ref: "#/components/parameters/skillCode"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Skill"
            examples:
              Skill Body Example 1:
                $ref: "#/components/examples/SkillBodyExample1"
              Skill Body Example 2:
                $ref: "#/components/examples/SkillBodyExample2"
      responses:
        "201":
          $ref: "#/components/responses/201_staff_skill_created"
        "204":
          $ref: "#/components/responses/204_staff_skill_updated"
        "400":
          $ref: "#/components/responses/400_staff_skill_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /eTech/rest/ws/staff/v1/skills:
    get:
      tags:
        - Business organization
      summary: Get a list of skills
      description: >-
        This API endpoint returns paginated lists of skills. Data is sorted
        alphabetically by code. Pagination is fixed at 500 objects per page. An
        empty response indicates the final page.


        Rate limit range : Standard
      operationId: get-staff-skills
      parameters:
        - $ref: "#/components/parameters/continuationToken"
      responses:
        "200":
          $ref: "#/components/responses/200_staff_skills"
        "400":
          $ref: "#/components/responses/400_staff_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /eTech/rest/ws/staff/v1/characteristics:
    get:
      tags:
        - Business organization
      summary: Get a list of characteristics
      description: >-
        This API endpoint returns paginated lists of characteristics. Data is
        sorted alphabetically by code. Pagination is fixed at 500 objects per
        page. An empty response indicates the final page.


        Rate limit range : Standard
      operationId: get-staff-characteristics
      parameters:
        - $ref: "#/components/parameters/continuationToken"
      responses:
        "200":
          $ref: "#/components/responses/200_staff_characteristics"
        "400":
          $ref: "#/components/responses/400_staff_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /eTech/rest/ws/referentials/v1/customers/code:{customerCode}:
    get:
      tags:
        - Referentials
      summary: Get a customer
      description: |-
        Return the customer object if the `customerCode` exists.

        Rate limit range : High
      operationId: get-referentials-customer
      parameters:
        - $ref: "#/components/parameters/customerCode"
      responses:
        "200":
          $ref: "#/components/responses/200_referentials_customer"
        "400":
          $ref: "#/components/responses/400_referentials_customer_get_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "404":
          $ref: "#/components/responses/404_referentials_customer_not_found"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
    put:
      tags:
        - Referentials
      summary: Create or update a customer
      description: |-
        Creates a new customer if the `customerCode` provided does not exist,
        else updates the existing customer.

        Rate limit range : Standard
      operationId: put-referentials-customer
      parameters:
        - $ref: "#/components/parameters/customerCode"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Customer"
            examples:
              New Customer with all fields:
                $ref: "#/components/examples/NewCustomerWithAllFields"
              New customer with mandatory fields only:
                $ref: "#/components/examples/NewCustomerWithMandatoryFieldsOnly"
              Update customer with all fields:
                $ref: "#/components/examples/UpdateCustomerWithAllFields"
              Update customer with mandatory fields only:
                $ref: "#/components/examples/UpdateCustomerWithMandatoryFieldsOnly"
              New sub customer:
                $ref: "#/components/examples/NewSubCustomer"
      responses:
        "201":
          $ref: "#/components/responses/201_referentials_customer_created"
        "204":
          $ref: "#/components/responses/204_referentials_customer_updated"
        "400":
          $ref: "#/components/responses/400_referentials_customer_put_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /eTech/rest/ws/referentials/v1/sites/code:{siteCode}:
    get:
      tags:
        - Referentials
      summary: Get a site
      description: |-
        Return the site object if the `siteCode` exists.

        Rate limite range : High
      operationId: get-referentials-site
      parameters:
        - $ref: "#/components/parameters/siteCode"
      responses:
        "200":
          $ref: "#/components/responses/200_referentials_site"
        "400":
          $ref: "#/components/responses/400_referentials_site_get_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "404":
          $ref: "#/components/responses/404_referentials_site_not_found"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
    put:
      tags:
        - Referentials
      summary: Create or update a site
      description: |-
        Creates a new site if the `siteCode` provided does not exist, else
        updates the existing site.

        Rate limit range : Standard
      operationId: put-referentials-site
      parameters:
        - $ref: "#/components/parameters/siteCode"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Site"
            examples:
              New root site with all fields:
                $ref: "#/components/examples/NewRootSiteWithAllFields"
              New site with mandatory fields only:
                $ref: "#/components/examples/NewSiteWithMandatoryFieldsOnly"
              Update site with all fields:
                $ref: "#/components/examples/UpdateSiteWithAllFields"
              Update site with mandatory fields only:
                $ref: "#/components/examples/UpdateSiteWithMandatoryFieldsOnly"
              New sub site:
                $ref: "#/components/examples/NewSubSite"
      responses:
        "201":
          $ref: "#/components/responses/201_referentials_site_created"
        "204":
          $ref: "#/components/responses/204_referentials_site_updated"
        "400":
          $ref: "#/components/responses/400_referentials_site_put_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /eTech/rest/ws/referentials/v1/assets/code:{assetCode}:
    get:
      tags:
        - Referentials
      summary: Get an asset
      description: |-
        Return the asset object if the `assetCode` exists.

        Rate limit range : High
      operationId: get-referentials-asset
      parameters:
        - $ref: "#/components/parameters/assetCode"
      responses:
        "200":
          $ref: "#/components/responses/200_referentials_asset"
        "400":
          $ref: "#/components/responses/400_referentials_asset_get_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "404":
          $ref: "#/components/responses/404_referentials_asset_not_found"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
    put:
      tags:
        - Referentials
      summary: Create or update an asset
      description: >-
        Creates or updates an asset. Assets without sub-assets can be
        transferred via this endpoint. A separate `transferAsset` endpoint for
        moving parent assets and their sub-assets to another site or office is
        planned for a future release.


        Rate limit range: Standard
      operationId: put-referentials-asset
      parameters:
        - $ref: "#/components/parameters/assetCode"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Asset"
            examples:
              New Asset with all fields:
                $ref: "#/components/examples/NewAssetWithAllFields"
              New asset with mandatory fields only:
                $ref: "#/components/examples/NewAssetWithMandatoryFieldsOnly"
              Update asset with all fields:
                $ref: "#/components/examples/UpdateAssetWithAllFields"
              Update asset with mandatory fields only:
                $ref: "#/components/examples/UpdateAssetWithMandatoryFieldsOnly"
              New sub asset:
                $ref: "#/components/examples/NewSubAsset"
      responses:
        "201":
          $ref: "#/components/responses/201_referentials_asset_created"
        "204":
          $ref: "#/components/responses/204_referentials_asset_updated"
        "400":
          $ref: "#/components/responses/400_referentials_asset_put_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /eTech/rest/ws/businessOrganization/v1/items/code:{itemCode}:
    put:
      tags:
        - Business organization
      summary: Create or update an item
      description: |-
        Creates a new item if the `itemCode` provided does not exist, else
        updates the existing item.

        Rate limit range : Standard
      operationId: put-businessOrganization-item
      parameters:
        - $ref: "#/components/parameters/itemCode"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ItemRequest"
            examples:
              New item with all fields:
                $ref: "#/components/examples/NewItemWithAllFields"
              New item with mandatory fields only:
                $ref: "#/components/examples/NewItemWithMandatoryFieldsOnly"
              Update item with all fields:
                $ref: "#/components/examples/UpdateItemWithAllFields"
              Update item with mandatory fields only:
                $ref: "#/components/examples/UpdateItemWithMandatoryFieldsOnly"
              Item with no unit price:
                $ref: "#/components/examples/ItemWithNoUnitPrice"
      responses:
        "201":
          $ref: "#/components/responses/201_businessOrganization_item_created"
        "204":
          $ref: "#/components/responses/204_businessOrganization_item_updated"
        "400":
          $ref: "#/components/responses/400_businessOrganization_item_put_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
    get:
      tags:
        - Business organization
      summary: Get an item
      description: |-
        Return the item object if the `itemCode` exists.

        Rate limit range : High
      operationId: get-businessOrganization-item
      parameters:
        - $ref: "#/components/parameters/itemCode"
      responses:
        "200":
          $ref: "#/components/responses/200_businessOrganization_item"
        "400":
          $ref: "#/components/responses/400_businessOrganization_item_get_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "404":
          $ref: "#/components/responses/404_businessOrganization_item_not_found"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /eTech/rest/ws/businessOrganization/v1/items:
    get:
      tags:
        - Business organization
      summary: Get a list of items
      description: |-
        This API endpoint returns paginated lists of items. Data is sorted
        alphabetically by itemCode. Pagination is fixed at 200 objects per page.
        An empty response indicates the final page.

        Rate limit range : Low
      operationId: get-referentials-items
      parameters:
        - $ref: "#/components/parameters/continuationToken"
      responses:
        "200":
          $ref: "#/components/responses/200_businessOrganization_items"
        "400":
          $ref: "#/components/responses/400_businessOrganization_items_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /rest/ws/webhooks/v1/subscriptions:
    servers:
      - url: https://webhooks-production-1.praxedo.com
        description: EU servers URL
      - url: https://webhooks-production-2.praxedo.com
        description: AM2 server URL
      - url: https://webhooks-production-3.praxedo.com
        description: AM1 server URL
    post:
      x-state: Experimental
      tags:
        - Webhooks
      summary: Create a subscription
      description: Creates a new webhook subscription for specified event types.
      operationId: post-webhooks-subscriptions
      requestBody:
        required: true
        description: Request payload to create a webhook subscription.
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SubscriptionRequest"
            examples:
              SubscriptionRequest:
                $ref: "#/components/examples/SubscriptionRequest"
              SubscriptionRequestNoSecret:
                $ref: "#/components/examples/SubscriptionRequestNoSecret"
              SubscriptionRequestNoCustomHeaders:
                $ref: "#/components/examples/SubscriptionRequestNoCustomHeaders"
      responses:
        "201":
          $ref: "#/components/responses/201_webhooks_subscription_created"
        "400":
          $ref: "#/components/responses/400_webhooks_subscription_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "422":
          $ref: "#/components/responses/422_webhooks_subscription_unprocessable"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
    get:
      x-state: Experimental
      tags:
        - Webhooks
      summary: Get the list of subscriptions
      description: Retrieves a subscription list related to user's enterprise and
        belongs to his organizational unit.
      operationId: get-webhooks-subscriptions
      responses:
        "200":
          $ref: "#/components/responses/200_webhooks_subscriptions"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /rest/ws/webhooks/v1/subscriptions/{subscriptionId}:
    delete:
      x-state: Experimental
      tags:
        - Webhooks
      summary: Deletes a subscription.
      description: Delete a subscription related to user's enterprise and belongs to
        his organizational unit.
      operationId: delete-webhooks-subscription
      parameters:
        - $ref: "#/components/parameters/subscriptionId"
      responses:
        "200":
          $ref: "#/components/responses/200_webhooks_subscription_deleted"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "404":
          $ref: "#/components/responses/404_webhooks_subscription_not_found"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /eTech/rest/ws/scheduling/v1/workOrders/code:{workOrderCode}:
    get:
      tags:
        - Scheduling
      summary: Get scheduling data of a work order
      description: |-
        Returns the scheduling data for a work order identified by its
        **business code**, provided the work order status is **SCHEDULED or
        later**.

        Pair this endpoint with the `status.scheduled` webhook to react in
        near real-time when a work order is scheduled.

        Rate limit range : High
      operationId: get-scheduling-workOrderCode
      parameters:
        - $ref: "#/components/parameters/workOrderCode"
      responses:
        "200":
          $ref: "#/components/responses/200_scheduling_workOrder"
        "400":
          $ref: "#/components/responses/400_scheduling_workOrder_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "404":
          $ref: "#/components/responses/404_scheduling_workOrder_not_found"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /eTech/rest/ws/scheduling/v1/workOrders/uuid:{workOrderUuid}:
    get:
      tags:
        - Scheduling
      summary: Get scheduling data of a work order by uuid
      description: |-
        Returns the scheduling data for a work order identified by its
        **uuid**, provided the work order status is **SCHEDULED or
        later**.

        Pair this endpoint with the `status.scheduled` webhook to react in
        near real-time when a work order is scheduled.

        Rate limit range : High
      operationId: get-scheduling-workOrderUuid
      parameters:
        - $ref: "#/components/parameters/workOrderUuid"
      responses:
        "200":
          $ref: "#/components/responses/200_scheduling_workOrder"
        "400":
          $ref: "#/components/responses/400_scheduling_workOrder_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "404":
          $ref: "#/components/responses/404_scheduling_workOrder_not_found"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /eTech/rest/ws/scheduling/v1/workOrders/code:{workOrderCode}/schedule:
    put:
      tags:
        - Scheduling
      summary: Schedule a work order
      description: |-
        Schedules or reschedules a work order identified by its **business code** (time window and field resources), so it appears in the planning and on the mobile application.

        Rate limit range : Standard
      operationId: put-scheduling-workOrderCode-schedule
      parameters:
        - $ref: "#/components/parameters/workOrderCode"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/WorkOrderScheduleRequest"
            examples:
              Time range with crew:
                $ref: "#/components/examples/SchedulingScheduleTimeRangeRequest"
              Day range with crew:
                $ref: "#/components/examples/SchedulingScheduleDayRangeRequest"
              Single day without hours:
                $ref: "#/components/examples/SchedulingScheduleSingleDayRequest"
              Mandatory fields only (qualified work order):
                $ref: "#/components/examples/SchedulingScheduleMandatoryFieldsRequest"
              Reschedule skipping controls:
                $ref: "#/components/examples/SchedulingScheduleSkipControlsRequest"
              Change main resource only (pre-scheduled work order):
                $ref: "#/components/examples/SchedulingScheduleFieldResourcesOnlyRequest"
              Empty body (pre-scheduled work order):
                $ref: "#/components/examples/SchedulingScheduleEmptyRequest"
      responses:
        "201":
          $ref: "#/components/responses/201_scheduling_schedule_created"
        "204":
          $ref: "#/components/responses/204_scheduling_schedule_updated"
        "400":
          $ref: "#/components/responses/400_scheduling_schedule_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /eTech/rest/ws/scheduling/v1/workOrders/uuid:{workOrderUuid}/schedule:
    put:
      tags:
        - Scheduling
      summary: Schedule a work order by uuid
      description: |-
        Schedules or reschedules a work order identified by its **uuid** (time window and field resources), so it appears in the planning and on the mobile application.

        Rate limit range : Standard
      operationId: put-scheduling-workOrderUuid-schedule
      parameters:
        - $ref: "#/components/parameters/workOrderUuid"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/WorkOrderScheduleRequest"
            examples:
              Time range with crew:
                $ref: "#/components/examples/SchedulingScheduleTimeRangeRequest"
              Day range with crew:
                $ref: "#/components/examples/SchedulingScheduleDayRangeRequest"
              Single day without hours:
                $ref: "#/components/examples/SchedulingScheduleSingleDayRequest"
              Mandatory fields only (qualified work order):
                $ref: "#/components/examples/SchedulingScheduleMandatoryFieldsRequest"
              Reschedule skipping controls:
                $ref: "#/components/examples/SchedulingScheduleSkipControlsRequest"
              Change main resource only (pre-scheduled work order):
                $ref: "#/components/examples/SchedulingScheduleFieldResourcesOnlyRequest"
              Empty body (pre-scheduled work order):
                $ref: "#/components/examples/SchedulingScheduleEmptyRequest"
      responses:
        "201":
          $ref: "#/components/responses/201_scheduling_schedule_created"
        "204":
          $ref: "#/components/responses/204_scheduling_schedule_updated"
        "400":
          $ref: "#/components/responses/400_scheduling_schedule_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /eTech/rest/ws/fieldService/v1/workOrders/code:{workOrderCode}/items/used:
    get:
      tags:
        - Field Service
      summary: Get list of used items on a work order
      description: >-
        Returns a paginated list of used items (consumed parts, labour,
        on-the-fly items)

        declared on the specified work order, sorted by lastUpdate descending.


        Pair with the Praxedo webhook for near-real-time invoicing or stock
        synchronisation.


        Rate limit range : High
      operationId: get-fieldService-workOrderCode-usedItems
      parameters:
        - $ref: "#/components/parameters/workOrderCode"
        - $ref: "#/components/parameters/continuationToken"
        - $ref: "#/components/parameters/pageSize"
        - $ref: "#/components/parameters/invoiceMode"
      responses:
        "200":
          $ref: "#/components/responses/200_fieldService_usedItems"
        "400":
          $ref: "#/components/responses/400_fieldService_usedItems_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "404":
          $ref: "#/components/responses/404_fieldService_workOrder_not_found"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /eTech/rest/ws/fieldService/v1/workOrders/uuid:{workOrderUuid}/items/used:
    get:
      tags:
        - Field Service
      summary: Get list of used items on a work order by uuid
      description: >-
        Returns a paginated list of used items (consumed parts, labour,
        on-the-fly items)

        declared on the specified work order, sorted by lastUpdate descending.


        Pair with the Praxedo webhook for near-real-time invoicing or stock
        synchronisation.


        Rate limit range : High
      operationId: get-fieldService-workOrderUuid-usedItems
      parameters:
        - $ref: "#/components/parameters/workOrderUuid"
        - $ref: "#/components/parameters/continuationToken"
        - $ref: "#/components/parameters/pageSize"
        - $ref: "#/components/parameters/invoiceMode"
      responses:
        "200":
          $ref: "#/components/responses/200_fieldService_usedItems"
        "400":
          $ref: "#/components/responses/400_fieldService_usedItems_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "404":
          $ref: "#/components/responses/404_fieldService_workOrder_not_found"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /eTech/rest/ws/diagnostic/v1/workOrders/code:{workOrderCode}/notes/code:{noteCode}:
    put:
      tags:
        - Diagnostic
      summary: Create or update a note on a work order
      description: |-
        Creates a note on the work order if no note with `noteCode` exists yet,
        else updates the existing note's content / coordinates. Supports standard
        and custom notes. For custom notes tech visibility is always false.


        Rate limit range : Low
      operationId: put-diagnostic-workOrder-note
      parameters:
        - $ref: "#/components/parameters/workOrderCode"
        - $ref: "#/components/parameters/noteCode"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/WorkOrderNoteRequest"
            examples:
              Standard note:
                $ref: "#/components/examples/DiagnosticStandardNoteRequest"
              Incoming call note:
                $ref: "#/components/examples/DiagnosticIncomingCallNoteRequest"
              Outgoing call note:
                $ref: "#/components/examples/DiagnosticOutgoingCallNoteRequest"
              Report-based note - creation:
                $ref: "#/components/examples/DiagnosticReportBasedNoteCreateRequest"
              Report-based note - update:
                $ref: "#/components/examples/DiagnosticReportBasedNoteUpdateRequest"
      responses:
        "201":
          $ref: "#/components/responses/201_diagnostic_note_created"
        "204":
          $ref: "#/components/responses/204_diagnostic_note_updated"
        "400":
          $ref: "#/components/responses/400_diagnostic_note_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /eTech/rest/ws/diagnostic/v1/workOrders/uuid:{workOrderUuid}/notes/code:{noteCode}:
    put:
      tags:
        - Diagnostic
      summary: Create or update a note on a work order by uuid
      description: |-
        Creates a note on the work order if no note with `noteCode` exists yet,
        else updates the existing note's content / coordinates. Supports standard
        and custom notes. For custom notes tech visibility is always false.


        Rate limit range : Low
      operationId: put-diagnostic-workOrderUuid-note
      parameters:
        - $ref: "#/components/parameters/workOrderUuid"
        - $ref: "#/components/parameters/noteCode"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/WorkOrderNoteRequest"
            examples:
              Standard note:
                $ref: "#/components/examples/DiagnosticStandardNoteRequest"
              Incoming call note:
                $ref: "#/components/examples/DiagnosticIncomingCallNoteRequest"
              Outgoing call note:
                $ref: "#/components/examples/DiagnosticOutgoingCallNoteRequest"
              Report-based note - creation:
                $ref: "#/components/examples/DiagnosticReportBasedNoteCreateRequest"
              Report-based note - update:
                $ref: "#/components/examples/DiagnosticReportBasedNoteUpdateRequest"
      responses:
        "201":
          $ref: "#/components/responses/201_diagnostic_note_created"
        "204":
          $ref: "#/components/responses/204_diagnostic_note_updated"
        "400":
          $ref: "#/components/responses/400_diagnostic_note_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /eTech/rest/ws/diagnostic/v1/workOrders/code:{workOrderCode}/flags:
    put:
      tags:
        - Diagnostic
      summary: Update flags on a work order
      description: |-
        Replaces the full set of flags on a work order identified by its
        **business code**. The work order can be at any status. The provided
        list fully overrides the existing flags; an empty array clears all
        flags.


        Rate limit range : High
      operationId: put-diagnostic-workOrder-flags
      parameters:
        - $ref: "#/components/parameters/workOrderCode"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/WorkOrderFlagsRequest"
            examples:
              Set flags:
                $ref: "#/components/examples/DiagnosticSetWorkOrderFlagsRequest"
              Clear all flags:
                $ref: "#/components/examples/DiagnosticClearWorkOrderFlagsRequest"
      responses:
        "204":
          $ref: "#/components/responses/204_diagnostic_flags_updated"
        "400":
          $ref: "#/components/responses/400_diagnostic_flags_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /eTech/rest/ws/diagnostic/v1/workOrders/uuid:{workOrderUuid}/flags:
    put:
      tags:
        - Diagnostic
      summary: Update flags on a work order by uuid
      description: |-
        Replaces the full set of flags on a work order identified by its
        **uuid**. The work order can be at any status. The provided list fully
        overrides the existing flags; an empty array clears all flags.


        Rate limit range : High
      operationId: put-diagnostic-workOrderUuid-flags
      parameters:
        - $ref: "#/components/parameters/workOrderUuid"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/WorkOrderFlagsRequest"
            examples:
              Set flags:
                $ref: "#/components/examples/DiagnosticSetWorkOrderFlagsRequest"
              Clear all flags:
                $ref: "#/components/examples/DiagnosticClearWorkOrderFlagsRequest"
      responses:
        "204":
          $ref: "#/components/responses/204_diagnostic_flags_updated"
        "400":
          $ref: "#/components/responses/400_diagnostic_flags_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /eTech/rest/ws/projectManagement/v1/projects/code:{projectCode}/link:
    post:
      tags:
        - Project management
      summary: Link a work order to a project
      description: |-
        Links a stand-alone work order to a **project**, or moves it to another position within the project it already sits in, and declares the dependencies it takes on among the project's jobs. One work order is processed per call.

        **Rules**
        - The project must be filed at or above the office of the work order, and must not be completed.
        - The work order can be linked at any status.
        - A work order already in this project can be sent again to change its position. A work order held by another project leaves it to join this one, unless that other project is completed.
        - A work order or a project outside the hierarchy of the OAuth2 application is reported as unknown.
        - When a code is carried by a validated work order and a live one, the live one is linked. When several non-validated work orders carry the code, the call is refused as ambiguous.

        Unlinking is not covered by this endpoint.

        Rate limit range : High
      operationId: post-projectManagement-project-link
      parameters:
        - $ref: "#/components/parameters/projectCode"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/WorkOrderProjectLinkRequest"
            examples:
              Link last in the project:
                $ref: "#/components/examples/ProjectManagementProjectLinkLastRequest"
              Link at an index:
                $ref: "#/components/examples/ProjectManagementProjectLinkAtIndexRequest"
              Link after a task:
                $ref: "#/components/examples/ProjectManagementProjectLinkAfterTaskRequest"
              Link before a phase:
                $ref: "#/components/examples/ProjectManagementProjectLinkBeforePhaseRequest"
              Link with dependencies:
                $ref: "#/components/examples/ProjectManagementProjectLinkWithDependenciesRequest"
              Mandatory fields only:
                $ref: "#/components/examples/ProjectManagementProjectLinkMandatoryFieldsRequest"
      responses:
        "204":
          $ref: "#/components/responses/204_projectManagement_workOrder_linked"
        "400":
          $ref: "#/components/responses/400_projectManagement_project_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /eTech/rest/ws/projectManagement/v1/routeServiceOrders/code:{routeServiceOrderCode}/link:
    post:
      tags:
        - Project management
      summary: Link a work order to a route service order
      description: |-
        Links a stand-alone work order to a **route service order** ("tournée"), or moves it to another position within the service order it already sits in. One work order is processed per call.

        A route is scheduled and performed as a round of its own, so two extra rules apply:
        - the work order must be **qualified**. A work order already carried by a (pre-)scheduled route is no longer qualified, so it cannot be repositioned or moved from there;
        - the work order must not already be assigned to technicians other than the ones of the route.

        When the route is already scheduled or pre-scheduled, the work order is scheduled from the route (dates and technicians of the round).

        **Rules**
        - The route must be filed at or above the office of the work order, and must not be completed or validated.
        - A work order already in a service order can be sent again to move it. The service order it leaves must accept to let it go.
        - A work order or a service order outside the hierarchy of the OAuth2 application is reported as unknown. A code designating a standard or multi-equipment service order is reported as unknown too.

        Unlinking is not covered by this endpoint.

        Rate limit range : High
      operationId: post-projectManagement-routeServiceOrder-link
      parameters:
        - $ref: "#/components/parameters/routeServiceOrderCode"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/WorkOrderServiceOrderLinkRequest"
            examples:
              Link last in the service order:
                $ref: "#/components/examples/ProjectManagementServiceOrderLinkLastRequest"
              Link first in the service order:
                $ref: "#/components/examples/ProjectManagementServiceOrderLinkFirstRequest"
              Link at an index:
                $ref: "#/components/examples/ProjectManagementServiceOrderLinkAtIndexRequest"
              Link after another work order:
                $ref: "#/components/examples/ProjectManagementServiceOrderLinkAfterRequest"
      responses:
        "204":
          $ref: "#/components/responses/204_projectManagement_workOrder_linked"
        "400":
          $ref: "#/components/responses/400_projectManagement_routeServiceOrder_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
  /eTech/rest/ws/projectManagement/v1/standardServiceOrders/code:{standardServiceOrderCode}/link:
    post:
      tags:
        - Project management
      summary: Link a work order to a standard service order
      description: |-
        Links a stand-alone work order to a **standard service order**, or moves it to another position within the service order it already sits in. One work order is processed per call.

        A standard service order only groups work orders for tracking: it takes a work order on at any status, whoever it is assigned to.

        **Rules**
        - The service order must be filed at or above the office of the work order, and must not be completed or validated.
        - A work order already in a service order can be sent again to move it. The service order it leaves must accept to let it go.
        - A work order or a service order outside the hierarchy of the OAuth2 application is reported as unknown. A code designating a route or multi-equipment service order is reported as unknown too.

        Unlinking is not covered by this endpoint.

        Rate limit range : High
      operationId: post-projectManagement-standardServiceOrder-link
      parameters:
        - $ref: "#/components/parameters/standardServiceOrderCode"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/WorkOrderServiceOrderLinkRequest"
            examples:
              Link last in the service order:
                $ref: "#/components/examples/ProjectManagementServiceOrderLinkLastRequest"
              Link first in the service order:
                $ref: "#/components/examples/ProjectManagementServiceOrderLinkFirstRequest"
              Link at an index:
                $ref: "#/components/examples/ProjectManagementServiceOrderLinkAtIndexRequest"
              Link after another work order:
                $ref: "#/components/examples/ProjectManagementServiceOrderLinkAfterRequest"
      responses:
        "204":
          $ref: "#/components/responses/204_projectManagement_workOrder_linked"
        "400":
          $ref: "#/components/responses/400_projectManagement_standardServiceOrder_bad_request"
        "401":
          $ref: "#/components/responses/401_unauthorized"
        "403":
          $ref: "#/components/responses/403_forbidden"
        "429":
          $ref: "#/components/responses/429_too_many_requests"
        "500":
          $ref: "#/components/responses/500_internal_server_error"
webhooks:
  workorder.validation:
    post:
      tags:
        - Diagnostic
      summary: Work order validated
      description: Sent when a work order is validated. Validation often triggers the invoicing process in the customer ERP/CRM.
      operationId: webhook-workorder-validation
      security: []
      parameters:
        - $ref: "#/components/parameters/XPraxedoEvent"
        - $ref: "#/components/parameters/XPraxedoSecret"
      requestBody:
        required: true
        description: Callback payload sent to your subscription's callback URL.
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/WorkOrderValidationEvent"
            examples:
              WorkOrderValidationEvent:
                $ref: "#/components/examples/WorkOrderValidationEvent"
      responses:
        "200":
          description: Return a 200 status to acknowledge the callback was received. Acknowledge
            immediately and process the notification asynchronously to avoid a
            time-out (5 seconds).
  workorder.deletion:
    post:
      tags:
        - Diagnostic
      summary: Work order deleted
      description: Sent when a work order is deleted from the Praxedo user interface or the SOAP web service.
      operationId: webhook-workorder-deletion
      security: []
      parameters:
        - $ref: "#/components/parameters/XPraxedoEvent"
        - $ref: "#/components/parameters/XPraxedoSecret"
      requestBody:
        required: true
        description: Callback payload sent to your subscription's callback URL.
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/WorkOrderDeletionEvent"
            examples:
              WorkOrderDeletionEvent:
                $ref: "#/components/examples/WorkOrderDeletionEvent"
      responses:
        "200":
          description: Return a 200 status to acknowledge the callback was received. Acknowledge
            immediately and process the notification asynchronously to avoid a
            time-out (5 seconds).
  asset.upsert:
    post:
      tags:
        - Referentials
      summary: Asset created or updated
      description: Sent when an asset is created or updated from the Praxedo interface,
        the SOAP/REST web services, or the mobile application. This event does
        not distinguish between an asset creation and an asset update — treat
        an asset code you don't recognize as a new creation.
      operationId: webhook-asset-upsert
      security: []
      parameters:
        - $ref: "#/components/parameters/XPraxedoEvent"
        - $ref: "#/components/parameters/XPraxedoSecret"
      requestBody:
        required: true
        description: Callback payload sent to your subscription's callback URL.
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/AssetUpsertEvent"
            examples:
              AssetUpsertEvent:
                $ref: "#/components/examples/AssetUpsertEvent"
      responses:
        "200":
          description: Return a 200 status to acknowledge the callback was received. Acknowledge
            immediately and process the notification asynchronously to avoid a
            time-out (5 seconds).
components:
  securitySchemes:
    BearerAuthentication:
      scheme: bearer
      type: http
      description: Bearer tokens are usually generated by Auth server.
  parameters:
    technicianCode:
      name: technicianCode
      in: path
      required: true
      description: Business code of the technician.
      schema:
        type: string
      example: DHAJJAR
    workOrderCode:
      name: workOrderCode
      in: path
      required: true
      description: Business code of the work order. Case insensitive.
      schema:
        type: string
      example: WO-2026-00123
    workOrderUuid:
      name: workOrderUuid
      in: path
      required: true
      description: Uuid of the work order.
      schema:
        type: string
        format: uuid
      example: 550e8400-e29b-41d4-a716-446655440000
    customerCode:
      name: customerCode
      description: Requested customer code, case insensitive.
      in: path
      required: true
      schema:
        type: string
      examples:
        Customer Code:
          value: customer-123456
        Customer Code with space:
          value: customer 123456
        Customer Code with special character:
          value: customer-%123456
    siteCode:
      name: siteCode
      description: Requested site code, case insensitive.
      in: path
      required: true
      schema:
        type: string
      examples:
        Site Code:
          value: site-123456
        Site Code with space:
          value: site 123456
        Site Code with special character:
          value: site-%123456
    assetCode:
      name: assetCode
      description: Requested asset code, case insensitive.
      in: path
      required: true
      schema:
        type: string
      examples:
        Asset Code:
          value: asset-123456
        Asset Code with space:
          value: asset 123456
        Asset Code with special character:
          value: asset-%123456
    itemCode:
      name: itemCode
      description: Requested item code, case insensitive.
      in: path
      required: true
      schema:
        type: string
      examples:
        Item Code:
          value: item-123456
        Item Code with space:
          value: item 123456
        Item Code with special character:
          value: item-%123456
    subscriptionId:
      name: subscriptionId
      in: path
      required: true
      description: The ID of the subscription to delete.
      schema:
        type: string
      examples:
        SubscriptionIdExample:
          value: WEHS_251119133313_DXSAZH
    skillCode:
      name: skillCode
      description: Code of the skill. Case insensitive.
      in: path
      required: true
      schema:
        type: string
        minLength: 1
        maxLength: 10
      examples:
        Simple skill code:
          value: FIBER
        Skill code with special characters:
          value: "%FIBER"
    noteCode:
      name: noteCode
      in: path
      required: true
      description: Business code of the note provided by tierce app.
      schema:
        type: string
      example: MAESTRO-NOTE-77213
    positionsStartDate:
      name: startDate
      in: query
      required: true
      description: Retrieve positions recorded from this date-time (ISO-8601 UTC).
      schema:
        type: string
        format: date-time
    validationStatus:
      name: validationStatus
      in: query
      schema:
        type: string
        enum:
          - validated
          - notValidated
          - all
        default: all
    invoicingStatus:
      name: invoicingStatus
      in: query
      schema:
        type: string
        enum:
          - billable
          - notBillable
          - all
        default: all
    continuationToken:
      name: continuationToken
      in: query
      description: The continuation token which was received in the previous request.
        It contains information on the page to fetch. If not present, then
        the first page of results will be returned.
      schema:
        type: string
      examples:
        Page:
          value: c2FqZGhmYmtrMzQ1YiBrZiA5MyBrYmdrcTg3MjMgazg5bm4gICAwNCAgbmVpcnQ4NzkzbiBnb3A4NA
        Last page:
          value: ""
    invoiceMode:
      name: invoiceMode
      in: query
      required: false
      description: >-
        Filter items by billing ownership.

        - `external` - items charged to an external party (customer-facing
        invoice).

        - `internal` - items consumed internally (sub-contractor or internal
        cost).

        - `all` - no filter, returns all items regardless of invoice mode
        (default).
      schema:
        type: string
        enum:
          - external
          - internal
          - all
        default: all
    pageSize:
      name: pageSize
      in: query
      required: false
      description: Maximum number of items returned per page. Hard limit 200.
      schema:
        type: integer
        minimum: 1
        maximum: 200
        default: 200
    XPraxedoEvent:
      name: x-praxedo-event
      in: header
      required: true
      description: The event type carried by this callback.
      schema:
        type: string
      example: workorder.deletion
    XPraxedoSecret:
      name: x-praxedo-secret
      in: header
      required: false
      description: The custom security header defined when the subscription was
        created, used to verify the callback's authenticity. Null if none was
        set.
      schema:
        type: string
        nullable: true
    projectCode:
      name: projectCode
      in: path
      required: true
      description: Business code (number) of the project.
      schema:
        type: string
        maxLength: 50
      example: PRJ-2026-0007
    routeServiceOrderCode:
      name: routeServiceOrderCode
      in: path
      required: true
      description: Business code of the route service order.
      schema:
        type: string
      example: SO-2026-0042
    standardServiceOrderCode:
      name: standardServiceOrderCode
      in: path
      required: true
      description: Business code of the standard service order.
      schema:
        type: string
      example: SO-2026-0043
    crewsStartDate:
      name: startDate
      in: query
      required: true
      description: Start of the requested period, inclusive. RFC 3339 date-time with an offset.
      schema:
        type: string
        format: date-time
      example: 2026-09-21T00:00:00Z
    crewsEndDate:
      name: endDate
      in: query
      required: true
      description: >-
        End of the requested period, exclusive. RFC 3339 date-time with an offset. Must be after `startDate`, at most
        366 days later.
      schema:
        type: string
        format: date-time
      example: 2026-09-26T00:00:00Z
    crewsSize:
      name: size
      in: query
      required: false
      description: Maximum number of crews returned per page. A value above 200 is capped to 200.
      schema:
        type: integer
        minimum: 1
        maximum: 200
        default: 200
  schemas:
    ItemRequest:
      description: Payload for creating or updating an item.
      type: object
      required:
        - itemCode
        - name
        - itemCategoryCode
        - dimensions
        - attributes
        - billingParameters
      properties:
        itemCode:
          description: Item code. Case insensitive. Must match the path parameter.
          type: string
          maxLength: 256
          readOnly: true
        name:
          description: Item name.
          type: string
          maxLength: 256
          minLength: 1
        reference:
          description: Item internal reference code (for catalog search purpose).
          type:
            - string
            - "null"
          maxLength: 256
        itemCategoryCode:
          description: Item's category code. Case insensitive.
          type: string
          maxLength: 256
          minLength: 1
        description:
          description: Item detailed description.
          type:
            - string
            - "null"
          maxLength: 10000
        barCode:
          description: Item barcode value associated with the item (for catalog search
            purpose).
          type:
            - string
            - "null"
          maxLength: 100
        manufacturer:
          description: Item's manufacturer.
          type:
            - string
            - "null"
          maxLength: 100
        dimensions:
          description: Indicates how many dimensions the item has (length x width x height).
          type: integer
          enum:
            - 1
            - 2
            - 3
        attributes:
          type: object
          required:
            - isGeneric
            - isParentItem
            - hasFixedQuantity
            - availableOnMobile
          properties:
            isGeneric:
              description: Indicates if the item is a generic type.
              type: boolean
            isParentItem:
              description: Indicates if the item is a parent item.
              type: boolean
            hasFixedQuantity:
              description: Indicates that the item is actually a prestation with a negociated
                price (quantity fixed to 1).
              type: boolean
            availableOnMobile:
              description: Indicates if the item is available on the mobile app.
              type: boolean
        tracking:
          description: Details about how the item is tracked.
          type: object
          properties:
            trackedInStock:
              description: Indicates that item availability is tracked in field resource's
                stock. Only available if stock management is activated.
              type: boolean
            serialNumberFormat:
              description: Regular expression that defines the structure of the item's
                tracking number. If absent, then items are not tracked by serial
                number.
              type:
                - string
                - "null"
              maxLength: 100
        billingParameters:
          description: Pricing information and invoicing details.
          type: object
          required:
            - invoiceMode
          properties:
            priceDetails:
              type: object
              properties:
                unitPrice:
                  description: >
                    Item price. If 0 or null, vatRates, displayPriceOnMobile and
                    displayPriceOnWeb must be null.
                  type:
                    - number
                    - "null"
                  minimum: 0
                vatRates:
                  description: Tax rates applicable to the item. Must be null when unitPrice is 0
                    or null.
                  type:
                    - array
                    - "null"
                  items:
                    type: number
                    minimum: 0
                    maximum: 0.99999
                displayPriceOnMobile:
                  description: Specifies whether the price should be displayed on mobile devices.
                    Must be null when unitPrice is 0 or null.
                  type:
                    - boolean
                    - "null"
                displayPriceOnWeb:
                  description: Whether the price is displayed for web users. Must be null when
                    unitPrice is 0 or null.
                  type:
                    - string
                    - "null"
                  enum:
                    - ALWAYS
                    - BY_PROFILE
                    - null
            invoiceMode:
              description: The type of invoicing (if the item belong to your company or not).
              type: string
              enum:
                - INTERNAL
                - EXTERNAL
        customFields:
          $ref: "#/components/schemas/ItemCustomFields"
    PositionListResponse:
      type: object
      required:
        - data
      properties:
        continuationToken:
          type: string
          nullable: true
        data:
          type: array
          items:
            $ref: "#/components/schemas/Position"
    Position:
      type: object
      properties:
        latitude:
          type: number
          format: double
          example: 48.8566
        longitude:
          type: number
          format: double
          example: 2.3522
        timestamp:
          type: string
          format: date-time
          example: 2025-10-25T08:05:00Z
    ActivityListResponse:
      type: object
      required:
        - data
      properties:
        continuationToken:
          type: string
          nullable: true
        data:
          type: array
          items:
            $ref: "#/components/schemas/Activity"
    Activity:
      type: object
      properties:
        activityId:
          type: string
          format: uuid
        activityTypeCode:
          type: string
          example: WORK
        agentCode:
          type: string
          example: TECH-023
        startTime:
          type: string
          format: date-time
        endTime:
          type: string
          format: date-time
        duration:
          type: string
          description: Duration of the activity, in ISO-8601 duration format.
          example: PT1H30M
          pattern: PnDTnHnMn.nS.
        billable:
          type: boolean
        validatedAt:
          type: string
          format: date-time
          nullable: true
        lastUpdate:
          type: string
          format: date-time
    AdditionalSkillsRequirement:
      allOf:
        - $ref: "#/components/schemas/SkillsRequirement"
        - type: object
          properties:
            additionalSkills:
              type: array
              items:
                type: object
                required:
                  - code
                  - constraint
                properties:
                  code:
                    type: string
                    example: skillCode
                  constraint:
                    type: string
                    enum:
                      - MANDATORY
                      - OPTIONAL
                    description: Constant value indicated whether a skill is mandatory. Possible
                      values are MANDATORY or OPTIONAL.
              description: Adds these skills requirements to the one defined by the work order
                type.
    Availabilities:
      type: object
    AvailableForRendezVous:
      allOf:
        - $ref: "#/components/schemas/Availabilities"
        - type: object
          properties:
            appointmentDate:
              type: string
              format: date-time
              description: Date time in ISO format indicating the specific date and hour the
                slot search will be on.
              example: 2023-08-03T06:00:00.000Z
              pattern: yyyy-MM-dd'T'HH:mm:ss.SSSZ
      required:
        - appointmentDate
    AvailableOverTimeRanges:
      allOf:
        - $ref: "#/components/schemas/Availabilities"
        - type: object
          properties:
            ranges:
              type: array
              items:
                $ref: "#/components/schemas/OffsetTimeInterval"
      required:
        - ranges
    Circle:
      type: object
      description: The circle zone describing the working area of the work order.
      properties:
        radius:
          $ref: "#/components/schemas/Distance"
          description: The radius of this circle area.
        center:
          $ref: "#/components/schemas/Coordinates"
          description: The center of this circle area.
      required:
        - center
        - radius
    Coordinates:
      type: object
      properties:
        latitude:
          type: number
          format: double
          description: WGS84 latitude of the coordinates.
          example: 48.8755905
        longitude:
          type: number
          format: double
          description: WGS84 longitude of the coordinates.
          example: 2.3287881
      required:
        - latitude
        - longitude
    DispatchLocation:
      type: object
    DispatchRequirement:
      type: object
      properties:
        maximumDistanceToLocation:
          $ref: "#/components/schemas/DistanceToLocation"
          description: Filters out field resources that are too distant from the dispatch
            location.
        maximumTravelTimeToLocation:
          type: string
          description: Filter out slots that would imply the field resource to travel more
            than this duration.
          example: PT1H5M
          pattern: PnDTnHnMn.nS.
        maximumAddedTravelTime:
          type: string
          description: Ignore slots for which the travel time exceeds the travel time
            allowed for this day, taking into account the value in
            maximumAddedTravelTime.
          example: PT1H5M
          pattern: PnDTnHnMn.nS.
    Distance:
      type: object
      properties:
        value:
          type: number
          format: double
          description: The distance value.
          example: 1.54
        unit:
          type: string
          description: The distance unit.
          enum:
            - KILOMETERS
            - METERS
            - INTERNATIONAL_MILES
      required:
        - unit
        - value
    DistanceToLocation:
      type: object
      description: Filters out field resources that are too distant from the dispatch
        location.
      properties:
        value:
          type: number
          format: double
          description: The distance value.
          example: 1.54
        unit:
          type: string
          description: The distance unit.
          enum:
            - KILOMETERS
            - METERS
            - INTERNATIONAL_MILES
      required:
        - unit
        - value
    EndCustomer:
      type: object
      properties:
        need:
          $ref: "#/components/schemas/Need"
        availabilities:
          oneOf:
            - $ref: "#/components/schemas/AvailableForRendezVous"
            - $ref: "#/components/schemas/AvailableOverTimeRanges"
      required:
        - availabilities
        - need
    EnumeratedStartingHoursRequirement:
      allOf:
        - $ref: "#/components/schemas/SlotStartingHoursRequirement"
        - type: object
          properties:
            values:
              type: array
              items:
                type: string
                description: A valid starting slot hour.
                example: 08:00
      required:
        - values
    GeographicLocation:
      allOf:
        - $ref: "#/components/schemas/DispatchLocation"
        - type: object
          properties:
            coordinates:
              $ref: "#/components/schemas/Coordinates"
              description: WGS84 Geographic coordinates.
      required:
        - coordinates
    HierarchicalRequirements:
      type: object
      properties:
        customerPortalUser:
          type: string
          description: The customer portal user who asks for the dispatching. All slots
            will match a time slot linked to this customer portal user.
          example: TISSEN_GROUP
        offices:
          type: array
          default: Root office of the enterprise
          description: The list of offices from which field resources can be dispatched to
            this work order.
          items:
            type: object
            properties:
              code:
                type: string
                example: PARIS_NORD
                description: The code of an office from which field resources can be dispatched
                  to this work order.
        childrenOfficesIncluded:
          type: boolean
          default: "true"
          description: Whether the children offices of the offices indicated are part of
            the slot search, or only the given offices are targeted. If true,
            children offices in the office hierarchy are eligible to dispatch a
            field resource to perform the work order.
          example: true
    Need:
      type: object
      properties:
        workOrder:
          type: object
          properties:
            code:
              type: string
              example: MAINTENANCE
          description: The code of the work order type for which to look for slots.
        overrides:
          $ref: "#/components/schemas/Overrides"
          description: Replaces default values defined in the work order, regarding the
            duration and skill requirements, by custom ones for this search.
        dispatchLocation:
          description: The location of the work order to be scheduled.
          oneOf:
            - $ref: "#/components/schemas/GeographicLocation"
            - $ref: "#/components/schemas/PostalLocation"
      required:
        - dispatchLocation
        - workOrder
    OffsetTimeInterval:
      type: object
      properties:
        start:
          type: string
          format: date-time
          description: Date time in ISO format indicating the start of the time range.
          example: 2023-08-03T06:00:00.000Z
          pattern: yyyy-MM-dd'T'HH:mm:ss.SSSZ
        end:
          type: string
          format: date-time
          description: Date time with offset indicating the end of the time range.
          example: 2023-08-03T07:00:00.000Z
          pattern: yyyy-MM-dd'T'HH:mm:ss.SSSZ
      required:
        - end
        - start
    OverlapStartingHoursRequirement:
      allOf:
        - $ref: "#/components/schemas/SlotStartingHoursRequirement"
    OverriddenSkillsRequirement:
      allOf:
        - $ref: "#/components/schemas/SkillsRequirement"
        - type: object
          properties:
            additionalSkills:
              type: array
              items:
                type: object
                required:
                  - code
                  - constraint
                properties:
                  code:
                    type: string
                    example: skillCode
                  constraint:
                    type: string
                    enum:
                      - MANDATORY
                      - OPTIONAL
                    description: Constant value indicated whether a skill is mandatory. Possible
                      values are MANDATORY or OPTIONAL.
              description: Replaces these skills requirements to the one defined by the work
                order type.
    Overrides:
      type: object
      properties:
        duration:
          type: string
          description: Replaces the forecast duration of the work order which is the
            subject of the slot search, in ISO-8601 duration format.
          example: PT1H30M
          pattern: PnDTnHnMn.nS.
        skillsRequirement:
          oneOf:
            - $ref: "#/components/schemas/AdditionalSkillsRequirement"
            - $ref: "#/components/schemas/OverriddenSkillsRequirement"
    PatternBasedStartingHoursRequirement:
      allOf:
        - $ref: "#/components/schemas/SlotStartingHoursRequirement"
        - type: object
          properties:
            pattern:
              type: string
              default: HALF
              description: Define a pattern for the hour at which the returned slots should
                start.
              enum:
                - QUARTER
                - HALF
                - HOUR
              example: QUARTER
      required:
        - pattern
    PostalLocation:
      allOf:
        - $ref: "#/components/schemas/DispatchLocation"
        - type: object
          properties:
            address:
              type: string
              description: Free text description of the address. This adress will be converted
                into a Geographic Location thanks to a geocoding system. To be
                accurate, the ZIP code should be included in the search The
                counctry may also help.
              example: 28 rue de Mogador, 75019 Paris
      required:
        - address
    ScheduleRequirements:
      type: object
      properties:
        inArea:
          $ref: "#/components/schemas/WorkingAreaRequirement"
          description: Allows to filter the field resources that can perform the work
            order, based on geographical constraints.
        nearDispatchLocation:
          $ref: "#/components/schemas/DispatchRequirement"
          description: Allows to filter the field resources that can perform the work
            order, based on travel time/distance constraints and according to
            their current schedule.
    SchedulerRequirements:
      type: object
      properties:
        fieldResourceScheduled:
          $ref: "#/components/schemas/ScheduleRequirements"
        fieldResourceWorkingFor:
          $ref: "#/components/schemas/HierarchicalRequirements"
        workingHours:
          $ref: "#/components/schemas/WorkingHourRequirements"
    SearchSize:
      type: object
      properties:
        maximumSlotNumber:
          type: integer
          format: int32
          default: "700"
          description: The maximum number of slots to return.
          example: 100
    ServedSlotRequirements:
      type: object
      properties:
        perTimeInterval:
          type: string
          default: BEST
          description: >
            Allows to configure the slot sampling policy. Defining a sampling
            policy is required in case:
             - there are many field resources that can carry out the work order
             - the slot search time range is too big

            Otherwise, all slots will be grouped at the start of the slot search
            range.
          enum:
            - BEST
            - FEW
            - ALL
        startingHours:
          description: Allows to configure which slots to return based on their starting
            hour.
          oneOf:
            - $ref: "#/components/schemas/EnumeratedStartingHoursRequirement"
            - $ref: "#/components/schemas/OverlapStartingHoursRequirement"
            - $ref: "#/components/schemas/PatternBasedStartingHoursRequirement"
    SkillsRequirement:
      type: object
    SlotQuery:
      type: object
      properties:
        endCustomer:
          $ref: "#/components/schemas/EndCustomer"
        schedulerRequirements:
          $ref: "#/components/schemas/SchedulerRequirements"
        slotSearchConfiguration:
          $ref: "#/components/schemas/SlotSearchConfiguration"
      required:
        - endCustomer
    SlotSearchConfiguration:
      type: object
      properties:
        searchSize:
          $ref: "#/components/schemas/SearchSize"
          description: Allows to limit the search space size beyond the default
            configuration, lowering the number of results and speeding up the
            computation.
        servedSlots:
          $ref: "#/components/schemas/ServedSlotRequirements"
          description: Allows to configure some aspects of the slots in the result.
        mustExplainResults:
          type: boolean
          writeOnly: true
    SlotStartingHoursRequirement:
      type: object
      properties:
        allowSlotOverlap:
          type: boolean
          default: "false"
          description: >
            Constraints the slots to be served by the web service.

            If set to false, the slots cannot overlap.

            For instance, when looking for a one hour long slot, with slots
            starting every half hour,

            in case a slot is found at 08:30, then even if a slot exists at
            09:00, the following returned slot

            will only be one that starts at 09:30, at the end of the first slot.
    WorkingAreaRequirement:
      type: object
      properties:
        circle:
          $ref: "#/components/schemas/Circle"
          description: The circle zone describing the working area of the work order.
        zipZone:
          $ref: "#/components/schemas/ZipZone"
          description: The zone described by a zip code for the working area of the work
            order.
    WorkingHourRequirements:
      type: object
      properties:
        ignoreFieldResourceOwnWorkingHours:
          type: boolean
          default: "false"
          description: Considers that the field resource's working time is the same as the
            hours defined at the company level. In consequence, it can return
            time slots that do not respect the custom working hours of the field
            resource.
        ignoreFieldResourceBreak:
          type: boolean
          default: "false"
          description: Ignores the field resources' break, returning slots that run
            through it.
        ignoreFieldResourceCapacityModel:
          type: boolean
          default: 'false'
          description:
            Ignores the field ressources' capacity models in the returned slots calculation.
    ZipZone:
      type: object
      description: The zone described by a zip code for the working area of the work order.
      properties:
        zipCode:
          type: string
          description: Postal/ZIP code of the dispatch location. Only field resources set
            as available to work in this area can be dispatched to this area.
          example: 77019
        areaScope:
          type: string
          default: RESOURCE
          description: "Defines the level at which the ZIP code filter is applied:
            *'RESOURCE': Returns slots for resources whose area, defined on
            their details page, matches the requested zipCode. *'TIMESLOT':
            Returns slots only if the resource has a reserved time slot with an
            area matching the zipCode."
          enum:
            - TIMESLOT
            - RESOURCE
      required:
        - zipCode
    SlotSearchResult:
      type: object
      properties:
        slots:
          type: array
          items:
            $ref: "#/components/schemas/Slot"
        searchReport:
          type: string
          description: A text detailing the steps taken while looking for a slot. Might
            prove useful to understand why a given resource unexpectedly
            has/miss slots. This is for manually diagnosing issues. The format
            of this field is submit to change at any given time. Do not parse
            it.
    Slot:
      type: object
      properties:
        start:
          type: string
          format: date-time
          description: Date time in ISO format indicating the start of the time interval.
          example: 2023-08-03T06:00:00.000Z
          pattern: yyyy-MM-dd'T'HH:mm:ss.SSSZ
        end:
          type: string
          format: date-time
          description: Date time in ISO format indicating the end of the time interval.
          example: 2023-08-03T06:00:00.000Z
          pattern: yyyy-MM-dd'T'HH:mm:ss.SSSZ
        fieldResources:
          type: array
          items:
            $ref: "#/components/schemas/FieldResource"
        availableResourceCount:
          type: integer
          description: The number of available resources on this time interval.
    FieldResource:
      type: object
      properties:
        fieldResource:
          type: object
          description: The code of an available field resource.
          properties:
            code: string
        teamSize:
          type: integer
          description: The size of the field resource's team, if they're a team leader.
        availableTeammates:
          type: array
          items:
            type: object
            properties:
              code: string
          description: "The list of the available teammates on that time interval : the
            teammates shown are ones that are available and respect all the
            necessary conditions (skills, distance or travel time filter,
            etc..)."
        hasActivatedSubscription:
          type: string
          description: Whether the field resource has an active subscription or not.
        quality:
          type:
            $ref: "#/components/schemas/Quality"
          description: The quality of the slot for this field resource.
    Quality:
      type: object
      description: The quality of the slot for this field resource
      properties:
        score:
          type: double
          description: The score of the slot.
        optionalSkillCount:
          type: integer
          description: The number of work order's unneeded skills the field resource has.
        addedTravelTime:
          type: string
          example: PT1H30M
          pattern: PnDTnHnMn.nS.
          description: The added travel time to the field resource's tour that this slot
            would imply.
        travelTimeToLocation:
          type: string
          example: PT1H30M
          pattern: PnDTnHnMn.nS.
          description: The field resource's travel time to get to the work order from his
            previous location.
        distanceToLocation:
          type:
            $ref: "#/components/schemas/Distance"
          description: The distance from the field resource's previous location to the
            work order.
        workLoad:
          type: string
          description: The field resource's workload in percentage on the day of the slot.
    BusinessErrorCode:
      type: object
      properties:
        errorCode:
          type: string
          description: The error code.
        errorMessage:
          type: string
          description: The error message.
    Characteristic:
      description: A characteristic for a equipment.
      type: object
      required:
        - characteristicCode
        - name
        - lastUpdate
      properties:
        characteristicCode:
          description: Characteristic code. Case insensitive.
          type: string
          minLength: 1
          maxLength: 10
          readOnly: true
        name:
          description: Characteristic name.
          maxLength: 30
          minLength: 1
          type: string
        lastUpdate:
          description: Last update, UTC date-time notation as defined by RFC 3339, section
            5.6. Only returned by the GET API.
          type: string
          format: date-time
          readOnly: true
          examples:
            - 2024-09-12T13:00:27.836330Z
      examples:
        - characteristicCode: CRANE_20M
          name: Crane with 20M high
          lastUpdate: 2024-09-12T13:00:27.836330Z
        - characteristicCode: CRANE_30M
          name: Crane with 30M high
          lastUpdate: 2024-09-12T13:00:27.836330Z
    Skill:
      description: A skill for a field resource.
      type: object
      required:
        - skillCode
        - name
        - lastUpdate
      properties:
        skillCode:
          description: Skill code. Case insensitive.
          type: string
          minLength: 1
          maxLength: 10
          readOnly: true
        name:
          description: Skill name.
          maxLength: 30
          minLength: 1
          type: string
        lastUpdate:
          description: Last update, UTC date-time notation as defined by RFC 3339, section
            5.6. Only returned by the GET API.
          type: string
          format: date-time
          readOnly: true
          examples:
            - 2024-09-12T13:00:27.836330Z
      examples:
        - skillCode: SKILL_HTI
          name: High tension installation
          lastUpdate: 2024-09-12T13:00:27.836330Z
        - skillCode: SKILL_LTI
          name: Low tension installation
          lastUpdate: 2024-09-12T13:00:27.836330Z
    Item:
      description: An item object.
      type: object
      required:
        - itemCode
        - name
        - itemCategoryCode
        - dimensions
        - attributes
        - tracking
        - billingParameters
        - lastUpdate
      properties:
        itemCode:
          description: Item code. Case insensitive.
          type: string
          maxLength: 256
          readOnly: true
        name:
          description: Item name.
          type: string
          maxLength: 10000
        reference:
          description: Item internal reference code (for catalog search purpose).
          type:
            - string
            - "null"
          maxLength: 10000
        itemCategoryCode:
          description: Item's category code.
          type: string
          maxLength: 256
        description:
          description: Item detailled description.
          type:
            - string
            - "null"
          maxLength: 10000
        barCode:
          description: Item barcode value associated with the item (for catalog search
            purpose).
          type:
            - string
            - "null"
          maxLength: 100
        manufacturer:
          description: Item's manufacturer.
          type:
            - string
            - "null"
          maxLength: 100
        dimensions:
          description: Indicates how many dimensions the item has (length x width x height).
          type: integer
          enum:
            - 1
            - 2
            - 3
        attributes:
          type: object
          properties:
            isGeneric:
              description: Indicates if the item is a generic type.
              type: boolean
            isParentItem:
              description: Indicates if the item is a parent item.
              type: boolean
            hasFixedQuantity:
              description: Indicates that the item is actually a prestation with a negociated
                price (quantity fixed to 1).
              type: boolean
            availableOnMobile:
              description: Indicates if the item is available on the mobile app.
              type: boolean
        tracking:
          description: Details about how the item is tracked.
          type: object
          properties:
            trackedInStock:
              description: Indicates that item availability is tracked in field resource's
                stock. Only available if stock management is activated.
              type: boolean
            serialNumberFormat:
              description: Regular expression that defines the structure of the item's
                tracking number. If absent, then items are not tracked by serial
                number.
              type:
                - string
                - "null"
              maxLength: 100
        billingParameters:
          description: Pricing information and invoicing details.
          type: object
          required:
            - invoiceMode
          properties:
            priceDetails:
              type: object
              required:
                - unitPrice
              properties:
                unitPrice:
                  description: Item price.
                  type: number
                vatRates:
                  description: Tax rates applicable to the item.
                  type:
                    - array
                    - "null"
                  items:
                    type: number
                    minimum: 0
                    maximum: 0.99999
                displayPriceOnMobile:
                  description: Specifies whether the price should be displayed on mobile devices.
                    For this option to work, the item must be available on
                    mobile.
                  type: boolean
                displayPriceOnWeb:
                  description: Whether the price is displayed for web users.
                  type: string
                  enum:
                    - ALWAYS
                    - BY_PROFILE
            invoiceMode:
              description: The type of invoicing (if the item belong to your company or not).
              type: string
              enum:
                - INTERNAL
                - EXTERNAL
        customFields:
          $ref: "#/components/schemas/ItemCustomFields"
        lastUpdate:
          description: Last update, UTC date-time notation as defined by RFC 3339, section
            5.6. Only returned by the GET API.
          type: string
          format: date-time
          readOnly: true
          examples:
            - 2024-09-12T13:00:27.836330Z
      examples:
        - itemCode: WMOUSE_324
          name: Wireless mouse
          reference: 21348146
          itemCategoryCode: HARDWARE_INPUT
          description: Wireless mouse
          barCode: "032160165400"
          manufacturer: Asus
          dimensions: 3
          attributes:
            isGeneric: true
            isParentItem: false
            hasFixedQuantity: true
            availableOnMobile: true
          tracking:
            trackedInStock: true
            serialNumberFormat: null
          billingParameters:
            priceDetails:
              unitPrice: 22.9
              vatRates:
                - 0.09
                - 0.12
                - 0.19
              displayPriceOnMobile: true
              displayPriceOnWeb: ALWAYS
            invoiceMode: EXTERNAL
          lastUpdate: 2025-11-09T23:30:00.0Z
    Customer:
      description: A customer object
      type: object
      required:
        - customerCode
        - name
        - addressDetails
        - lastUpdate
      properties:
        customerCode:
          description: Customer code. Case insensitive.
          maxLength: 10000
          minLength: 1
          type: string
          readOnly: true
        name:
          description: Customer name.
          maxLength: 10000
          minLength: 1
          type: string
        parentCustomerCode:
          description: Parent customer code. Case insensitive.
          maxLength: 10000
          type:
            - string
            - "null"
        officeCode:
          description: >-
            Office code. Case insensitive.

            If the property is not filled in
             - if the parent customer code is filled in, the parent customer office will be applied
             - if the parent customer code is not filled in, the office of the OAuth2.0 application will be applied
          maxLength: 10000
          minLength: 1
          type: string
        contact:
          $ref: "#/components/schemas/Contact"
          description: Customer contact details.
        addressDetails:
          $ref: "#/components/schemas/AddressDetails"
          description: Customer address details.
        description:
          description: Customer description of any.
          maxLength: 10000
          type:
            - string
            - "null"
        customFields:
          $ref: "#/components/schemas/CustomerCustomFields"
        lastUpdate:
          description: Last update, UTC date-time notation as defined by RFC 3339, section
            5.6. Only returned by the GET API.
          type: string
          format: date-time
          readOnly: true
          examples:
            - 2024-09-12T13:00:27.836330Z
      examples:
        - customerCode: CUSTOMER_CODE
          name: Customer name
          officeCode: OFFICE_CODE
          parentCustomerCode: PARENT_CUSTOMER_CODE
          contact:
            name: Jean du Jardin
            details:
              - type: Mobile
                description: Mobile number of this contact
                value: "+33708012600"
              - type: Phone
                description: Phone number of this contact
                value: "+33123456789"
          addressDetails:
            address: 28 Rue Mogador
            zipCode: "75009"
            city: Paris
            country: FR
          lastUpdate: 2024-09-12T13:00:27.836330Z
    Site:
      description: A site object.
      type: object
      required:
        - siteCode
        - name
        - customerCode
        - location
        - officeCode
        - lastUpdate
      properties:
        siteCode:
          description: Site code. Case insensitive.
          maxLength: 10000
          minLength: 1
          type: string
          readOnly: true
        name:
          description: Site name.
          maxLength: 10000
          minLength: 1
          type: string
        customerCode:
          description: Related customer code. Case insensitive.
          maxLength: 10000
          minLength: 1
          type: string
        parentSiteCode:
          description: Parent site code if any. Case insensitive.
          maxLength: 10000
          type:
            - string
            - "null"
        officeCode:
          description: Site office code. Case insensitive.
          maxLength: 10000
          minLength: 1
          type: string
        contact:
          $ref: "#/components/schemas/Contact"
          description: Site contacts.
        location:
          $ref: "#/components/schemas/Location"
          description: Location details of the site.
        description:
          description: Site description if any.
          maxLength: 8192
          type:
            - string
            - "null"
        customFields:
          $ref: "#/components/schemas/SiteCustomFields"
        lastUpdate:
          description: Last update, UTC date-time notation as defined by RFC 3339, section
            5.6. Only returned by the GET API.
          type: string
          format: date-time
          readOnly: true
          examples:
            - 2024-09-12T13:00:27.836330Z
      examples:
        - siteCode: SITE_CODE
          name: Site name
          customerCode: CUSTOMER_CODE
          parentSiteCode: PARENT_SITE_CODE
          officeCode: OFFICE_CODE
          description: Just a description
          addressDetails:
            address: 28 Rue Mogador
            zipCode: "75009"
            city: Paris
            country: FR
            geolocation:
              latitude: 48.875567
              longitude: 2.331379
          contact:
            name: Jean Du Jardin
            details:
              - type: Mobile
                description: Personal mobile number
                value: "+708012700"
              - type: Email
                description: Work email
                value: john.doe@company.com
          customFields:
            textCustomFieldCode:
              textValue: I am a text field
            checkBoxCustomFieldCode:
              booleanValue: true
            dateCustomFieldCode:
              dateValue: 2024-11-13
            timeCustomFieldCode:
              timeValue: 12:15
            dropDownCustomFieldCode:
              dropDownValue: I am a drop down text
          lastUpdate: 2024-09-12T13:00:27.836330Z
    Asset:
      description: An asset object.
      type: object
      required:
        - assetCode
        - label
        - siteCode
        - assetTypeCode
        - lastUpdate
      properties:
        assetCode:
          description: Asset code. Case insensitive.
          type: string
          maxLength: 256
          readOnly: true
        label:
          description: Asset label. It can be the name but it can also be an identifier
            (barCode, QRCode or NFC) used for asset search purpose.
          type: string
          maxLength: 10000
          minLength: 1
        customerCode:
          description: Related customer code. Case insensitive.
          type: string
          maxLength: 256
          readOnly: true
        siteCode:
          description: Related site code. Case insensitive.
          type: string
          maxLength: 256
          minLength: 1
        assetTypeCode:
          description: Asset type code. Case insensitive.
          type: string
          maxLength: 256
          minLength: 1
        officeCode:
          description: Code of the asset. Case insensitive.
          type: string
          maxLength: 256
        parentAssetCode:
          description: Parent asset code (if hierarchical structure). Case insensitive.
          type: string
          maxLength: 256
        description:
          description: Asset description if any.
          type:
            - string
            - "null"
          maxLength: 10000
        commissioning:
          description: Commissioning details of the asset. If absent, status defaults to
            ACTIVE and startDate to null.
          type: object
          properties:
            startDate:
              description: Start date of the asset (installation date, contract start date.)
                in ISO-8601 format. Defaults to null if absent.
              type:
                - string
                - "null"
              format: date
              examples:
                - 2024-01-15
            status:
              description: Status of the asset. Defaults to ACTIVE if absent.
              type: string
              enum:
                - ACTIVE
                - INACTIVE
              default: ACTIVE
              examples:
                - ACTIVE
        customFields:
          $ref: "#/components/schemas/AssetCustomFields"
        lastUpdate:
          description: Last update, UTC date-time notation as defined by RFC 3339, section
            5.6. Only returned by the GET API.
          type: string
          format: date-time
          readOnly: true
          examples:
            - 2024-09-12T13:00:27.836330Z
      examples:
        - assetCode: MOTOR-123456
          label: Electric motor SN123456
          customerCode: RENAULT
          SiteCode: FACTORY_7700
          assetTypeCode: MOTOR-E
          officeCode: PARIS
          parentAssetCode: MOTOR
          description: New gen electric motor dyson for factories
          commissioning:
            startDate: 2024-01-15
            status: ACTIVE
          customFields:
            textCustomFieldCode:
              textValue: I am a text field
            checkBoxCustomFieldCode:
              booleanValue: true
            dateCustomFieldCode:
              dateValue: 2024-11-13
            timeCustomFieldCode:
              timeValue: 12:15
            dropDownCustomFieldCode:
              dropDownValue: I am a drop down text
          lastUpdate: 2024-09-12T13:00:27.836330Z
    Contact:
      description: A customer contact and his details.
      type:
        - object
        - "null"
      properties:
        name:
          description: Customer contact name.
          maxLength: 10000
          type: string
          examples:
            - Jean du Jardin
        details:
          description: Array of contact details.
          maxItems: 15
          minItems: 0
          type: array
          items:
            $ref: "#/components/schemas/ContactDetail"
      examples:
        - name: Jean Du Jardin
          details:
            - type: Mobile
              description: Personal mobile number
              value: "+1234567890"
            - type: Email
              description: Work email
              value: john.doe@company.com
            - type: Phone
              value: 987654321
            - type: Fax
              description: Office fax
              value: "+1122334455"
    ContactDetail:
      description: Contact detail of the customer.
      type: object
      required:
        - value
      properties:
        type:
          description: Contact detail type.
          default: Phone
          enum:
            - Mobile
            - Fax
            - Email
            - Phone
          type: string
          examples:
            - Mobile
        description:
          description: Description of the contact detail.
          maxLength: 200
          type:
            - string
            - "null"
          examples:
            - Mobile number of this contact
        value:
          description: Value of the contact.
          maxLength: 100
          type: string
          examples:
            - "+33723456789"
      examples:
        - - type: Mobile
            description: Mobile number of this contact
            value: "+33123456789"
    ContactDetails:
      description: Details of a customer contact.
      type: array
      items:
        $ref: "#/components/schemas/ContactDetail"
      examples:
        - - type: Mobile
            description: Personal mobile number
            value: "+1234567890"
          - type: Email
            description: Work email
            value: john.doe@company.com
          - type: Phone
            description: ""
            value: 987654321
          - type: Fax
            description: Office fax
            value: "+1122334455"
    Location:
      description: Location details of the site, gps included.
      type: object
      required:
        - addressDetails
      properties:
        geolocation:
          $ref: "#/components/schemas/Geolocation"
          description: ""
        addressDetails:
          $ref: "#/components/schemas/SiteAddressDetails"
          description: Site address details.
      examples:
        - location:
            addressDetails:
              address: 28 Rue Mogador
              zipCode: "75009"
              city: Paris
              country: FR
            geolocation:
              latitude: 48.875567
              longitude: 2.331379
    AddressDetails:
      description: Address details.
      type: object
      required:
        - city
      properties:
        address:
          maxLength: 10000
          type:
            - string
            - "null"
          examples:
            - 28 Rue Mogador
        zipCode:
          maxLength: 20
          type:
            - string
            - "null"
          examples:
            - "75009"
        city:
          maxLength: 256
          minLength: 1
          type: string
          examples:
            - Paris
        country:
          description: If filled in, it should be a valid ISO 3166-1 Alpha-2 country code
          maxLength: 2
          minLength: 2
          pattern: ^[A-Z]{2}$
          type:
            - string
            - "null"
          examples:
            - FR
      examples:
        - - address: 28 Rue Mogador
            zipCode: "75009"
            city: Paris
            country: FR
    SiteAddressDetails:
      description: Same as the Address Details object, but city and address are required.
      type: object
      required:
        - city
        - address
      properties:
        address:
          maxLength: 10000
          type: string
          examples:
            - 28 rue Mogador
        zipCode:
          maxLength: 20
          type:
            - string
            - "null"
          examples:
            - "75009"
        city:
          description: ""
          maxLength: 256
          minLength: 1
          type: string
          examples:
            - Paris
        country:
          description: If filled in, it should be a valid ISO 3166-1 Alpha-2 country code
          maxLength: 2
          minLength: 2
          pattern: ^[A-Z]{2}$
          type:
            - string
            - "null"
          examples:
            - FR
      examples:
        - - address: 28 Rue Mogador
            zipCode: "75009"
            city: Paris
            country: FR
    Geolocation:
      description: Geolocation details of the site. Optional.
      type:
        - object
        - "null"
      properties:
        latitude:
          format: double
          description: Latitude of the site's coordinates. If the latitude property is
            set, the longitude property needs to be also set. After 16 decimal
            places, the accuracy of the latitude will be truncated.
          type: number
          examples:
            - 48.875567
        longitude:
          format: double
          description: Longitude of the site's coordinates. If the longitude property is
            set, the latitude property needs to be also set. After 16 decimal
            places, the accuracy of the longitude will be truncated.
          type: number
          examples:
            - 2.331379
      examples:
        - latitude: 48.875567
          longitude: 2.331379
    CustomerCustomFields:
      description: Map of custom fields of a customer.
      type: object
      additionalProperties:
        $ref: "#/components/schemas/CustomerCustomField"
    CustomerCustomField:
      oneOf:
        - $ref: "#/components/schemas/TextCustomField"
        - $ref: "#/components/schemas/CheckBoxCustomField"
        - $ref: "#/components/schemas/DropDownCustomField"
        - $ref: "#/components/schemas/UrlCustomField"
        - $ref: "#/components/schemas/DateCustomField"
        - $ref: "#/components/schemas/DateTimeCustomField"
        - $ref: "#/components/schemas/TimeCustomField"
        - $ref: "#/components/schemas/GpsCustomField"
    SiteCustomFields:
      description: Map of custom fields of a site.
      type: object
      additionalProperties:
        $ref: "#/components/schemas/SiteCustomField"
    SiteCustomField:
      oneOf:
        - $ref: "#/components/schemas/TextCustomField"
        - $ref: "#/components/schemas/CheckBoxCustomField"
        - $ref: "#/components/schemas/DropDownCustomField"
        - $ref: "#/components/schemas/UrlCustomField"
        - $ref: "#/components/schemas/DateCustomField"
        - $ref: "#/components/schemas/DateTimeCustomField"
        - $ref: "#/components/schemas/TimeCustomField"
        - $ref: "#/components/schemas/GpsCustomField"
    AssetCustomFields:
      description: Map of custom fields of an asset.
      type: object
      additionalProperties:
        $ref: "#/components/schemas/AssetCustomField"
    AssetCustomField:
      oneOf:
        - $ref: "#/components/schemas/TextCustomField"
        - $ref: "#/components/schemas/CheckBoxCustomField"
        - $ref: "#/components/schemas/DropDownCustomField"
        - $ref: "#/components/schemas/UrlCustomField"
        - $ref: "#/components/schemas/DateCustomField"
        - $ref: "#/components/schemas/DateTimeCustomField"
        - $ref: "#/components/schemas/TimeCustomField"
        - $ref: "#/components/schemas/GpsCustomField"
    ItemCustomFields:
      description: Map of custom fields of an item.
      type: object
      additionalProperties:
        $ref: "#/components/schemas/ItemCustomField"
    ItemCustomField:
      oneOf:
        - $ref: "#/components/schemas/TextCustomField"
        - $ref: "#/components/schemas/CheckBoxCustomField"
        - $ref: "#/components/schemas/DropDownCustomField"
        - $ref: "#/components/schemas/UrlCustomField"
        - $ref: "#/components/schemas/DateCustomField"
        - $ref: "#/components/schemas/DateTimeCustomField"
        - $ref: "#/components/schemas/TimeCustomField"
        - $ref: "#/components/schemas/GpsCustomField"
    TextCustomField:
      description: Text field.
      type: object
      properties:
        textValue:
          description: Text value.
          type: string
      examples:
        - textCustomFieldCode:
            textValue: This is a text
    CheckBoxCustomField:
      description: Boolean field.
      type: object
      properties:
        booleanValue:
          description: Boolean value.
          type: boolean
      examples:
        - checkboxCustomFieldCode:
            booleanValue: true
    DropDownCustomField:
      description: Drop down field, the text content must be one of the drop down
        custom attribute values.
      type: object
      properties:
        dropDownValue:
          description: Drop down value.
          type: string
      examples:
        - dropDownCustomFieldCode:
            dropDownValue: This is a text value of a drop down
    UrlCustomField:
      description: URL field.
      type: object
      properties:
        urlValue:
          description: URL value.
          type: string
      examples:
        - UrlCustomField:
            urlValue: https://www.praxedo.fr/
    DateCustomField:
      description: 'Date field format will follow the ISO-8601 international standard:
        YYYY-MM-DD".'
      type: object
      properties:
        dateValue:
          description: Must be a date value following the ISO-8601 standard (YYYY-MM-DD
            format) or null. An empty string is not permitted.
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}$
      examples:
        - dateCustomFieldCode:
            dateValue: 2024-11-17
    DateTimeCustomField:
      description: 'DateTime field format will follow the ISO-8601 international
        standard: YYYY-MM-DDTHH:MM".'
      type: object
      properties:
        dateTimeValue:
          description: >
            Must be a date-time value following the ISO-8601 standard
            (YYYY-MM-DDTHH:MM format) or null. An empty string is not permitted.
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$
      examples:
        - dateTimeCustomFieldCode:
            dateTimeValue: 2024-11-17T15:12
    TimeCustomField:
      description: 'Time field format will follow the ISO-8601 international standard:
        HH:MM".'
      type: object
      properties:
        timeValue:
          description: Must be a time value following the ISO-8601 standard (HH:MM format)
            or null. An empty string is not permitted.
          type: string
          pattern: ^\d{2}:\d{2}$
      examples:
        - timeCustomFieldCode:
            timeValue: 14:36
    GpsCustomField:
      description: Gps field.
      type: object
      properties:
        gpsValue:
          description: GPS coordinates.
          $ref: "#/components/schemas/Geolocation"
      examples:
        - gpsCustomFieldCode:
            gpsValue:
              longitude: 48.8567
              latitude: 2.3508
    Subscription:
      title: Subscription
      description: A subscription to webhook events.
      type: object
      required:
        - id
        - status
        - callback
        - eventTypes
      properties:
        id:
          type: string
          description: the id of the subscription
        status:
          $ref: "#/components/schemas/Status"
        callback:
          $ref: "#/components/schemas/CallbackInformation"
        eventTypes:
          $ref: "#/components/schemas/EventType"
    SubscriptionListResponse:
      title: SubscriptionListResponse
      description: A list of subscriptions.
      type: array
      items:
        $ref: "#/components/schemas/Subscription"
    SubscriptionCreationResponse:
      title: SubscriptionCreationResponse
      type: object
      required:
        - id
        - eventTypes
      properties:
        id:
          type: string
          description: the id of the created subscription
        eventTypes:
          type: array
          items:
            $ref: "#/components/schemas/EventType"
    SubscriptionRequest:
      title: SubscriptionRequest
      type: object
      required:
        - callback
        - eventTypes
      properties:
        callback:
          $ref: "#/components/schemas/CallbackInformation"
        eventTypes:
          type: array
          maxProperties: 3
          minProperties: 1
          uniqueItems: true
          description: List of event types the subscription should listen to.
          items:
            $ref: "#/components/schemas/EventType"
    EventType:
      title: EventType
      type: object
      required:
        - name
      properties:
        name:
          type: string
          enum:
            - workorder.validation
            - workorder.deletion
            - asset.upsert
          description: The type of event to subscribe to. For example `workorder.validation`
            (sent when a work order is validated, which often triggers the invoicing process
            in the customer ERP/CRM).
    WebhookActor:
      title: WebhookActor
      description: The entity that triggered the notification.
      type: object
      required:
        - type
        - identifier
      properties:
        type:
          type: string
          description: The type of entity that triggered the notification.
          enum:
            - webUser
            - technician
            - process
            - webService
        identifier:
          type: string
          description: The unique identifier of the entity that triggered the
            notification. Its value depends on `type` (username of the web
            user for `webUser`, sync ID of the field resource for
            `technician`, or the OAuth 2.0 application name for OAuth 2.0
            auth or web service username for basic auth, for `webService`).
          example: user@company.com
    WorkOrderValidationEvent:
      title: WorkOrderValidationEvent
      description: Callback payload sent when a work order is validated. Validation
        often triggers the invoicing process in the customer ERP/CRM.
      type: object
      required:
        - version
        - id
        - creationTime
        - eventType
        - subscriptionId
        - data
      properties:
        version:
          type: string
          description: Payload format version. Current version is `1`. Praxedo will
            try to maintain backward compatibility even if this version is
            deprecated in the future.
          example: "1"
        id:
          type: string
          format: uuid
          description: Unique id of the callback, even when a retry occurs.
          example: 5c84b579-ae20-4e40-be1d-e8e57a96cb48
        creationTime:
          type: string
          format: date-time
          description: Time when the webhook event was received by the notification
            application and made ready to be sent. ISO 8601 / RFC 3339, UTC.
        eventType:
          type: string
          enum:
            - workorder.validation
        subscriptionId:
          type: string
          description: Id of the subscription that generated this callback.
          example: WEHS_251210151605_94OU25
        data:
          type: object
          required:
            - validatedAt
            - workorderCode
            - workorderUuid
            - officeCode
            - actor
          properties:
            validatedAt:
              type: string
              format: date-time
              description: Time when the work order was validated.
            workorderCode:
              type: string
              description: Work order number.
            workorderUuid:
              type: string
              format: uuid
              description: UUID of the work order, the same value used for the
                `businessEvent.extension.uuid` extension on `getEvents` and
                `searchEvents`.
            officeCode:
              type: string
              description: Code of the office configured in Praxedo.
            actor:
              $ref: "#/components/schemas/WebhookActor"
    WorkOrderDeletionEvent:
      title: WorkOrderDeletionEvent
      description: Callback payload sent when a work order is deleted from the
        Praxedo user interface or the SOAP web service.
      type: object
      required:
        - version
        - id
        - creationTime
        - eventType
        - subscriptionId
        - data
      properties:
        version:
          type: string
          description: Payload format version. Current version is `1`. Praxedo will
            try to maintain backward compatibility even if this version is
            deprecated in the future.
          example: "1"
        id:
          type: string
          format: uuid
          description: Unique id of the callback, even when a retry occurs.
          example: 5c84b579-ae20-4e40-be1d-e8e57a96cb48
        creationTime:
          type: string
          format: date-time
          description: Time when the webhook event was received by the notification
            application and made ready to be sent. ISO 8601 / RFC 3339, UTC.
        eventType:
          type: string
          enum:
            - workorder.deletion
        subscriptionId:
          type: string
          description: Id of the subscription that generated this callback.
          example: WEHS_251210151605_94OU25
        data:
          type: object
          required:
            - deletedAt
            - workorderCode
            - workorderUuid
            - officeCode
            - actor
          properties:
            deletedAt:
              type: string
              format: date-time
              description: Time when the work order was deleted.
            workorderCode:
              type: string
              description: Work order number.
            workorderUuid:
              type: string
              format: uuid
              description: UUID of the work order, the same value used for the
                `businessEvent.extension.uuid` extension on `getEvents` and
                `searchEvents`.
            officeCode:
              type: string
              description: Code of the office configured in Praxedo.
            actor:
              $ref: "#/components/schemas/WebhookActor"
    AssetUpsertEvent:
      title: AssetUpsertEvent
      description: Callback payload sent when an asset is created or updated from
        the Praxedo interface, the SOAP/REST web services, or the mobile
        application. This event does not distinguish between an asset
        creation and an asset update — treat an asset code you don't
        recognize as a new creation.
      type: object
      required:
        - version
        - id
        - creationTime
        - eventType
        - subscriptionId
        - data
      properties:
        version:
          type: string
          description: Payload format version. Current version is `1`. Praxedo will
            try to maintain backward compatibility even if this version is
            deprecated in the future.
          example: "1"
        id:
          type: string
          format: uuid
          description: Unique id of the callback, even when a retry occurs.
          example: a1b2c3d4-e5f6-7890-abcd-ef1234567890
        creationTime:
          type: string
          format: date-time
          description: Time when the webhook event was received by the notification
            application and made ready to be sent. ISO 8601 / RFC 3339, UTC.
        eventType:
          type: string
          enum:
            - asset.upsert
        subscriptionId:
          type: string
          description: Id of the subscription that generated this callback.
          example: WEHS_251210151605_94OU25
        data:
          type: object
          required:
            - updatedAt
            - assetCode
            - officeCode
          properties:
            updatedAt:
              type: string
              format: date-time
              description: Time when the asset was last updated.
            assetCode:
              type: string
              description: Unique identifier for the asset. Use it with `getEquipements`
                or `Get Asset` to retrieve more detailed information.
              example: A-456
            officeCode:
              type: string
              description: Code of the office configured in Praxedo.
            actor:
              allOf:
                - $ref: "#/components/schemas/WebhookActor"
              description: Entity that triggered the notification. Unlike other events,
                `asset.upsert` does not reliably report the source of the
                trigger (Praxedo web UI vs. mobile app).
    CallbackInformation:
      title: CallbackInformation
      type: object
      required:
        - url
      properties:
        url:
          type: string
          format: uri
          maxLength: 2000
          description: The callback endpoint to receive the webhook notifications.
          example: https://callback.example.com/webhooks
        secret:
          type: string
          maxLength: 512
          description: The secret that will be included in the callback to verify
            authenticity.
        headers:
          type: array
          description: Custom headers that will be included in the callback request.
          items:
            $ref: "#/components/schemas/Header"
    Header:
      title: Header
      type: object
      required:
        - name
      properties:
        name:
          type: string
          maxLength: 40
          pattern: x-pxo-{custom_header_name}
          description: The name of the custom header to send in the callback. Must follow
            the pattern 'x-pxo-{custom_name}'. It is required if a header object
            is present in the `headers` array. The header name must be unique in
            the list.
        value:
          type: string
          maxLength: 512
          description: The value of the custom header to send with the callback.
    Status:
      title: Status
      description: The status of the subscription.
      type: string
      enum:
        - active
        - inactive
    ErrorResponse:
      description: Error response containing an array of errors, and a unique
        reference error.
      maxProperties: 2
      minProperties: 1
      required:
        - errorReference
      type: object
      properties:
        errors:
          description: Array of errors. Contains at least one element.
          type: array
          items:
            $ref: "#/components/schemas/ErrorMessage"
        errorReference:
          description: Error unique reference. Communicated to support, this will help to
            locate the issue.
          pattern: "[0-1a-z]"
          type: string
          examples:
            - errorReference: abcdefghij0123456789
      examples:
        - errors:
            - code: referentials.customer.name.mandatory
              message: Property name is required.
          errorReference: abcdefghij0123456789
    ErrorMessage:
      description: Contains code and message for error.
      required:
        - code
        - message
      type: object
      properties:
        code:
          type: string
        message:
          type: string
      examples:
        - code: referentials.customer.name.mandatory
          message: Property name is required.
        - code: referentials.customer.zipcode.length
          message: The zip code length must not exceed 20 characters.
    SchedulingResponse:
      description: Scheduling data for a work order. Only returned when the work order
        status is SCHEDULED or later.
      type: object
      required:
        - schedule
      properties:
        schedule:
          $ref: "#/components/schemas/ScheduleData"
        customer:
          $ref: "#/components/schemas/CustomerScheduling"
      examples:
        - schedule:
            timeWindow:
              startDate: 2026-04-10T09:00:00Z
              endDate: 2026-04-10T10:00:00Z
            fieldResources:
              mainResourceCode: tech-55
              technicianCrewCodes:
                - tech-88
                - tech-98
              equipmentCrewCodes:
                - truck-04
          customer:
            geolocation:
              lat: 48.8566
              lng: 2.3522
            appointment:
              date: 2026-04-10T10:00:00Z
              slot:
                startDate: 2026-04-10T08:00:00Z
                endDate: 2026-04-10T12:00:00Z
    ScheduleData:
      description: Core scheduling block — time window and assigned field resources.
      type: object
      required:
        - timeWindow
        - fieldResources
      properties:
        timeWindow:
          $ref: "#/components/schemas/SchedulingTimeWindow"
        fieldResources:
          $ref: "#/components/schemas/FieldResources"
    SchedulingTimeWindow:
      description: The time window during which the work order is planned to be
        executed. Both dates are in UTC, RFC 3339 format.
      type: object
      required:
        - startDate
        - endDate
      properties:
        startDate:
          type: string
          format: date-time
          description: Scheduled start date-time of the work order, UTC date-time notation
            as defined by RFC 3339, section 5.6.
          examples:
            - 2026-04-10T09:00:00Z
        endDate:
          type: string
          format: date-time
          description: Scheduled end date-time of the work order, UTC date-time notation
            as defined by RFC 3339, section 5.6.
          examples:
            - 2026-04-10T10:00:00Z
    FieldResources:
      description: Field resources assigned to the work order. The main resource may
        be either a technician or a piece of equipment. Crew arrays are null
        when no additional resources are assigned.
      type: object
      required:
        - mainResourceCode
      properties:
        mainResourceCode:
          type: string
          description: Business code of the main resource assigned to the work order. Can
            be a technician code or an equipment code.
          examples:
            - tech-55
        technicianCrewCodes:
          type: array
          nullable: true
          description: Business codes of the additional technicians assigned alongside the
            main resource. Null when no additional technicians are assigned.
          items:
            type: string
          examples:
            - - tech-88
              - tech-98
        equipmentCrewCodes:
          type: array
          nullable: true
          description: Business codes of the equipment assigned alongside the main
            resource. Null when no equipment is assigned.
          items:
            type: string
          examples:
            - - truck-04
    CustomerScheduling:
      description: "Customer-facing scheduling information: geolocated intervention
        site and appointment details communicated to the customer. The entire
        object is null when no customer-facing data is available. Individual
        fields are also independently nullable."
      type: object
      nullable: true
      properties:
        geolocation:
          $ref: "#/components/schemas/SchedulingGeolocation"
        appointment:
          $ref: "#/components/schemas/Appointment"
    SchedulingGeolocation:
      description: GPS coordinates of the intervention site. Null when geolocation
        could not be determined.
      type: object
      nullable: true
      required:
        - lat
        - lng
      properties:
        lat:
          type: number
          format: double
          description: Latitude of the intervention site.
          examples:
            - 48.8566
        lng:
          type: number
          format: double
          description: Longitude of the intervention site.
          examples:
            - 2.3522
    Appointment:
      description: Appointment details communicated to the customer. `date` and `slot`
        are independently nullable — one, both, or neither may be set depending
        on the scheduling configuration.
      type: object
      nullable: true
      properties:
        date:
          type: string
          format: date-time
          nullable: true
          description: Exact appointment date-time promised to the customer. Null if no
            precise appointment time was defined.
          examples:
            - 2026-04-10T10:00:00Z
        slot:
          $ref: "#/components/schemas/AppointmentSlot"
    AppointmentSlot:
      description: Time slot communicated to the customer (e.g. "morning",
        "afternoon"). Null if no slot was defined.
      type: object
      nullable: true
      required:
        - startDate
        - endDate
      properties:
        startDate:
          type: string
          format: date-time
          description: Start of the appointment slot, UTC date-time notation as defined by
            RFC 3339, section 5.6.
          examples:
            - 2026-04-10T08:00:00Z
        endDate:
          type: string
          format: date-time
          description: End of the appointment slot, UTC date-time notation as defined by
            RFC 3339, section 5.6.
          examples:
            - 2026-04-10T12:00:00Z
    WorkOrderScheduleRequest:
      description: >-
        Scheduling to apply to the work order. Every block is optional in the schema; which ones are mandatory
        depends on the work order status (see the operation description). Unknown properties are rejected.
      type: object
      additionalProperties: false
      properties:
        schedulerRequirements:
          $ref: "#/components/schemas/WorkOrderScheduleRequirements"
        timeWindow:
          $ref: "#/components/schemas/WorkOrderScheduleTimeWindow"
        fieldResources:
          $ref: "#/components/schemas/WorkOrderScheduleFieldResources"
    WorkOrderScheduleRequirements:
      description: How strictly the scheduling request is evaluated. When absent, every control is enforced.
      type: object
      additionalProperties: false
      properties:
        skipControls:
          description: |-
            Controls the caller opts out of. Absent or empty means every control is enforced.
            - `unavailabilityOverlap`: allow a time window overlapping an unavailability of an assigned resource.
            - `workOrderOverlap`: allow a time window where an assigned resource is already on another work order.
            - `slasRespect`: allow a time window outside the work order's SLA hours.
            - `appointmentRespect`: allow a time window outside the work order's customer appointment hours.
            - `inProgressStatus`: allow rescheduling a work order a technician has already started.
            - `all`: skip all the controls above (skills and characteristics are still checked).
          type: array
          uniqueItems: true
          items:
            type: string
            enum:
              - unavailabilityOverlap
              - workOrderOverlap
              - slasRespect
              - appointmentRespect
              - inProgressStatus
              - all
          examples:
            - - workOrderOverlap
              - appointmentRespect
        notificationSent:
          description: >-
            Whether the assigned technician is notified. When absent, the technician is notified only if the work
            order is scheduled on the current day or earlier.
          type: boolean
    WorkOrderScheduleTimeWindow:
      description: >-
        Period the work order is scheduled over. Mandatory when the work order status is `qualified`, optional
        beyond.
      oneOf:
        - $ref: "#/components/schemas/WorkOrderScheduleTimeRange"
        - $ref: "#/components/schemas/WorkOrderScheduleDayRange"
      discriminator:
        propertyName: scheduleMode
        mapping:
          TIME_RANGE: "#/components/schemas/WorkOrderScheduleTimeRange"
          DAY_RANGE: "#/components/schemas/WorkOrderScheduleDayRange"
    WorkOrderScheduleTimeRange:
      description: Time window bounded by two precise date-times.
      type: object
      required:
        - scheduleMode
        - startDate
        - endDate
      properties:
        scheduleMode:
          type: string
          const: TIME_RANGE
        startDate:
          description: >-
            Start of the scheduling, date-time notation as defined by RFC 3339, section 5.6, with an offset. The
            offset is kept for display.
          type: string
          format: date-time
          examples:
            - 2026-04-10T10:00:00.000+02:00
        endDate:
          description: End of the scheduling, RFC 3339 date-time with an offset. Must be strictly after `startDate`.
          type: string
          format: date-time
          examples:
            - 2026-04-10T12:00:00.000+02:00
    WorkOrderScheduleDayRange:
      description: >-
        Time window covering whole days, without hours. Both days are inclusive: a single-day window spans that day
        from midnight to midnight in the given timezone.
      type: object
      required:
        - scheduleMode
        - timezone
        - startDay
        - endDay
      properties:
        scheduleMode:
          type: string
          const: DAY_RANGE
        timezone:
          description: IANA timezone the days are expressed in.
          type: string
          examples:
            - Europe/Paris
        startDay:
          description: First day of the scheduling, RFC 3339 full-date.
          type: string
          format: date
          examples:
            - 2026-04-10
        endDay:
          description: Last day of the scheduling, RFC 3339 full-date. Must be on or after `startDay`.
          type: string
          format: date
          examples:
            - 2026-04-11
    WorkOrderScheduleFieldResources:
      description: >-
        Technicians and equipments to assign. Every code must belong to the office hierarchy of the OAuth2
        application. An equipment cannot be scheduled without a technician.
      type: object
      additionalProperties: false
      properties:
        reportFillerCode:
          description: >-
            Business code of the technician responsible for filling the report. Mandatory when the work order status
            is `qualified`.
          type: string
          examples:
            - tech-55
        mainResourceCode:
          description: Business code of the main resource (technician or equipment) leading the work.
          type: string
          examples:
            - tech-55
        technicianCrewCodes:
          description: Business codes of the additional technicians.
          type: array
          items:
            type: string
          examples:
            - - tech-88
              - tech-98
        equipmentCrewCodes:
          description: Business codes of the assigned equipments.
          type: array
          items:
            type: string
          examples:
            - - truck-04
    UsedItem:
      type: object
      required:
        - lineItemId
        - itemCode
        - billing
        - tracking
        - lastUpdate
      properties:
        lineItemId:
          type: string
          format: uuid
          description: Unique cart-line identifier. Stable across work order re-openings.
            Use for precise invoicing and reconciliation with expected items.
          example: 80ae5498-6d98-45d0-be83-11748b49692a
        itemCode:
          type: string
          description: Code of the consumed item (catalogue or on-the-fly).
          example: PUMP-V3
        agentCode:
          type:
            - string
            - "null"
          description: Code of the agent who declared this line (technician or web user).
          example: T_SMITH_04
        billing:
          $ref: "#/components/schemas/UsedItemBilling"
        tracking:
          $ref: "#/components/schemas/UsedItemTracking"
        lastUpdate:
          type: string
          format: date-time
          description: ISO 8601 UTC. Results sorted by this field, descending.
          example: 2024-10-15T16:05:00Z
    UsedItemBilling:
      type: object
      required:
        - invoiceMode
        - usedQuantity
      properties:
        associatedSectionCode:
          type:
            - string
            - "null"
          description: Quotation section code. null if declared directly on the work order
            cart.
          example: REPLACEMENT_SECTION
        invoiceMode:
          type: string
          enum:
            - EXTERNAL
            - INTERNAL
          description: EXTERNAL = customer invoice. INTERNAL = sub-contractor or internal
            cost.
          example: INTERNAL
        name:
          type:
            - string
            - "null"
          description: Item display name.
          example: Pompe elec motron v3
        reference:
          type:
            - string
            - "null"
          description: Item reference code.
          example: 182DGH32
        expectedQuantity:
          type:
            - number
            - "null"
          format: double
          description: Pre-ordered quantity. null if no expectation was set.
          example: 1
        usedQuantity:
          type: number
          format: double
          minimum: 0
          description: Actual quantity consumed.
          example: 1
        usedVatRate:
          type:
            - number
            - "null"
          format: double
          description: VAT rate (e.g. 0.20 for 20%). null if not declared.
          example: 0.2
        unitPrice:
          $ref: "#/components/schemas/UsedItemUnitPrice"
    UsedItemUnitPrice:
      type: object
      properties:
        catalogValue:
          type:
            - number
            - "null"
          format: double
          description: Catalogue unit price. null for on-the-fly items.
          example: 69
        associatedContract:
          type:
            - string
            - "null"
          description: Contract code that overrode the catalogue price. null if none
            applies.
          example: 2683
        value:
          type:
            - number
            - "null"
          format: double
          description: Effective unit price applied to this item line.
          example: 59
        currency:
          type: string
          description: ISO 4217 currency code of the eTech account.
          example: USD
    UsedItemTracking:
      type: object
      properties:
        serialNumber:
          type:
            - string
            - "null"
          description: Serial number. null if not tracked by serial number.
          example: SN-9982-XP
        stockCode:
          type:
            - string
            - "null"
          description: Stock location code. null if not tracked by stock.
          example: STOCK-PARIS-03
    UsedItemListResponse:
      type: object
      required:
        - data
      description: Paginated list of used items.
      properties:
        continuationToken:
          type:
            - string
            - "null"
          description: Opaque token. Pass on next request. null means last page. Do not
            parse or construct.
          example: eyJsYXN0VXBkYXRlIjoiMjAyNC0xMC0xNVQxNjowNTowMFoifQ==
        data:
          type: array
          items:
            $ref: "#/components/schemas/UsedItem"
    WorkOrderNoteRequest:
      description: Payload to create or update a note on a work order. One note per
        call. `content` must match `noteTypeCode`'s form configuration, and
        `coordinates` is required for call note categories.
      type: object
      required:
        - noteTypeCode
        - content
      properties:
        noteTypeCode:
          description: Code of the note type, as configured in Praxedo. Represent category
            of the note (standard note or call note or custom note).
          type: string
          example: STANDNOTE
        author:
          description: Identifier of the author of the note (name, system...).
          type: string
          example: DHA
        date:
          description: ISO 8601 timestamp of the note. Must not be in the future.
          type: string
          format: date-time
          example: 2025-11-05T14:32:00Z
        coordinates:
          description: Phone number of the caller. Required when the note type's category
            is `INCOMING_CALL` or `OUTGOING_CALL`. Optional for category `NOTE`.
          type: string
          example: "+33612345678"
        content:
          $ref: "#/components/schemas/NoteContent"
        visibility:
          $ref: "#/components/schemas/NoteVisibility"
      examples:
        - noteTypeCode: STANDNOTE
          author: DHA
          date: 2025-11-05T14:32:00Z
          content:
            text: "Gate code is #9292"
          visibility:
            technician: true
            customerPortalUser: false
    NoteContent:
      description: "Content of the note. Exactly one of `text` or `reportFields` must
        be supplied, depending on whether the note type has an associated form:
        `text` for note types without a form, `reportFields` for note types with
        a form."
      oneOf:
        - $ref: "#/components/schemas/NoteTextContent"
        - $ref: "#/components/schemas/NoteReportFieldsContent"
    NoteTextContent:
      description: Free-text content, used by note types without an associated form
        (standard notes and call notes).
      type: object
      required:
        - text
      properties:
        text:
          description: Free-text content of the note.
          type: string
          example: "Gate code is #9292"
      examples:
        - text: "Gate code is #9292"
        - text: Customer called to confirm appointment.
    NoteReportFieldsContent:
      description: Form-field content, used by note types with an associated form.
      type: object
      required:
        - reportFields
      properties:
        reportFields:
          description: Map of field values for the note type's associated form, keyed by
            field code — same shape as `customFields`. Each key is a field code;
            its value is an object with the single value property matching that
            field's configured type (`textValue`, `dropDownValue`,
            `booleanValue`, `numericValue`, `dateValue`, `timeValue`, or
            `urlValue`).
          type: object
          additionalProperties:
            $ref: "#/components/schemas/ReportFieldValue"
      examples:
        - reportFields:
            REASON:
              dropDownValue: Reschedule
            CALLBACK_DATE:
              dateValue: 2025-12-01
            CALLBACK_TIME:
              timeValue: 14:30
            CONTACT_NAME:
              textValue: John Smith
            VIP?:
              booleanValue: false
            PARTS_COUNT:
              numericValue: 3
            PROCEDURE_LINK:
              urlValue: https://intranet.acme.com/procedures/reschedule
    ReportFieldValue:
      description: Value for a single field of the note type's form, addressed by its
        field code (map key). The field's configured type in Praxedo determines
        which single value property must be set.
      type: object
      properties:
        textValue:
          description: Value for a Texte, Zone de texte, or Commentaire field.
          type: string
          example: John Smith
        dropDownValue:
          description: Value for a Liste déroulante field.
          type: string
          example: Reschedule
        booleanValue:
          description: Value for a Case à cocher oui/non field.
          type: boolean
          example: false
        numericValue:
          description: Value for a Numérique field.
          type: number
          example: 3
        dateValue:
          description: Value for a Date field.
          type: string
          format: date
          example: 2025-12-01
        timeValue:
          description: Value for a Heure field.
          type: string
          format: time
          example: 14:30
        urlValue:
          description: Value for a URL field.
          type: string
          format: uri
          example: https://intranet.acme.com/procedures/reschedule
      examples:
        - dropDownValue: Reschedule
        - dateValue: 2025-12-01
        - textValue: John Smith
        - booleanValue: false
        - numericValue: 3
        - timeValue: 14:30
        - urlValue: https://intranet.acme.com/procedures/reschedule
    NoteVisibility:
      description: Determines who can see the note. If omitted entirely, visibility
        defaults are inherited from the note type configuration. If supplied, it
        fully overrides those defaults (no partial merge).
      type: object
      properties:
        technician:
          description: Whether the note is visible to the field technician.
          type: boolean
          example: true
        customerPortalUser:
          description: Whether the note is visible to the customer portal user.
          type: boolean
          example: false
      examples:
        - technician: true
          customerPortalUser: false
        - technician: false
          customerPortalUser: false
    WorkOrderFlagsRequest:
      description: Payload to replace the full set of flags on a work order. The
        provided list fully overrides the existing flags. An empty array clears
        all flags.
      type: object
      required:
        - flags
      properties:
        flags:
          description: Wrapper object for the set of flags to apply. The flag codes are
            provided in the `ids` array.
          type: object
          required:
            - ids
          properties:
            ids:
              description: The complete set of flag ids to apply to the work order. Each flag
                id is an integer that is a power of 2. The list replaces any existing
                flags; an empty array clears all flags.
              type: array
              minItems: 0
              maxItems: 32
              items:
                description: A flag id, expressed as an integer that is a power of 2 (1, 2, 4,
                  8, 16...).
                type: integer
              example:
                - 1
                - 2
                - 4
                - 8
      examples:
        - flags:
            ids:
              - 1
              - 2
              - 4
              - 8
        - flags:
            ids: []
    CharacteristicListResponse:
      required:
        - data
      type: object
      properties:
        continuationToken:
          description: Token that holds pagination information. Only sent if there are
            still pages of characteristics to be loaded.
          type:
            - string
            - "null"
        data:
          description: The list of characteristics.
          type: array
          items:
            $ref: "#/components/schemas/Characteristic"
    SkillListResponse:
      required:
        - data
      type: object
      properties:
        continuationToken:
          description: Token that holds pagination information. Only sent if there are
            still pages of skills to be loaded.
          type:
            - string
            - "null"
        data:
          description: The list of skills.
          type: array
          items:
            $ref: "#/components/schemas/Skill"
    ItemListResponse:
      required:
        - data
      type: object
      properties:
        continuationToken:
          description: Token that holds pagination information. Only sent if there are
            still pages of items to be loaded.
          type:
            - string
            - "null"
        data:
          description: The list of items.
          type: array
          items:
            $ref: "#/components/schemas/Item"
    WorkOrderProjectLinkRequest:
      description: Work order to link to the project, its position among the project's jobs and its dependencies. Unknown properties are rejected.
      type: object
      additionalProperties: false
      required:
        - type
        - code
      properties:
        type:
          description: Type of job linked. Only `workOrder` is supported (case insensitive).
          type: string
          enum:
            - workOrder
        code:
          description: Business code of the work order to link.
          type: string
          examples:
            - WO-2026-00123
        insertion:
          $ref: "#/components/schemas/ProjectInsertion"
    ProjectInsertion:
      description: Position of the work order among the project's jobs, and its dependencies. When absent, the work order is linked last, without dependency.
      type: object
      additionalProperties: false
      properties:
        insertionMode:
          description: How the position is expressed.
          type: string
          default: last
          enum:
            - first
            - last
            - index
            - before
            - after
        position:
          description: >-
            Zero-based position among the project's jobs (phases, tasks and work orders). Required by `index`, ignored
            otherwise. A position past the last job places the work order last.
          type: integer
          minimum: 0
          examples:
            - 3
        relativePosition:
          description: >-
            Job to sit before or after, required by `before` and `after`: the number of a task or work order, or the
            code of a phase. Must be a job of the project, other than the work order being linked.
          type: string
          examples:
            - PHASE-1
        jobType:
          description: What `relativePosition` names. Tasks and work orders may share a number within a project.
          type: string
          default: phase
          enum:
            - task
            - workOrder
            - phase
        block:
          description: Jobs of the project the linked work order blocks. Omitted or empty, no such dependency is created.
          type: array
          items:
            $ref: "#/components/schemas/ProjectDependentJob"
        isBlockedBy:
          description: Jobs of the project that block the linked work order. Omitted or empty, no such dependency is created.
          type: array
          items:
            $ref: "#/components/schemas/ProjectDependentJob"
    ProjectDependentJob:
      description: Task or work order of the project taking part in a dependency. Phases take no part in dependencies.
      type: object
      additionalProperties: false
      required:
        - jobType
        - code
      properties:
        jobType:
          description: Whether `code` is the number of a task or of a work order.
          type: string
          enum:
            - task
            - workOrder
        code:
          description: Number of the task or work order.
          type: string
          examples:
            - WO-2026-00124
    WorkOrderServiceOrderLinkRequest:
      description: Work order to link to the service order and its position among the service order's work orders. Unknown properties are rejected.
      type: object
      additionalProperties: false
      required:
        - code
      properties:
        code:
          description: Business code of the work order to link.
          type: string
          examples:
            - WO-2026-00123
        insertion:
          $ref: "#/components/schemas/ServiceOrderInsertion"
    ServiceOrderInsertion:
      description: Position of the work order among the service order's work orders. When absent, the work order is linked last.
      type: object
      additionalProperties: false
      properties:
        insertionMode:
          description: How the position is expressed.
          type: string
          default: last
          enum:
            - first
            - last
            - index
            - before
            - after
        position:
          description: >-
            Zero-based position among the service order's work orders. Required by `index`, ignored otherwise. Clamped
            to the bounds of the list.
          type: integer
          examples:
            - 2
        relativePosition:
          description: >-
            Business code of the work order to sit before or after, required by `before` and `after`. Must be a work
            order of the service order, other than the one being linked.
          type: string
          examples:
            - WO-2026-00120
    CrewListResponse:
      description: A page of crews active over the requested period.
      type: object
      required:
        - data
      properties:
        continuationToken:
          description: >-
            Opaque pagination token. Pass it back as the `continuationToken` query parameter to get the next page.
            null means last page. Do not parse or construct it.
          type:
            - string
            - "null"
        data:
          type: array
          items:
            $ref: "#/components/schemas/Crew"
    Crew:
      description: A crew, its main resource and its secondary resources, with their participation intervals.
      type: object
      required:
        - mainResource
        - secondaryResources
      properties:
        mainResource:
          $ref: "#/components/schemas/CrewMainResource"
        secondaryResources:
          $ref: "#/components/schemas/CrewSecondaryResources"
    CrewMainResource:
      description: Resource carrying the crew. Its intervals are the crew's intervals.
      type: object
      required:
        - code
        - type
        - intervals
      properties:
        code:
          description: Business code of the technician or equipment.
          type: string
          examples:
            - T-DAVID
        type:
          description: Kind of field resource.
          type: string
          enum:
            - technician
            - equipment
        intervals:
          description: Participation intervals, non-overlapping, sorted by start date.
          type: array
          minItems: 1
          items:
            $ref: "#/components/schemas/CrewInterval"
    CrewSecondaryResources:
      description: Resources working with the main resource, split by kind. Empty lists when none.
      type: object
      required:
        - technicians
        - equipments
      properties:
        technicians:
          type: array
          items:
            $ref: "#/components/schemas/CrewResource"
        equipments:
          type: array
          items:
            $ref: "#/components/schemas/CrewResource"
    CrewResource:
      description: Secondary resource of a crew.
      type: object
      required:
        - code
        - intervals
      properties:
        code:
          description: Business code of the technician or equipment.
          type: string
          examples:
            - truck-04
        intervals:
          description: >-
            Participation intervals, non-overlapping, sorted by start date, always within the main resource's
            intervals.
          type: array
          minItems: 1
          items:
            $ref: "#/components/schemas/CrewInterval"
    CrewInterval:
      description: Participation interval, half-open `[startDate, endDate)`, in UTC.
      type: object
      required:
        - startDate
        - endDate
      properties:
        startDate:
          description: Interval start, inclusive. UTC date-time notation as defined by RFC 3339, section 5.6.
          type: string
          format: date-time
          examples:
            - 2026-09-21T06:00:00Z
        endDate:
          description: Interval end, exclusive. null for an open-ended interval.
          type:
            - string
            - "null"
          format: date-time
          examples:
            - 2026-09-26T00:00:00Z
  examples:
    NewItemWithAllFields:
      value:
        name: Wireless mouse
        reference: REF-WMOUSE-324
        itemCategoryCode: IT_ACCESSORIES
        description: Ergonomic wireless mouse with USB receiver.
        barCode: "3614271234567"
        manufacturer: Logitech
        dimensions: 1
        attributes:
          isGeneric: false
          isParentItem: false
          hasFixedQuantity: false
          availableOnMobile: true
        tracking:
          trackedInStock: true
          serialNumberFormat: ^SN[0-9]{8}$
        billingParameters:
          invoiceMode: INTERNAL
          priceDetails:
            unitPrice: 29.99
            vatRates:
              - 0.2
            displayPriceOnMobile: true
            displayPriceOnWeb: ALWAYS
        customFields:
          WARRANTY:
            textValue: 24 months
          REFURBISHED:
            booleanValue: false
          SUPPLIER_LINK:
            urlValue: https://www.logitech.com
    NewItemWithMandatoryFieldsOnly:
      value:
        name: Ethernet cable
        itemCategoryCode: CABLES
        dimensions: 1
        attributes:
          isGeneric: false
          isParentItem: false
          hasFixedQuantity: false
          availableOnMobile: false
        tracking:
          trackedInStock: false
        billingParameters:
          invoiceMode: EXTERNAL
    UpdateItemWithAllFields:
      value:
        name: Wireless mouse v2
        reference: REF-WMOUSE-324-V2
        itemCategoryCode: IT_ACCESSORIES
        description: Updated ergonomic wireless mouse with USB-C receiver.
        barCode: "3614271234568"
        manufacturer: Logitech
        dimensions: 1
        attributes:
          isGeneric: false
          isParentItem: false
          hasFixedQuantity: false
          availableOnMobile: true
        tracking:
          trackedInStock: true
          serialNumberFormat: ^SN[0-9]{8}$
        billingParameters:
          invoiceMode: INTERNAL
          priceDetails:
            unitPrice: 34.99
            vatRates:
              - 0.2
            displayPriceOnMobile: true
            displayPriceOnWeb: BY_PROFILE
        customFields:
          WARRANTY:
            textValue: 36 months
          REFURBISHED:
            booleanValue: true
          SUPPLIER_LINK:
            urlValue: https://www.logitech.com/v2
    UpdateItemWithMandatoryFieldsOnly:
      value:
        name: Ethernet cable Cat6
        itemCategoryCode: CABLES
        dimensions: 1
        attributes:
          isGeneric: false
          isParentItem: false
          hasFixedQuantity: false
          availableOnMobile: false
        tracking:
          trackedInStock: false
        billingParameters:
          invoiceMode: EXTERNAL
    ItemWithNoUnitPrice:
      value:
        name: Complimentary item
        itemCategoryCode: MISC
        dimensions: 1
        attributes:
          isGeneric: false
          isParentItem: false
          hasFixedQuantity: true
          availableOnMobile: false
        tracking:
          trackedInStock: false
        billingParameters:
          invoiceMode: INTERNAL
          priceDetails:
            unitPrice: null
            vatRates: null
            displayPriceOnMobile: null
            displayPriceOnWeb: null
    ItemPutBadRequestMissingCode:
      value:
        errors:
          - code: businessOrganization.item.code.mandatory
            message: Missing code in path.
        errorReference: 669b11d0ae8145aa9b106b049091b371
    ItemPutBadRequestMissingName:
      value:
        errors:
          - code: businessOrganization.item.name.mandatory
            message: Property name is required.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestMissingItemCategoryCode:
      value:
        errors:
          - code: businessOrganization.item.itemcategorycode.mandatory
            message: Property itemCategoryCode is required.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestMissingDimensions:
      value:
        errors:
          - code: businessOrganization.item.dimensions.mandatory
            message: Property dimensions is required.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestMissingAttributes:
      value:
        errors:
          - code: businessOrganization.item.attributes.mandatory
            message: Property attributes is required.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestMissingIsGeneric:
      value:
        errors:
          - code: businessOrganization.item.isgeneric.mandatory
            message: Property attributes.isGeneric is required.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestMissingIsParentItem:
      value:
        errors:
          - code: businessOrganization.item.isparentitem.mandatory
            message: Property attributes.isParentItem is required.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestMissingHasFixedQuantity:
      value:
        errors:
          - code: businessOrganization.item.hasfixedquantity.mandatory
            message: Property attributes.hasFixedQuantity is required.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestMissingAvailableOnMobile:
      value:
        errors:
          - code: businessOrganization.item.availableonmobile.mandatory
            message: Property attributes.availableOnMobile is required.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestMissingBillingParameters:
      value:
        errors:
          - code: businessOrganization.item.billingparameters.mandatory
            message: Property billingParameters is required.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestMissingInvoiceMode:
      value:
        errors:
          - code: businessOrganization.item.invoicemode.mandatory
            message: Property invoiceMode is required.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestNameTooLong:
      value:
        errors:
          - code: businessOrganization.item.name.length
            message: The name length must not exceed 256 characters.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestReferenceTooLong:
      value:
        errors:
          - code: businessOrganization.item.reference.length
            message: The reference length must not exceed 256 characters.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestDescriptionTooLong:
      value:
        errors:
          - code: businessOrganization.item.description.length
            message: The description length must not exceed 10000 characters.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestBarCodeTooLong:
      value:
        errors:
          - code: businessOrganization.item.barcode.length
            message: The barCode length must not exceed 100 characters.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestManufacturerTooLong:
      value:
        errors:
          - code: businessOrganization.item.manufacturer.length
            message: The manufacturer length must not exceed 100 characters.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestSerialNumberFormatTooLong:
      value:
        errors:
          - code: businessOrganization.item.serialnumberformat.length
            message: The serialNumberFormat length must not exceed 100 characters.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestInvalidIsGeneric:
      value:
        errors:
          - code: businessOrganization.item.isgeneric.invalid
            message: "Invalid value for attributes.isGeneric. Allowed values are: true,
              false."
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestInvalidIsParentItem:
      value:
        errors:
          - code: businessOrganization.item.isparentitem.invalid
            message: "Invalid value for attributes.isParentItem. Allowed values are: true,
              false."
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestInvalidHasFixedQuantity:
      value:
        errors:
          - code: businessOrganization.item.hasfixedquantity.invalid
            message: "Invalid value for attributes.hasFixedQuantity. Allowed values are:
              true, false."
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestInvalidAvailableOnMobile:
      value:
        errors:
          - code: businessOrganization.item.availableonmobile.invalid
            message: "Invalid value for attributes.availableOnMobile. Allowed values are:
              true, false."
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestInvalidTrackedInStock:
      value:
        errors:
          - code: businessOrganization.item.trackedinstock.invalid
            message: "Invalid value for tracking.trackedInStock. Allowed values are: true,
              false."
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestInvalidDisplayPriceOnMobile:
      value:
        errors:
          - code: businessOrganization.item.displaypriceonmobile.invalid
            message: "Invalid value for displayPriceOnMobile. Allowed values are: true,
              false."
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestInvalidDimensions:
      value:
        errors:
          - code: businessOrganization.item.dimensions.invalid
            message: "Invalid value for dimensions. Allowed values are: 1, 2, 3."
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestInvalidInvoiceMode:
      value:
        errors:
          - code: businessOrganization.item.invoicemode.invalid
            message: "Invalid value for invoiceMode. Allowed values are: INTERNAL,
              EXTERNAL."
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestInvalidDisplayPriceOnWeb:
      value:
        errors:
          - code: businessOrganization.item.displaypriceonweb.invalid
            message: "Invalid value for displayPriceOnWeb. Allowed values are: ALWAYS,
              BY_PROFILE."
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestInvalidVatRate:
      value:
        errors:
          - code: businessOrganization.item.vatrates.invalid
            message: Invalid value for vatRates. Each rate must be between 0 and 0.99999.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestItemCategoryUnknown:
      value:
        errors:
          - code: businessOrganization.item.itemcategory.unknown
            message: The item category 'DUMMY' is unknown.
        errorReference: 669b11d0ae8145aa9b106b049091b371
    ItemPutBadRequestVatRatesNotNullWhenNoPrice:
      value:
        errors:
          - code: businessOrganization.item.vatrates.forbidden
            message: When unitPrice is 0 or null, vatRates must be null.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestDisplayPriceOnMobileNotNullWhenNoPrice:
      value:
        errors:
          - code: businessOrganization.item.displaypriceonmobile.forbidden
            message: When unitPrice is 0 or null, displayPriceOnMobile must be null.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestDisplayPriceOnWebNotNullWhenNoPrice:
      value:
        errors:
          - code: businessOrganization.item.displaypriceonweb.forbidden
            message: When unitPrice is 0 or null, displayPriceOnWeb must be null.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestMissingDisplayPriceOnWeb:
      value:
        errors:
          - code: businessOrganization.item.displaypriceonweb.mandatory
            message: Property displayPriceOnWeb is required when unitPrice is greater than
              0.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestMissingDisplayPriceOnMobile:
      value:
        errors:
          - code: businessOrganization.item.displaypriceonmobile.mandatory
            message: Property displayPriceOnMobile is required when unitPrice is greater
              than 0.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestDisplayPriceOnMobileConflict:
      value:
        errors:
          - code: businessOrganization.item.displaypriceonmobile.conflict
            message: Property displayPriceOnMobile cannot be true when availableOnMobile is
              false.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestInvalidJSON:
      value:
        errors:
          - code: businessOrganization.item.invalid.json
            message: Invalid Json format.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestDuplicatedField:
      value:
        errors:
          - code: businessOrganization.item.invalid.json
            message: Duplicate field 'name'.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemPutBadRequestUnknownField:
      value:
        errors:
          - code: businessOrganization.item.field.unknown
            message: The field 'foo_bar' is unknown. Please correct your JSON request.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    ItemGetBadRequestMissingCode:
      value:
        errors:
          - code: businessOrganization.item.code.mandatory
            message: Missing code in path.
        errorReference: 669b11d0ae8145aa9b106b049091b371
    ItemGetNotFound:
      value:
        errors:
          - code: businessOrganization.items.code.unknown
            message: The item WMOUSE_324 does not exist.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    SkillBodyExample1:
      value:
        name: Fiber Optic Splicing Certified
    SkillBodyExample2:
      value:
        name: HVAC System Repair
    NewCustomerWithAllFields:
      value:
        name: New Customer
        addressDetails:
          address: 28 Rue de Mogador
          zipCode: "75009"
          city: Paris
          country: FR
        contact:
          name: Jean Du Jardin
          details:
            - type: Mobile
              description: Personal mobile number
              value: "+608012601"
            - type: Email
              description: Work email
              value: john.doe@company.com
            - type: Phone
              description: ""
              value: "987654321"
            - type: Fax
              description: Office fax
              value: "+1122334455"
        description: New Customer Description
        officeCode: ac81fde
        customFields:
          textCustomFieldCode:
            textValue: I am a text field
          checkBoxCustomFieldCode:
            booleanValue: true
          dateCustomFieldCode:
            dateValue: 2024-12-25
          dateTimeCustomFieldCode:
            dateTimeValue: 2024-12-25T12:15
          timeCustomFieldCode:
            timeValue: 12:15
          dropDownCustomFieldCode:
            dropDownValue: I am a drop down text
          urlCustomFieldCode:
            urlValue: https://www.praxedo.fr/
          gpsCustomFieldCode:
            gpsValue:
              longitude: 48.8567
              latitude: 2.3508
    NewCustomerWithMandatoryFieldsOnly:
      value:
        name: New Customer
        addressDetails:
          city: Paris
        officeCode: ac81fde
        customFields:
          mandatoryTextCustomFieldCode:
            textValue: I am a text field
    UpdateCustomerWithAllFields:
      value:
        name: Customer to update
        addressDetails:
          address: 1 Rue d'Aubervilliers
          zipCode: "75019"
          city: Paris
          country: FR
        contact:
          name: Jean Du Jardin
          details:
            - type: Mobile
              description: Personal mobile number
              value: "+7234567890"
            - type: Email
              description: Work email
              value: john.doe@company.com
            - type: Phone
              description: ""
              value: "987654321"
            - type: Fax
              description: Office fax
              value: "+1122334455"
        description: Update customer description
        officeCode: ac81fde
        customFields:
          textCustomFieldCode:
            textValue: I am a text field
          checkBoxCustomFieldCode:
            booleanValue: true
          dateCustomFieldCode:
            dateValue: 2024-12-25
          dateTimeCustomFieldCode:
            dateTimeValue: 2024-12-25T12:15
          timeCustomFieldCode:
            timeValue: 12:15
          dropDownCustomFieldCode:
            dropDownValue: I am a drop down text
          urlCustomFieldCode:
            urlValue: https://www.praxedo.fr/
          gpsCustomFieldCode:
            gpsValue:
              longitude: 48.8567
              latitude: 2.3508
    UpdateCustomerWithMandatoryFieldsOnly:
      value:
        name: Customer name to update
        addressDetails:
          city: Paris
        officeCode: ac81fde
        customFields:
          mandatoryTextCustomFieldCode:
            textValue: I am a text field
    NewSubCustomer:
      value:
        name: New sub customer
        parentCustomerCode: a56tgj89
        addressDetails:
          address: 87 rue Assas
          zipCode: "75006"
          city: Paris
          country: FR
        contact:
          name: Louis Julien
          details:
            - type: Mobile
              description: Personal mobile number
              value: "+7234567890"
            - type: Email
              description: Work email
              value: louis.julien@company.com
            - type: Phone
              description: ""
              value: "0143263361"
            - type: Fax
              description: Office fax
              value: "+1122334455"
        description: New sub customer description
        officeCode: df89edd
        customFields:
          textCustomFieldCode:
            textValue: I am a text field
          checkBoxCustomFieldCode:
            booleanValue: true
          dateCustomFieldCode:
            dateValue: 2024-12-25
          dateTimeCustomFieldCode:
            dateTimeValue: 2024-12-25T12:15
          timeCustomFieldCode:
            timeValue: 12:15
          dropDownCustomFieldCode:
            dropDownValue: I am a drop down text
          urlCustomFieldCode:
            urlValue: https://www.praxedo.fr/
          gpsCustomFieldCode:
            gpsValue:
              longitude: 48.8567
              latitude: 2.3508
    NewRootSiteWithAllFields:
      value:
        name: New Site
        customerCode: CUSTOMER01
        location:
          addressDetails:
            address: 28 Rue de Mogador
            zipCode: "75009"
            city: Paris
            country: FR
          geolocation:
            latitude: 48.8567
            longitude: 2.3508
        contact:
          name: Jane Doe
          details:
            - type: Mobile
              description: Personal mobile number
              value: "+7234567890"
            - type: Email
              description: Work email
              value: john.doe@company.com
            - type: Phone
              description: ""
              value: 987654321
            - type: Fax
              description: Office fax
              value: "+1122334455"
        description: New Site Description
        officeCode: ac81fde
        customFields:
          textCustomFieldCode:
            textValue: I am a text field
          checkBoxCustomFieldCode:
            booleanValue: true
          dateCustomFieldCode:
            dateValue: 2024-12-25
          dateTimeCustomFieldCode:
            dateTimeValue: 2024-12-25T12:15
          timeCustomFieldCode:
            timeValue: 12:15
          dropDownCustomFieldCode:
            dropDownValue: I am a drop down text
          urlCustomFieldCode:
            urlValue: https://www.praxedo.fr/
          gpsCustomFieldCode:
            gpsValue:
              longitude: 48.8567
              latitude: 2.3508
    NewSiteWithMandatoryFieldsOnly:
      value:
        name: New Site
        customerCode: CUSTOMER01
        location:
          addressDetails:
            address: 28 Rue de Mogador
            city: Paris
        officeCode: ac81fde
        customFields:
          mandatoryTextCustomFieldCode:
            textValue: I am a text field
    UpdateSiteWithAllFields:
      value:
        name: Site to update
        customerCode: CUSTOMER01
        parentSiteCode: SITE_0
        location:
          addressDetails:
            address: 89 rue de la Victoire
            zipCode: "75009"
            city: Paris
            country: FR
          geolocation:
            latitude: 0
            longitude: 0
        contact:
          name: Jane Doe
          details:
            - type: Mobile
              description: Personal mobile number
              value: "+7234567890"
            - type: Email
              description: Work email
              value: john.doe@company.com
            - type: Phone
              description: ""
              value: 987654321
            - type: Fax
              description: Office fax
              value: "+1122334455"
        description: Update Site Description
        officeCode: ac81fde
        customFields:
          textCustomFieldCode:
            textValue: I am a text field
          checkBoxCustomFieldCode:
            booleanValue: true
          dateCustomFieldCode:
            dateValue: 2024-12-25
          dateTimeCustomFieldCode:
            dateTimeValue: 2024-12-25T12:15
          timeCustomFieldCode:
            timeValue: 12:15
          dropDownCustomFieldCode:
            dropDownValue: I am a drop down text
          urlCustomFieldCode:
            urlValue: https://www.praxedo.fr/
          gpsCustomFieldCode:
            gpsValue:
              longitude: 48.8567
              latitude: 2.3508
    UpdateSiteWithMandatoryFieldsOnly:
      value:
        name: New Site
        customerCode: CUSTOMER02
        location:
          addressDetails:
            address: 89 rue de la Victoire
            city: Paris
        officeCode: ac81fde
        customFields:
          mandatoryTextCustomFieldCode:
            textValue: I am a text field
    NewSubSite:
      value:
        name: New sub site
        customerCode: CUSTOMER02
        parentSiteCode: SITE_0
        location:
          addressDetails:
            address: 106 rue de la Fayette
            zipCode: "75010"
            city: Paris
            country: FR
          geolocation:
            latitude: 0
            longitude: 0
        contact:
          name: David Smith
          details:
            - type: Mobile
              description: Personal mobile number
              value: "+7234567890"
            - type: Email
              description: Work email
              value: louis.julien@company.com
            - type: Phone
              description: ""
              value: "0143263361"
            - type: Fax
              description: Office fax
              value: "+1122334455"
        description: New sub site description
        officeCode: df89edd
        customFields:
          textCustomFieldCode:
            textValue: I am a text field
          checkBoxCustomFieldCode:
            booleanValue: true
          dateCustomFieldCode:
            dateValue: 2024-12-25
          dateTimeCustomFieldCode:
            dateTimeValue: 2024-12-25T12:15
          timeCustomFieldCode:
            timeValue: 12:15
          dropDownCustomFieldCode:
            dropDownValue: I am a drop down text
          urlCustomFieldCode:
            urlValue: https://www.praxedo.fr/
          gpsCustomFieldCode:
            gpsValue:
              longitude: 48.8567
              latitude: 2.3508
    NewAssetWithAllFields:
      value:
        label: Fridge RC400
        siteCode: MCDOPA75009
        assetTypeCode: FRIDGE
        officeCode: OFFICE_PARIS
        description: Fridge RC400 for restauration
        commissioning:
          startDate: 2021-06-08
          status: ACTIVE
        customFields:
          textCustomFieldCode:
            textValue: 24 months
          checkBoxCustomFieldCode:
            booleanValue: true
          dropDownCustomFieldCode:
            dropDownValue: High
          urlCustomFieldCode:
            urlValue: https://asset-manual.com
          dateCustomFieldCode:
            dateValue: 2024-12-25
          dateTimeCustomFieldCode:
            dateTimeValue: 2024-12-25T10:00
          timeCustomFieldCode:
            timeValue: 10:00
          gpsCustomFieldCode:
            gpsValue:
              longitude: 48.8567
              latitude: 2.3508
    NewAssetWithMandatoryFieldsOnly:
      value:
        label: Motor RC129
        siteCode: SITE_001
        assetTypeCode: MOTOR
        customFields:
          mandatoryTextCustomFieldCode:
            textValue: Mandatory field value
    UpdateAssetWithAllFields:
      value:
        label: Updated Fridge RC400
        siteCode: MCDOPA75009
        assetTypeCode: FRIDGE
        officeCode: OFFICE_PARIS
        description: Fridge RC400 for restauration
        commissioning:
          startDate: 2021-05-08
          status: ACTIVE
        customFields:
          textCustomFieldCode:
            textValue: 24 months
          checkBoxCustomFieldCode:
            booleanValue: true
          dropDownCustomFieldCode:
            dropDownValue: High
          urlCustomFieldCode:
            urlValue: https://asset-manual.com
          dateCustomFieldCode:
            dateValue: 2024-12-25
          dateTimeCustomFieldCode:
            dateTimeValue: 2024-12-25T10:00
          timeCustomFieldCode:
            timeValue: 10:00
          gpsCustomFieldCode:
            gpsValue:
              longitude: 48.8567
              latitude: 2.3508
    UpdateAssetWithMandatoryFieldsOnly:
      value:
        label: Updated Basic Asset
        siteCode: SITE_001
        assetTypeCode: BASIC
        customFields:
          mandatoryTextCustomFieldCode:
            textValue: Updated mandatory value
    NewSubAsset:
      value:
        label: Sub asset
        siteCode: FACTORY_SITE
        assetTypeCode: PTO
        officeCode: MAINTENANCE_OFFICE
        parentAssetCode: BOX
        description: Sub component of telecom installation
        commissioning:
          startDate: 2023-03-20
          status: ACTIVE
        customFields:
          textCustomFieldCode:
            textValue: SN123456789
          checkBoxCustomFieldCode:
            booleanValue: false
          dropDownCustomFieldCode:
            dropDownValue: Low
          urlCustomFieldCode:
            urlValue: https://sub-asset-doc.com
          dateCustomFieldCode:
            dateValue: 2024-11-01
          dateTimeCustomFieldCode:
            dateTimeValue: 2024-12-15T09:00
          timeCustomFieldCode:
            timeValue: 09:00
          gpsCustomFieldCode:
            gpsValue:
              longitude: 48.8567
              latitude: 2.3508
    SubscriptionRequest:
      value:
        - callback:
            url: https://callback.example.com/webhooks
            secret: z0nstsmkmrvve4nzc26pu3ky80zsdorlh
            headers:
              - name: x-pxo-custom_header_name_1
                value: value of the custom header 1
              - name: x-pxo-custom_header_name_2
                value: value of the custom header 2
          eventTypes:
            - name: workorder.deletion
    SubscriptionRequestNoSecret:
      value:
        - callback:
            url: https://callback.example.com/webhooks
          eventTypes:
            - name: workorder.deletion
    SubscriptionRequestNoCustomHeaders:
      value:
        - callback:
            url: https://callback.example.com/webhooks
            secret: z0nstsmkmrvve4nzc26pu3ky80zsdorlh
          eventTypes:
            - name: workorder.deletion
    SubscriptionSuccessfullyCreated:
      summary: Subscription created successfully
      value:
        - id: abcdefghijklmnopqrstuvwxyz
          eventTypes:
            - name: workorder.deletion
    EmptyListSubscriptions:
      summary: Empty subscription list
      value:
        subscriptions: []
    ListSubscriptions:
      summary: Subscription list successfully retrieved
      value:
        subscriptions:
          - id: "1"
            status: ACTIVE
            callback:
              url: https://callback.example.com/webhooks
              secret: z0nstsmkmrvve4nzc26pu3ky80zsdorlh
              headers:
                - name: x-pxo-custom_header_name_1
                  value: value of the custom header 1
                - name: x-pxo-custom_header_name_2
                  value: value of the custom header 2
            eventTypes:
              - name: workorder.validation
              - name: workorder.deletion
              - name: asset.upsert
          - id: "2"
            status: INACTIVE
            callback:
              url: https://callback.example.com/webhooks
              headers: []
            eventTypes:
              - name: workorder.deletion
    WorkOrderValidationEvent:
      summary: Work order validation callback
      value:
        version: "1"
        id: 5c84b579-ae20-4e40-be1d-e8e57a96cb48
        creationTime: "2025-08-08T09:34:00.768098881Z"
        eventType: workorder.validation
        subscriptionId: WEHS_251210151605_94OU25
        data:
          validatedAt: "2025-08-08T09:33:59.436326071Z"
          workorderCode: "00091"
          workorderUuid: bd5917fa-3c70-490c-911f-c95aa02e6df4
          officeCode: "00091"
          actor:
            type: webUser
            identifier: user@company.com
    WorkOrderDeletionEvent:
      summary: Work order deletion callback
      value:
        version: "1"
        id: 5c84b579-ae20-4e40-be1d-e8e57a96cb48
        creationTime: "2025-08-08T09:34:00.768098881Z"
        eventType: workorder.deletion
        subscriptionId: WEHS_251210151605_94OU25
        data:
          deletedAt: "2025-08-08T09:33:59.436326071Z"
          workorderCode: "00091"
          workorderUuid: bd5917fa-3c70-490c-911f-c95aa02e6df4
          officeCode: "00091"
          actor:
            type: webUser
            identifier: user@company.com
    AssetUpsertEvent:
      summary: Asset upsert callback
      value:
        version: "1"
        id: a1b2c3d4-e5f6-7890-abcd-ef1234567890
        creationTime: "2025-09-17T17:17:35.000000000Z"
        eventType: asset.upsert
        subscriptionId: WEHS_251210151605_94OU25
        data:
          updatedAt: "2025-09-17T17:17:35.000000000Z"
          assetCode: A-456
          officeCode: Office-1
          actor:
            type: webUser
            identifier: user@company.com
    ListEmptyResponse:
      value:
        continuationToken: null
        data: []
    ItemWithCustomFields:
      value:
        itemCode: WMOUSE_324
        name: Wireless mouse
        itemCategoryCode: IT_ACCESSORIES
        dimensions: 1
        attributes:
          isGeneric: false
          isParentItem: false
          hasFixedQuantity: false
          availableOnMobile: true
        tracking:
          trackedInStock: true
        billingParameters:
          invoiceMode: INTERNAL
        customFields:
          WARRANTY:
            textValue: 24 months
          REFURBISHED:
            booleanValue: false
          SUPPLIER_LINK:
            urlValue: https://www.logitech.com
        lastUpdate: 2025-11-09T23:30:00.0Z
    ItemListWithMorePagesResponse:
      value:
        continuationToken: c2FqZGhmYmtrMzQ1YiBrZiA5MyBrYmdrcTg3MjMgazg5bm4gICAwNCAgbmVpcnQ4NzkzbiBnb3A4NA==
        data:
          - itemCode: WMOUSE_324
            name: Wireless mouse
            reference: 21348146
            itemCategoryCode: PHERIPHERICS
            description: Wireless mouse for PCs
            barCode: "032160165400"
            manufacturer: Asus
            dimensions: 1
            attributes:
              isGeneric: true
              isParentItem: false
              hasFixedQuantity: true
              availableOnMobile: true
            tracking:
              trackedInStock: true
              serialNumberFormat: null
            billingParameters:
              priceDetails:
                unitPrice: 22.9
                vatRates:
                  - 0.09
                  - 0.12
                  - 0.19
                displayPriceOnMobile: true
                displayPriceOnWeb: ALWAYS
              invoiceMode: EXTERNAL
            customFields:
              WARRANTY:
                textValue: 24 months
              REFURBISHED:
                booleanValue: false
              SUPPLIER_LINK:
                urlValue: https://www.logitech.com
            lastUpdate: 2025-11-09T23:30:00.0Z
          - itemCode: KEYBOARD_012
            name: Gaming keyboard
            reference: null
            itemCategoryCode: PHERIPHERICS
            description: null
            manufacturer: Asus
            barCode: null
            dimensions: 3
            attributes:
              isGeneric: false
              isParentItem: false
              isFixedQuantity: true
              isAvailableOnMobileDevices: true
            tracking:
              trackedInStock: true
              serialNumberFormat: ^SN2024-ALPHA-[0-9]{5}$
            billingParameters:
              priceDetails: null
              invoiceMode: INTERNAL
            lastUpdate: 2025-10-12T09:00:00.0Z
    ItemListLastPageResponse:
      value:
        continuationToken: null
        data:
          - itemCode: USB_STICK_32GB
            name: USB Stick
            reference: null
            itemCategoryCode: PHERIPHERICS
            description: USB Stick with 32 GB RAM
            barCode: "34756834569"
            manufacturer: LG
            dimensions: 1
            attributes:
              isGeneric: false
              isParentItem: false
              hasFixedQuantity: false
              availableOnMobile: true
            tracking:
              trackedInStock: false
              serialNumberFormat: ^[A-Z]{3}-[0-9]{3}-[A-Z]{3}&
            billingParameters:
              priceDetails: false
              invoiceMode: INTERNAL
            lastUpdate: 2025-11-19T15:00:50.0Z
    CharacteristicListWithMorePagesResponse:
      value:
        continuationToken: c2FqZGhmYmtrMzQ1YiBrZiA5MyBrYmdrcTg3MjMgazg5bm4gICAwNCAgbmVpcnQ4NzkzbiBnb3A4NA==
        data:
          - characteristicCode: CRANE_20M
            name: Crane 20M
            lastUpdate: 2025-11-09T23:30:00.0Z
          - characteristicCode: CRANE_30M
            name: Crane 30M
            lastUpdate: 2025-11-09T23:30:00.0Z
          - characteristicCode: CRANE_ELEC
            name: Electric crane
            lastUpdate: 2025-11-09T23:30:00.0Z
          - characteristicCode: CRANE_THERM
            name: Thermic crane
            lastUpdate: 2025-11-09T23:30:00.0Z
    CharacteristicListLastPageResponse:
      value:
        continuationToken: null
        data:
          - characteristicCode: CRANE_20M
            name: Crane 20M
            lastUpdate: 2025-11-09T23:30:00.0Z
          - characteristicCode: CRANE_30M
            name: Crane 30M
            lastUpdate: 2025-11-09T23:30:00.0Z
          - characteristicCode: CRANE_ELEC
            name: Electric crane
            lastUpdate: 2025-11-09T23:30:00.0Z
          - characteristicCode: CRANE_THERM
            name: Thermic crane
            lastUpdate: 2025-11-09T23:30:00.0Z
    SkillListWithMorePagesResponse:
      value:
        continuationToken: c2FqZGhmYmtrMzQ1YiBrZiA5MyBrYmdrcTg3MjMgazg5bm4gICAwNCAgbmVpcnQ4NzkzbiBnb3A4NA==
        data:
          - skillCode: Fiber
            name: FTTH
            lastUpdate: 2025-11-09T23:30:00.0Z
          - skillCode: HIGH
            name: High
            lastUpdate: 2025-11-09T23:30:00.0Z
          - skillCode: HV
            name: High voltage
            lastUpdate: 2025-11-09T23:30:00.0Z
          - skillCode: LV
            name: Low voltage
            lastUpdate: 2025-11-09T23:30:00.0Z
    SkillListLastPageResponse:
      value:
        continuationToken: null
        data:
          - skillCode: Fiber
            name: FTTH
            lastUpdate: 2025-11-09T23:30:00.0Z
          - skillCode: HIGH
            name: High
            lastUpdate: 2025-11-09T23:30:00.0Z
          - skillCode: HV
            name: High voltage
            lastUpdate: 2025-11-09T23:30:00.0Z
          - skillCode: LV
            name: Low voltage
            lastUpdate: 2025-11-09T23:30:00.0Z
    CustomerWithMandatoryFieldsOnly:
      value:
        customerCode: customer-b0ee57c9
        parentCustomerCode: null
        name: Customer name
        addressDetails:
          address: null
          zipCode: null
          city: Paris
          country: null
        contact: null
        description: null
        officeCode: office-ac81dkl
        customFields:
          textCustomFieldCode:
            textValue: Value of mandatory custom field
          urlCustomFieldCode:
            urlValue: null
          dateCustomFieldCode:
            dateValue: null
        lastUpdate: 2024-09-12T13:00:27.836330Z
    CustomerWithoutCustomFieldsDefined:
      value:
        customerCode: customer-b0ee57c9
        parentCustomerCode: null
        name: Customer name
        addressDetails:
          address: null
          zipCode: null
          city: Paris
          country: null
        contact: null
        description: null
        officeCode: office-ac81dkl
        customFields: {}
        lastUpdate: 2024-09-12T13:00:27.836330Z
    CustomerWithAllFieldsDefined:
      value:
        customerCode: customer-b0ee57c9
        name: Super Customer
        parentCustomerCode: null
        addressDetails:
          address: 10 Boulevard Raspail
          zipCode: "75007"
          city: Paris
          country: FR
        contact:
          name: Jean Du Jardin
          details:
            - type: Mobile
              description: Personal mobile number
              value: "+7234567890"
            - type: Email
              description: Work email
              value: jean.dujardin@company.com
            - type: Phone
              description: ""
              value: 987654321
            - type: Fax
              description: Office fax
              value: "+1122334455"
        description: Super customer description
        officeCode: office-ac81dkl
        customFields:
          checkBoxCustomFieldCode:
            booleanValue: true
          dateCustomFieldCode:
            dateValue: 2024-12-11
          dropDownCustomFieldCode:
            dropDownValue: Option selected for drop down field
        lastUpdate: 2024-09-12T13:00:27.836330Z
    SubCustomerWithMandatoryFieldsOnly:
      value:
        customerCode: customer-bbcdef123
        name: Sub customer
        parentCustomerCode: customer-a0ee57c9
        addressDetails:
          address: null
          zipCode: null
          city: Paris
          country: null
        contact: null
        description: null
        officeCode: office-ac81dkl
        customFields:
          textCustomFieldCode:
            textValue: null
          dateCustomFieldCode:
            dateValue: null
        lastUpdate: 2024-09-12T13:00:27.836330Z
    SubCustomerWithAllFieldsDefined:
      value:
        customerCode: customer-bbcdef123
        name: Super sub customer
        parentCustomerCode: customer-a0ee57c9
        addressDetails:
          address: 10 Boulevard Raspail
          zipCode: "75007"
          city: Paris
          country: FR
        contact:
          name: Rommain Duris
          details:
            - type: Mobile
              description: Personal mobile number
              value: "+7234567890"
            - type: Email
              description: Work email
              value: romain.duris@company.com
            - type: Phone
              description: ""
              value: 987654321
            - type: Fax
              description: Office fax
              value: "+1122334455"
        description: Super sub customer description
        officeCode: office-ac81dkl
        customFields:
          dropDownCustomFieldCode:
            dropDownValue: Drop down text value
          urlCustomFieldCode:
            urlValue: https://www.domain.fr/
          dateTimeCustomFieldCode:
            dateTimeValue: 2024-11-13T12:15
        lastUpdate: 2024-09-12T13:00:27.836330Z
    CustomerWithCustomFields:
      value:
        customerCode: customer-ksahf34h
        parentCustomerCode: null
        name: Customer with custom data
        addressDetails:
          address: null
          zipCode: null
          city: Nice
          country: null
        contact: null
        description: null
        officeCode: office-ksah8671
        customFields:
          textCustomFieldCode:
            textValue: Value of text field
          checkboxCustomFieldCode:
            booleanValue: true
          dropDownCustomFieldCode:
            dropDownValue: Option selected in drop down field
          urlCustomFieldCode:
            urlValue: https://www.domain.fr/link
          dateCustomFieldCode:
            dateValue: 2024-12-11
          dateTimeCustomFieldCode:
            dateTimeValue: 2024-12-11T15:30
          timeCustomFieldCode:
            timeValue: 15:30
          gpsCustomFieldCode:
            gpsValue:
              latitude: 34.293
              longitude: 132.321
        lastUpdate: 2024-12-11T16:50:00.836330Z
    SiteWithMandatoryFieldsOnly:
      value:
        siteCode: site-123456
        name: Site Chatelet
        customerCode: customer-b0ee57c9
        parentSiteCode: null
        officeCode: PARIS
        description: null
        location:
          addressDetails:
            address: 23 Rue des Lombards
            zipCode: null
            city: Paris
            country: null
          geolocation: null
        contact: null
        lastUpdate: 2024-09-12T13:00:27.836330Z
    SiteWithAllFieldsDefined:
      value:
        siteCode: site-123456
        name: Site Chatelet
        customerCode: customer-b0ee57c9
        parentSiteCode: null
        officeCode: PARIS
        description: Super site description
        location:
          addressDetails:
            address: 23 Rue des Lombards
            zipCode: "75004"
            city: Paris
            country: FR
          geolocation:
            latitude: 48.875567
            longitude: 2.331379
        contact:
          name: Jean Du Jardin
          details:
            - type: Mobile
              description: Personal mobile number
              value: "+7234567890"
            - type: Email
              description: Work email
              value: john.doe@company.com
        customFields:
          textCustomFieldCode:
            textValue: Code of gate 1234#
          checkBoxCustomFieldCode:
            booleanValue: true
          dateCustomFieldCode:
            dateValue: 2024-11-13
          timeCustomFieldCode:
            timeValue: 12:15
          dropDownCustomFieldCode:
            dropDownValue: VIP
        lastUpdate: 2024-09-12T13:00:27.836330Z
    SubSiteWithMandatoryFieldsOnly:
      value:
        siteCode: site-123456
        name: Site Chatelet
        customerCode: customer-b0ee57c9
        parentSiteCode: site-1
        officeCode: PARIS
        description: null
        location:
          addressDetails:
            address: 23 Rue des Lombards
            zipCode: null
            city: Paris
            country: null
          geolocation: null
        contact: null
        lastUpdate: 2024-09-12T13:00:27.836330Z
    SubSiteWithAllFieldsDefined:
      value:
        siteCode: site-123456
        name: Site Chatelet
        customerCode: customer-b0ee57c9
        parentSiteCode: site-1
        officeCode: PARIS
        description: A super sub site
        location:
          addressDetails:
            address: 23 Rue des Lombards
            zipCode: "75004"
            city: Paris
            country: FR
          geolocation:
            latitude: 48.875567
            longitude: 2.331379
        contact:
          name: Jean Du Jardin
          details:
            - type: Mobile
              description: Personal mobile number
              value: "+1234567890"
            - type: Email
              description: Work email
              value: john.doe@company.com
        customFields:
          timeCustomFieldCode:
            timeValue: 12:15
          dropDownCustomFieldCode:
            dropDownValue: Code of gate 1234#
          gpsCustomFieldCode:
            gpsValue:
              longitude: 48.8567
              latitude: 2.3508
          urlCustomFieldCode:
            urlValue: https://www.praxedo.fr/
          dateTimeCustomFieldCode:
            dateTimeValue: 2024-11-13T12:15
        lastUpdate: 2024-09-12T13:00:27.836330Z
    SiteWithCustomFields:
      value:
        siteCode: site-123456
        name: Site Chatelet
        customerCode: customer-b0ee57c9
        officeCode: office-123456
        location:
          addressDetails:
            address: 23 Rue des Lombards
            city: Paris
        customFields:
          checkBoxCustomFieldCode:
            booleanValue: true
          timeCustomFieldCode:
            timeValue: 12:15
          gpsCustomFieldCode:
            gpsValue:
              longitude: 48.8567
              latitude: 2.3508
          urlCustomFieldCode:
            urlValue: https://www.praxedo.fr/
          dateTimeCustomFieldCode:
            dateTimeValue: 2024-11-13T12:15
        lastUpdate: 2024-09-12T13:00:27.836330Z
    AssetWithMandatoryFieldsOnly:
      value:
        assetCode: MOTOR_001
        label: Motor dyson
        customerCode: LISI
        siteCode: LISI_VERNON
        assetTypeCode: MOTOR
        lastUpdate: 2024-09-12T13:00:27.836330Z
    AssetWithoutCustomFieldsDefined:
      value:
        assetCode: MOTOR_001
        label: Motor dyson
        customerCode: LISI
        siteCode: LISI_VERNON
        assetTypeCode: MOTOR
        officeCode: IDF
        description: Electrical motor for factory engines
        commissioning:
          startDate: 2024-01-15
          status: ACTIVE
        lastUpdate: 2024-09-12T13:00:27.836330Z
    AssetWithAllFieldsDefined:
      value:
        assetCode: PTO_8273
        label: PTO_8273DUJAR
        customerCode: CUSTOMER_001
        siteCode: SITE-28E82
        assetTypeCode: PTO
        officeCode: PARIS
        parentAssetCode: BOX
        description: PTO of Mr Dujardin
        commissioning:
          startDate: 2021-06-08
          status: INACTIVE
        lastUpdate: 2024-09-12T13:00:27.836330Z
        customFields:
          textCustomFieldCode:
            textValue: 24 months
          checkBoxCustomFieldCode:
            booleanValue: true
          dropDownCustomFieldCode:
            dropDownValue: High
          urlCustomFieldCode:
            urlValue: https://asset-manual.com
          dateCustomFieldCode:
            dateValue: 2024-12-25
          dateTimeCustomFieldCode:
            dateTimeValue: 2024-12-25T10:00
          timeCustomFieldCode:
            timeValue: 10:00
          gpsCustomFieldCode:
            gpsValue:
              longitude: 48.8567
              latitude: 2.3508
    SubAssetWithMandatoryFieldsOnly:
      value:
        assetCode: SUB_001
        label: Sub Component
        customerCode: CUSTOMER_001
        siteCode: SITE_001
        assetTypeCode: COMPONENT
        parentAssetCode: MAIN_001
        lastUpdate: 2024-09-12T13:00:27.836330Z
    SubAssetWithAllFieldsDefined:
      value:
        assetCode: PUMP_001
        label: Water Pump System
        customerCode: CUSTOMER_001
        siteCode: FACTORY_SITE
        assetTypeCode: PUMP
        officeCode: MAINTENANCE_OFFICE
        parentAssetCode: WATER_SYSTEM
        description: Primary water pump for cooling system
        commissioning:
          startDate: 2023-03-20
          status: ACTIVE
        lastUpdate: 2024-09-12T13:00:27.836330Z
        customFields:
          textCustomFieldCode:
            textValue: SN123456789
          checkBoxCustomFieldCode:
            booleanValue: false
          dropDownCustomFieldCode:
            dropDownValue: Low
          urlCustomFieldCode:
            urlValue: https://sub-asset-doc.com
          dateCustomFieldCode:
            dateValue: 2024-11-01
          dateTimeCustomFieldCode:
            dateTimeValue: 2024-12-15T09:00
          timeCustomFieldCode:
            timeValue: 09:00
          gpsCustomFieldCode:
            gpsValue:
              longitude: 48.8567
              latitude: 2.3508
    CustomerGetBadRequestMissingCode:
      value:
        errors:
          - code: referentials.customer.code.mandatory
            message: Missing code in path.
        errorReference: 669b11d0ae8145aa9b106b049091b371
    CustomerPutBadRequestMissingAddressDetails:
      value:
        errors:
          - code: referentials.customer.addressdetails.mandatory
            message: Property addressDetails is required.
        errorReference: 88Hb11d0ae8145aa9b106b049091b371
    CustomerPutBadRequestMissingCity:
      value:
        errors:
          - code: referentials.customer.city.mandatory
            message: Property city is required.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    CustomerPutBadRequestMissingCode:
      value:
        errors:
          - code: referentials.customer.code.mandatory
            message: Missing code in path.
        errorReference: 669b11d0ae8145aa9b106b049091b371
    CustomerPutBadRequestMissingName:
      value:
        errors:
          - code: referentials.customer.name.mandatory
            message: Property name is required.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    CustomerPutBadRequestMissingCustomField:
      value:
        errors:
          - code: referentials.customer.custom.field.mandatory
            message: Custom field 'custom_foo_bar' is required.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    CustomerPutBadRequestInvalidJSON:
      value:
        errors:
          - code: referentials.customer.invalid.json
            message: Invalid Json format.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    CustomerPutBadRequestDuplicatedField:
      value:
        errors:
          - code: referentials.customer.invalid.json
            message: Duplicate field 'name'.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    CustomerPutBadRequestUnknownField:
      value:
        errors:
          - code: referentials.customer.field.unknown
            message: The field 'foo_bar' is unknown. Please correct your JSON request.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    CustomerPutBadRequestOfficeUnknown:
      value:
        errors:
          - code: referentials.customer.office.unknown
            message: The organizational unit 'DUMMY' is unknown.
        errorReference: 669b11d0ae8145aa9b106b049091b371
    CustomerPutBadRequestParentCustomerUnknown:
      value:
        errors:
          - code: referentials.customer.parent.unknown
            message: The parent customer 'DUMMY' is unknown.
        errorReference: 669b11d0ae8145aa9b106b049091b371
    CustomerPutBadRequestParentCustomerIdentical:
      value:
        errors:
          - code: referentials.customer.parent.identical
            message: The customer cannot be its own parent.
        errorReference: 669b11d0ae8145aa9b106b049091b371
    CustomerPutBadRequestParentCustomerChild:
      value:
        errors:
          - code: referentials.customer.office.hierarchy.error
            message: The customer parent is also a child of the customer.
        errorReference: 669b11d0ae8145aa9b106b049091b371
    CustomerPutBadRequestHierarchyLevels:
      value:
        errors:
          - code: referentials.customer.office.hierarchy.error
            message: Hierarchy contains 10 or more levels.
        errorReference: 669b11d0ae8145aa9b106b049091b371
    CustomerNotFoundResponse:
      value:
        errors:
          - code: referentials.customer.not.found
            message: Customer not found.
        errorReference: 6ef95ca524154a35bcc21e0d482bd07b
    SiteGetBadRequestMissingCode:
      value:
        errors:
          - code: referentials.site.code.mandatory
            message: Missing code in path.
        errorReference: 779b11d0ae8145aa9b106b049091b972
    SitePutBadRequestMissingAddressDetails:
      value:
        errors:
          - code: referentials.site.addressdetails.mandatory
            message: Property addressDetails is required.
        errorReference: 88Hb11d0ae8145aa9b106b049091b371
    SitePutBadRequestMissingCity:
      value:
        errors:
          - code: referentials.site.city.mandatory
            message: Property city is required.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    SitePutBadRequestMissingCode:
      value:
        errors:
          - code: referentials.site.code.mandatory
            message: Missing code in path
        errorReference: 669b11d0ae8145aa9b106b049091b371
    SitePutBadRequestMissingName:
      value:
        errors:
          - code: referentials.site.name.mandatory
            message: Property name is required.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    SitePutBadRequestMissingCustomer:
      value:
        errors:
          - code: referentials.site.customer.mandatory
            message: Property customer is required.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    SitePutBadRequestMissingCustomField:
      value:
        errors:
          - code: referentials.site.custom.field.mandatory
            message: Custom field 'custom_foo_bar' is required.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    SitePutBadRequestInvalidJSON:
      value:
        errors:
          - code: referentials.site.invalid.json
            message: Invalid Json format.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    SitePutBadRequestDuplicatedField:
      value:
        errors:
          - code: referentials.site.invalid.json
            message: Duplicate field 'name'.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    SitePutBadRequestUnknownField:
      value:
        errors:
          - code: referentials.site.field.unknown
            message: The field 'foo_bar' is unknown. Please correct your JSON request.
        errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
    SitePutBadRequestOfficeUnknown:
      value:
        errors:
          - code: referentials.site.office.unknown
            message: The organizational unit 'DUMMY' is unknown.
        errorReference: 669b11d0ae8145aa9b106b049091b371
    SitePutBadRequestCustomerUnknown:
      value:
        errors:
          - code: referentials.site.customer.unknown
            message: The customer 'DUMMY' is unknown.
        errorReference: 669b11d0ae8145aa9b106b049091b371
    SitePutBadRequestParentSiteUnknown:
      value:
        errors:
          - code: referentials.site.parent.unknown
            message: The parent site 'DUMMY' is unknown.
        errorReference: 669b11d0ae8145aa9b106b049091b371
    SitePutBadRequestParentSiteIdentical:
      value:
        errors:
          - code: referentials.site.parent.identical
            message: The site cannot be its own parent.
        errorReference: 669b11d0ae8145aa9b106b049091b371
    SitePutBadRequestParentSiteChild:
      value:
        errors:
          - code: referentials.site.hierarchy.error
            message: The site parent is also a child of the site.
        errorReference: 669b11d0ae8145aa9b106b049091b371
    SitePutBadRequestHierarchyLevels:
      value:
        errors:
          - code: referentials.site.office.hierarchy.error
            message: Hierarchy contains 10 or more levels.
        errorReference: 669b11d0ae8145aa9b106b049091b371
    SiteNotFoundResponse:
      value:
        errors:
          - code: referentials.site.not.found
            message: Site not found.
        errorReference: 7gf95ca524154a35bcc21e0d482bd567hg
    CustomerNotFoundInSiteResponse:
      value:
        errors:
          - code: referentials.customer.not.found
            message: Customer not found.
        errorReference: 8ef95ca524154a35bcc21e0d482bd0fg8
    AssetGetBadRequestMissingCode:
      value:
        errors:
          - code: referentials.asset.code.mandatory
            message: Missing code in path.
        errorReference: 779b11d0ae8145aa9b106b049091b972
    AssetNotFoundResponse:
      value:
        errors:
          - code: referentials.asset.code.notfound
            message: Asset with code 'ASSET_001' not found.
        errorReference: 669b11d0ae8145aa9b106b049091b371
    MissingRequestBody:
      value:
        - errors:
            - code: subscription.missing.body
              message: The request body is mandatory.
          errorReference: abcdefghijklmnopqrstuvwxyz0123456789
    MissingPropertyCallback:
      value:
        - errors:
            - code: subscription.property.missing
              message: The callback property is mandatory.
          errorReference: abcdefghijklmnopqrstuvwxyz0123456789
    MissingPropertyCallbackUrl:
      value:
        - errors:
            - code: subscription.property.missing
              message: The callback.url property is mandatory.
          errorReference: abcdefghijklmnopqrstuvwxyz0123456789
    MissingPropertyEventTypes:
      value:
        - errors:
            - code: subscription.property.missing
              message: The eventTypes property is mandatory.
          errorReference: abcdefghijklmnopqrstuvwxyz0123456789
    EventTypesEmptyList:
      value:
        - errors:
            - code: subscription.eventtypes.size
              message: The eventTypes list cannot be empty.
          errorReference: abcdefghijklmnopqrstuvwxyz0123456789
    EventTypesTooManyElements:
      value:
        - errors:
            - code: subscription.eventtypes.size
              message: The eventTypes list cannot exceed 3 elements.
          errorReference: abcdefghijklmnopqrstuvwxyz0123456789
    EventTypesWrongEventType:
      value:
        - errors:
            - code: subscription.eventtypes.invalid
              message: The eventType 'DUMMY' is not valid.
          errorReference: abcdefghijklmnopqrstuvwxyz0123456789
    CallbackWrongUrlFormat:
      value:
        - errors:
            - code: subscription.callback.format
              message: The format of property callback.url is not valid. It should be a secure
                url.
          errorReference: abcdefghijklmnopqrstuvwxyz0123456789
    CallbackUrlMaxLength:
      value:
        - errors:
            - code: subscription.callback.format
              message: The property callback.url should not exceed 2000 characters.
          errorReference: abcdefghijklmnopqrstuvwxyz0123456789
    CallbackSecretMaxLength:
      value:
        - errors:
            - code: subscription.callback.format
              message: The property callback.secret should not exceed 512 characters.
          errorReference: abcdefghijklmnopqrstuvwxyz0123456789
    CallbackHeaderNameLength:
      value:
        - errors:
            - code: subscription.callback.format
              message: The property callback.headers.name should not exceed 40 characters.
          errorReference: abcdefghijklmnopqrstuvwxyz0123456789
    CallbackHeaderValueLength:
      value:
        - errors:
            - code: subscription.callback.format
              message: The property callback.headers.value should not exceed 512 characters.
          errorReference: abcdefghijklmnopqrstuvwxyz0123456789
    CallbackHeaderNameFormat:
      value:
        - errors:
            - code: subscription.callback.format
              message: The format of property callback.headers.name is invalid. It should be
                'x-pxo-{custom_name}'
          errorReference: abcdefghijklmnopqrstuvwxyz0123456789
    CallbackHeaderNameMissing:
      value:
        - errors:
            - code: subscription.property.missing
              message: The name of property callback.headers.name is missing.
          errorReference: abcdefghijklmnopqrstuvwxyz0123456789
    CallbackHeaderNameDuplicate:
      value:
        - errors:
            - code: subscription.callback.format
              message: The property callback.headers has duplicate names.
          errorReference: abcdefghijklmnopqrstuvwxyz0123456789
    MaximumSubscriptionsReached:
      summary: Subscription limit reached for the user
      value:
        - errors:
            - code: subscription.max.size
              message: Maximum of subscription reached.
          errorReference: f1028f99811b422eb21f5ff176664069
    DiagnosticStandardNoteRequest:
      summary: Standard free-text note
      value:
        noteTypeCode: STANDNOTE
        author: DHA
        date: 2025-11-05T14:32:00Z
        content:
          text: "Gate code is #9292"
        visibility:
          technician: true
          customerPortalUser: false
    DiagnosticIncomingCallNoteRequest:
      summary: Incoming call note (coordinates required)
      value:
        noteTypeCode: INC
        author: DHA
        date: 2025-11-05T14:32:00Z
        coordinates: "+33612345678"
        content:
          text: Customer called to confirm appointment.
        visibility:
          technician: false
          customerPortalUser: false
    DiagnosticOutgoingCallNoteRequest:
      summary: Outgoing call note (coordinates required)
      value:
        noteTypeCode: OUT
        author: DHA
        date: 2025-11-05T16:05:00Z
        coordinates: "+33698765432"
        content:
          text: Called customer back to reschedule the visit to next Tuesday.
        visibility:
          technician: true
          customerPortalUser: false
    DiagnosticReportBasedNoteCreateRequest:
      summary: Report-based note - creation, one item per field type
      value:
        noteTypeCode: NFORM
        author: DHA
        date: 2025-11-05T14:32:00Z
        content:
          reportFields:
            REASON:
              dropDownValue: Reschedule
            CALLBACK_DATE:
              dateValue: 2025-12-01
            CALLBACK_TIME:
              timeValue: 14:30
            CONTACT_NAME:
              textValue: John Smith
            VIP?:
              booleanValue: false
            PARTS_COUNT:
              numericValue: 3
            PROCEDURE_LINK:
              urlValue: https://intranet.acme.com/procedures/reschedule
        visibility:
          technician: true
          customerPortalUser: false
    DiagnosticReportBasedNoteUpdateRequest:
      summary: Report-based note - update of an existing note's status field
      value:
        noteTypeCode: NFORM
        author: DHA
        date: 2025-11-06T09:12:00Z
        content:
          reportFields:
            REASON:
              dropDownValue: Resolved
            CONTACT_NAME:
              textValue: John Smith
        visibility:
          technician: true
          customerPortalUser: false
    DiagnosticNotePutBadRequestMissingWoCodeInPath:
      value:
        errors:
          - code: diagnostic.workorders.code.mandatory
            message: Missing code in path.
        errorReference: abcdefghij0123456789
    DiagnosticNotePutBadRequestMissingNoteCodeInPath:
      value:
        errors:
          - code: diagnostic.workorders.note.code.mandatory
            message: Missing code in path.
        errorReference: abcdefghij0123456789
    DiagnosticNotePutBadRequestUnknownWorkOrder:
      value:
        errors:
          - code: diagnostic.workorders.code.unknown
            message: The work order [WO-2025-004821] is unknown. It don't exisits or it is
              outside oauth2 hierarchy.
        errorReference: 123e4567-e89b-12d3-a456-426614174000
    DiagnosticNotePutBadRequestUnknownNoteTypeCode:
      value:
        errors:
          - code: diagnostic.workorders.note.noteTypeCode.unknown
            message: The note type code [NFORM] is unknown.
        errorReference: 223e4567-e89b-12d3-a456-426614174001
    DiagnosticNotePutBadRequestUnknownReportFieldCode:
      value:
        errors:
          - code: diagnostic.workorders.note.content.reportFields.code.unknown
            message: The report fields code [BUDGET] us unknown.
        errorReference: 323e4567-e89b-12d3-a456-426614174002
    DiagnosticNotePutBadRequestDateFormat:
      value:
        errors:
          - code: diagnostic.workorders.note.date.format
            message: Date don't respect expected format.
        errorReference: 423e4567-e89b-12d3-a456-426614174003
    DiagnosticNotePutBadRequestReportFieldValueFormat:
      value:
        errors:
          - code: diagnostic.workorders.note.content.reportFields.value.format
            message: The report fields [PARTS_COUNT] value don't respect expected format.
        errorReference: 523e4567-e89b-12d3-a456-426614174004
    DiagnosticNotePutBadRequestMissingNoteTypeCode:
      value:
        errors:
          - code: diagnostic.workorders.note.noteTypeCode.mandatory
            message: Property noteTypeCode is required.
        errorReference: 623e4567-e89b-12d3-a456-426614174005
    DiagnosticNotePutBadRequestMissingContent:
      value:
        errors:
          - code: diagnostic.workorders.note.content.mandatory
            message: Property content is required.
        errorReference: 723e4567-e89b-12d3-a456-426614174006
    DiagnosticNotePutBadRequestMissingContentText:
      value:
        errors:
          - code: diagnostic.workorders.note.content.text.mandatory
            message: Property content.text is required for standard notes.
        errorReference: 823e4567-e89b-12d3-a456-426614174007
    DiagnosticNotePutBadRequestMissingContentReportFields:
      value:
        errors:
          - code: diagnostic.workorders.note.content.reportFields.mandatory
            message: Property content.reportFields is required for custom notes.
        errorReference: 923e4567-e89b-12d3-a456-426614174008
    DiagnosticNotePutBadRequestMissingContentFieldsMandatory:
      value:
        errors:
          - code: diagnostic.workorders.note.content.fields.mandatory
            message: Fields [code] is required for custom notes.
        errorReference: 923e4567-e89b-12d3-a456-426614175838
    DiagnosticNotePutBadRequestMissingCoordinates:
      value:
        errors:
          - code: diagnostic.workorders.note.coordinates.mandatory
            message: Property coordinates is required for call notes.
        errorReference: a23e4567-e89b-12d3-a456-426614174009
    DiagnosticNotePutBadRequestDateInFuture:
      value:
        errors:
          - code: diagnostic.workorders.note.date.futur
            message: A date cannot be set in the futur
        errorReference: b23e4567-e89b-12d3-a456-426614174010
    DiagnosticNotePutBadRequestInvalidJSON:
      value:
        errors:
          - code: diagnostic.workorders.note.invalid.json
            message: Invalid Json format.
        errorReference: c23e4567-e89b-12d3-a456-426614174011
    DiagnosticSetWorkOrderFlagsRequest:
      summary: Replace the work order flags with a new set
      value:
        flags:
          ids:
            - 1
            - 2
            - 4
            - 8
    DiagnosticClearWorkOrderFlagsRequest:
      summary: Clear all flags on the work order
      value:
        flags:
          ids: []
    DiagnosticFlagsPutBadRequestUnknownWorkOrder:
      value:
        errors:
          - code: diagnostic.workorders.code.unknown
            message: The work order [WO-2025-004821] is unknown. It don't exisits or it is
              outside oauth2 hierarchy.
        errorReference: 123e4567-e89b-12d3-a456-426614174000
    DiagnosticFlagsPutBadRequestUnknownFlagCode:
      value:
        errors:
          - code: diagnostic.workorders.flags.code.unknown
            message: The flag code [16] is unknown.
        errorReference: 223e4567-e89b-12d3-a456-426614174001
    DiagnosticFlagsPutBadRequestMissingWoCodeInPath:
      value:
        errors:
          - code: diagnostic.workorders.code.mandatory
            message: Missing code in path.
        errorReference: 323e4567-e89b-12d3-a456-426614174002
    DiagnosticFlagsPutBadRequestMissingFlags:
      value:
        errors:
          - code: diagnostic.workorders.flags.mandatory
            message: Property flags is required.
        errorReference: 423e4567-e89b-12d3-a456-426614174003
    DiagnosticFlagsPutBadRequestFlagsFormat:
      value:
        errors:
          - code: diagnostic.workorders.flags.format
            message: Each flag must be an integer that is a power of 2.
        errorReference: 523e4567-e89b-12d3-a456-426614174004
    DiagnosticFlagsPutBadRequestInvalidJSON:
      value:
        errors:
          - code: diagnostic.workorders.invalid.json
            message: Invalid Json format.
        errorReference: 623e4567-e89b-12d3-a456-426614174005
    SlotSearchMinimal:
      summary: Minimal — appointment date, work order type and postal address only
      value:
        endCustomer:
          need:
            workOrder:
              code: MAINTENANCE
            dispatchLocation:
              address: 28 rue de Mogador, 75009 Paris
          availabilities:
            appointmentDate: 2026-11-03T08:00:00.000Z
    SlotSearchWithRequirements:
      summary: Over a set of time ranges, with a geographic location, a duration/skill override and an office filter
      value:
        endCustomer:
          need:
            workOrder:
              code: FIBER_INSTALL
              overrides:
                duration: PT1H30M
                skillsRequirement:
                  additionalSkills:
                    - code: FIBER
                      constraint: MANDATORY
            dispatchLocation:
              coordinates:
                latitude: 48.8755905
                longitude: 2.3287881
          availabilities:
            ranges:
              - start: 2026-11-03T07:00:00.000Z
                end: 2026-11-03T17:00:00.000Z
              - start: 2026-11-04T07:00:00.000Z
                end: 2026-11-04T12:00:00.000Z
        schedulerRequirements:
          fieldResourceWorkingFor:
            offices:
              - code: PARIS_NORD
            childrenOfficesIncluded: true
          workingHours:
            ignoreFieldResourceBreak: false
    SlotSearchWithConfiguration:
      summary: Over a multi-day range, limiting result size and using a sampling policy
      value:
        endCustomer:
          need:
            workOrder:
              code: MAINTENANCE
            dispatchLocation:
              address: 1 Place de la Comedie, 34000 Montpellier
          availabilities:
            ranges:
              - start: 2026-11-10T08:00:00.000Z
                end: 2026-11-14T18:00:00.000Z
        slotSearchConfiguration:
          searchSize:
            maximumSlotNumber: 100
          servedSlots:
            perTimeInterval: BEST
          mustExplainResults: false
    SlotSearchIgnoreCapacityModel:
      summary: Ignore the field resources' capacity model when computing the slots
      value:
        endCustomer:
          need:
            workOrder:
              code: MAINTENANCE
            dispatchLocation:
              address: 28 rue de Mogador, 75009 Paris
          availabilities:
            ranges:
              - start: 2026-11-03T07:00:00.000Z
                end: 2026-11-03T17:00:00.000Z
        schedulerRequirements:
          workingHours:
            ignoreFieldResourceCapacityModel: true
    SchedulingScheduleTimeRangeRequest:
      summary: Time range, report filler, main resource, technician and equipment crew
      value:
        schedulerRequirements:
          notificationSent: true
        timeWindow:
          scheduleMode: TIME_RANGE
          startDate: 2026-04-10T10:00:00.000+02:00
          endDate: 2026-04-10T12:00:00.000+02:00
        fieldResources:
          reportFillerCode: tech-55
          mainResourceCode: tech-55
          technicianCrewCodes:
            - tech-88
            - tech-98
          equipmentCrewCodes:
            - truck-04
    SchedulingScheduleDayRangeRequest:
      summary: Several whole days, report filler, main resource and crew
      value:
        schedulerRequirements:
          notificationSent: false
        timeWindow:
          scheduleMode: DAY_RANGE
          timezone: Europe/Paris
          startDay: 2026-04-10
          endDay: 2026-04-11
        fieldResources:
          reportFillerCode: tech-55
          mainResourceCode: tech-55
          technicianCrewCodes:
            - tech-88
            - tech-98
          equipmentCrewCodes:
            - truck-04
    SchedulingScheduleSingleDayRequest:
      summary: One day, without hours
      value:
        timeWindow:
          scheduleMode: DAY_RANGE
          timezone: Europe/Paris
          startDay: 2026-04-10
          endDay: 2026-04-10
        fieldResources:
          reportFillerCode: tech-55
    SchedulingScheduleMandatoryFieldsRequest:
      summary: Minimal payload for a qualified work order
      value:
        timeWindow:
          scheduleMode: TIME_RANGE
          startDate: 2026-04-10T08:00:00.000Z
          endDate: 2026-04-10T10:00:00.000Z
        fieldResources:
          reportFillerCode: tech-55
    SchedulingScheduleSkipControlsRequest:
      summary: Reschedule an in-progress work order over another work order and outside the appointment
      value:
        schedulerRequirements:
          skipControls:
            - inProgressStatus
            - workOrderOverlap
            - appointmentRespect
          notificationSent: true
        timeWindow:
          scheduleMode: TIME_RANGE
          startDate: 2026-04-10T14:00:00.000+02:00
          endDate: 2026-04-10T16:00:00.000+02:00
        fieldResources:
          reportFillerCode: tech-55
          mainResourceCode: tech-55
    SchedulingScheduleFieldResourcesOnlyRequest:
      summary: Change the main resource only, keep the time window
      value:
        fieldResources:
          mainResourceCode: tech-42
    SchedulingScheduleEmptyRequest:
      summary: Leave the scheduling untouched
      value: {}
    SchedulingSchedulePutBadRequestUnknownWorkOrder:
      value:
        errors:
          - code: scheduling.workorders.code.unknown
            message: 'The work order [WO-2026-00123] is unknown. It doesn''t exist or it is outside the authorized hierarchy'
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestUnknownTechnician:
      value:
        errors:
          - code: scheduling.workorders.schedule.fieldResources.technicianCrew.unknown
            message: The technician [tech-88] is unknown or outside the authorized hierarchy
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestUnknownEquipment:
      value:
        errors:
          - code: scheduling.workorders.schedule.fieldResources.equipmentCrew.unknown
            message: The equipment [truck-04] is unknown or outside the authorized hierarchy
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestUnknownMainResource:
      value:
        errors:
          - code: scheduling.workorders.schedule.fieldResources.mainResource.unknown
            message: The field resource [tech-42] is neither a known technician nor a known equipment, or is outside the authorized hierarchy
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestMissingWoCodeInPath:
      value:
        errors:
          - code: scheduling.workorders.code.mandatory
            message: Missing code in path.
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestInvalidUuid:
      value:
        errors:
          - code: scheduling.workorder.uuid.invalid
            message: Invalid work order UUID format
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestInvalidJSON:
      value:
        errors:
          - code: scheduling.workorders.schedule.invalid.json
            message: Invalid Json format.
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestMissingTimeWindow:
      value:
        errors:
          - code: scheduling.workorders.schedule.timewindow.mandatory
            message: A time window is required to schedule a qualified work order
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestMissingReportFiller:
      value:
        errors:
          - code: scheduling.workorders.schedule.fieldResources.reportFiller.mandatory
            message: A report filler is required to schedule a qualified work order
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestEquipmentWithoutTechnician:
      value:
        errors:
          - code: scheduling.workorders.schedule.fieldResources.technicianCrew.mandatory
            message: Equipment cannot be scheduled without a technician
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestScheduleModeInvalid:
      value:
        errors:
          - code: scheduling.workorders.schedule.timewindow.scheduleMode.mandatory
            message: Property timeWindow.scheduleMode must be TIME_RANGE or DAY_RANGE.
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestUnknownSkipControl:
      value:
        errors:
          - code: scheduling.workorders.schedule.schedulerRequirements.skipControls.unknown
            message: Unknown skipControls value [ignoreSkills].
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestDateFormat:
      value:
        errors:
          - code: scheduling.workorders.schedule.timewindow.dates.format
            message: 'Date [10/04/2026] don''t respect expected format.'
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestDateOrder:
      value:
        errors:
          - code: scheduling.workorders.schedule.timewindow.dates.order
            message: The end of the time window must be strictly after its start
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestNegativeDuration:
      value:
        errors:
          - code: scheduling.workorders.schedule.timewindow.duration.negative
            message: The computed duration is negative
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestDurationExceeded:
      value:
        errors:
          - code: scheduling.workorders.schedule.timewindow.duration.exceeded
            message: The requested slot exceeds the maximum allowed scheduling duration
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestStartExceeded:
      value:
        errors:
          - code: scheduling.workorders.schedule.timewindow.start.exceeded
            message: The requested start date is beyond the maximum allowed horizon
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestWorkingHoursViolation:
      value:
        errors:
          - code: scheduling.workorders.schedule.timewindow.workinghours.violation
            message: 'The requested time window falls outside the technician''s working hours'
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestTourExceedsWorkingDay:
      value:
        errors:
          - code: scheduling.workorders.schedule.timewindow.workinghours.violation
            message: 'The resulting tour exceeds the technician''s working day'
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestSubscriptionInvalid:
      value:
        errors:
          - code: scheduling.workorders.schedule.fieldresources.subscription.invalid
            message: An assigned field resource subscription is missing or terminated
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestOfficeMismatch:
      value:
        errors:
          - code: scheduling.workorders.schedule.fieldresources.office.mismatch
            message: An assigned field resource does not belong to the expected office hierarchy
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestSkillMissing:
      value:
        errors:
          - code: scheduling.workorders.schedule.fieldresources.skill.missing
            message: The assigned crew does not hold a skill required by the work order
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestCharacteristicsMissing:
      value:
        errors:
          - code: scheduling.workorders.schedule.fieldresources.characteristics.missing
            message: The assigned equipment does not hold a characteristic required by the work order
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestStatusInvalid:
      value:
        errors:
          - code: scheduling.workorders.schedule.status.invalid
            message: The work order [WO-2026-00123] cannot be scheduled in its current status
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestRejected:
      value:
        errors:
          - code: scheduling.workorders.schedule.rejected
            message: Message raised by the scheduling engine for a rule not listed above.
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestTechnicianWorkOrderOverlap:
      value:
        errors:
          - code: scheduling.workorders.schedule.fieldresources.techniciancrew.workorderoverlap
            message: Another work order is already scheduled on this time window
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestEquipmentWorkOrderOverlap:
      value:
        errors:
          - code: scheduling.workorders.schedule.fieldresources.equipmentcrew.workOrderoverlap
            message: A machine is already scheduled on another work order for this time window
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestTechnicianUnavailable:
      value:
        errors:
          - code: scheduling.workorders.schedule.fieldresources.techniciancrew.timeoverlap
            message: A technician is unavailable for this time window
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestEquipmentUnavailable:
      value:
        errors:
          - code: scheduling.workorders.schedule.fieldresources.equipmentcrew.timeoverlap
            message: A machine is unavailable for this time window
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestSlasViolation:
      value:
        errors:
          - code: scheduling.workorders.schedule.timeWindow.slas.violation
            message: 'The requested time window falls outside the work order''s SLA hours'
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    SchedulingSchedulePutBadRequestAppointmentViolation:
      value:
        errors:
          - code: scheduling.workorders.schedule.timeWindow.appointment.violation
            message: 'The requested time window falls outside the work order''s appointment hours'
        errorReference: 723e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkLastRequest:
      summary: Link the work order after every job of the project
      value:
        type: workOrder
        code: WO-2026-00123
        insertion:
          insertionMode: last
    ProjectManagementProjectLinkAtIndexRequest:
      summary: Link the work order at the 4th position (zero-based index 3)
      value:
        type: workOrder
        code: WO-2026-00123
        insertion:
          insertionMode: index
          position: 3
    ProjectManagementProjectLinkAfterTaskRequest:
      summary: Link the work order after a task of the project
      value:
        type: workOrder
        code: WO-2026-00123
        insertion:
          insertionMode: after
          relativePosition: "12333"
          jobType: task
    ProjectManagementProjectLinkBeforePhaseRequest:
      summary: Link the work order before a phase of the project
      value:
        type: workOrder
        code: WO-2026-00123
        insertion:
          insertionMode: before
          relativePosition: PHASE-1
    ProjectManagementProjectLinkWithDependenciesRequest:
      summary: Link the work order first, blocking a task and blocked by another work order
      value:
        type: workOrder
        code: WO-2026-00123
        insertion:
          insertionMode: first
          block:
            - jobType: task
              code: "0003"
          isBlockedBy:
            - jobType: workOrder
              code: WO-2026-00124
    ProjectManagementProjectLinkMandatoryFieldsRequest:
      summary: Link the work order last, without dependency
      value:
        type: workOrder
        code: WO-2026-00123
    ProjectManagementServiceOrderLinkLastRequest:
      summary: Link the work order after every work order of the service order
      value:
        code: WO-2026-00123
    ProjectManagementServiceOrderLinkFirstRequest:
      summary: Link the work order before every work order of the service order
      value:
        code: WO-2026-00123
        insertion:
          insertionMode: first
    ProjectManagementServiceOrderLinkAtIndexRequest:
      summary: Link the work order at the 3rd position (zero-based index 2)
      value:
        code: WO-2026-00123
        insertion:
          insertionMode: index
          position: 2
    ProjectManagementServiceOrderLinkAfterRequest:
      summary: Link the work order after another work order of the service order
      value:
        code: WO-2026-00123
        insertion:
          insertionMode: after
          relativePosition: WO-2026-00120
    ProjectManagementProjectLinkBadRequestUnknownProject:
      value:
        errors:
          - code: projectmanagement.project.code.unknown
            message: 'The project PRJ-2026-0007 is unknown. It doesn''t exist or it is outside oauth2 hierarchy.'
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestUnknownWorkOrder:
      value:
        errors:
          - code: projectmanagement.project.job.code.unknown
            message: 'The work order WO-2026-00123 is unknown. It doesn''t exist or it is outside oauth2 hierarchy.'
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestAmbiguousWorkOrder:
      value:
        errors:
          - code: projectmanagement.workorder.code.ambiguous
            message: Several work orders carry the code WO-2026-00123.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestUnknownRelativePosition:
      value:
        errors:
          - code: projectmanagement.insertion.relativePosition.unknown
            message: The job 12333 is not one of the jobs the project holds.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestSelfRelativePosition:
      value:
        errors:
          - code: projectmanagement.insertion.relativePosition.unknown
            message: The work order WO-2026-00123 cannot be positioned relative to itself.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestUnknownBlock:
      value:
        errors:
          - code: projectmanagement.project.block.code.unknown
            message: A job named in insertion.block is not one of the jobs the project holds.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestUnknownIsBlockedBy:
      value:
        errors:
          - code: projectmanagement.project.isBlockedBy.code.unknown
            message: A job named in insertion.isBlockedBy is not one of the jobs the project holds.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestMissingProjectCode:
      value:
        errors:
          - code: projectmanagement.project.code.mandatory
            message: Missing project code in path.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestMissingType:
      value:
        errors:
          - code: projectmanagement.project.job.type.mandatory
            message: Property type is required.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestUnknownType:
      value:
        errors:
          - code: projectmanagement.project.job.type.unknown
            message: 'The type ''task'' is unknown. Only ''workorder'' is supported.'
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestMissingCode:
      value:
        errors:
          - code: projectmanagement.project.job.code.mandatory
            message: Property code is required.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestUnknownInsertionMode:
      value:
        errors:
          - code: projectmanagement.insertion.insertionMode.unknown
            message: 'The insertion mode ''middle'' is unknown.'
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestMissingPosition:
      value:
        errors:
          - code: projectmanagement.insertion.position.mandatory
            message: 'Property insertion.position is required when insertion.insertionMode is ''index''.'
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestNegativePosition:
      value:
        errors:
          - code: projectmanagement.insertion.position.invalid
            message: Property insertion.position cannot be negative.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestMissingRelativePosition:
      value:
        errors:
          - code: projectmanagement.insertion.relativePosition.mandatory
            message: 'Property insertion.relativePosition is required when insertion.insertionMode is ''after''.'
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestUnknownJobType:
      value:
        errors:
          - code: projectmanagement.insertion.jobType.unknown
            message: 'The job type ''milestone'' is unknown.'
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestMissingBlockCode:
      value:
        errors:
          - code: projectmanagement.project.block.code.mandatory
            message: Property code is required on every insertion.block entry.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestMissingBlockJobType:
      value:
        errors:
          - code: projectmanagement.project.block.jobType.mandatory
            message: Property jobType is required on every insertion.block entry.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestUnknownBlockJobType:
      value:
        errors:
          - code: projectmanagement.project.block.jobType.unknown
            message: 'The job type ''phase'' is unknown. Use ''task'' or ''workOrder''.'
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestMissingIsBlockedByCode:
      value:
        errors:
          - code: projectmanagement.project.isBlockedBy.code.mandatory
            message: Property code is required on every insertion.isBlockedBy entry.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestMissingIsBlockedByJobType:
      value:
        errors:
          - code: projectmanagement.project.isBlockedBy.jobType.mandatory
            message: Property jobType is required on every insertion.isBlockedBy entry.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestUnknownIsBlockedByJobType:
      value:
        errors:
          - code: projectmanagement.project.isBlockedBy.jobType.unknown
            message: 'The job type ''phase'' is unknown. Use ''task'' or ''workOrder''.'
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestInvalidJSON:
      value:
        errors:
          - code: projectmanagement.invalid.json
            message: Invalid Json format.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestUnknownField:
      value:
        errors:
          - code: projectmanagement.field.unknown
            message: 'The field ''priority'' is unknown. Please correct your JSON request.'
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestOfficeConflict:
      value:
        errors:
          - code: projectmanagement.project.office.conflict
            message: The project must be in equal or higher hierarchy of work order.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestStatusConflict:
      value:
        errors:
          - code: projectmanagement.project.status.conflict
            message: The project is completed, and takes no more work on.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestCurrentProjectStatusConflict:
      value:
        errors:
          - code: projectmanagement.workorder.currentproject.status.conflict
            message: The project the work order currently sits in is completed, and will not let it go.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestDependencyOfficeConflict:
      value:
        errors:
          - code: projectmanagement.project.block.office.conflict
            message: Dependencies can only be declared on a project filed on the office of the calling application or one of its descendants.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestDependencyCycle:
      value:
        errors:
          - code: projectmanagement.project.block.dependency.cycle
            message: 'The requested dependency would create a cycle between the project''s jobs.'
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestDependencyOverlap:
      value:
        errors:
          - code: projectmanagement.project.block.dependency.overlap
            message: 'The requested dependency is not allowed: the blocked job would have to start before the blocking one can.'
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementProjectLinkBadRequestRuleViolated:
      value:
        errors:
          - code: projectmanagement.rule.violated
            message: The operation was refused by a business rule.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementRouteServiceOrderLinkBadRequestUnknownRouteServiceOrder:
      value:
        errors:
          - code: projectmanagement.routeserviceorder.code.unknown
            message: 'The service order SO-2026-0042 is unknown. It doesn''t exist or it is outside oauth2 hierarchy.'
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementRouteServiceOrderLinkBadRequestUnknownWorkOrder:
      value:
        errors:
          - code: projectmanagement.routeserviceorder.workorder.code.unknown
            message: 'The work order WO-2026-00123 is unknown. It doesn''t exist or it is outside oauth2 hierarchy.'
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementServiceOrderLinkBadRequestUnknownRelativePosition:
      value:
        errors:
          - code: projectmanagement.insertion.relativePosition.unknown
            message: The work order WO-2026-00120 is not one of the work orders the service order carries.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementServiceOrderLinkBadRequestSelfRelativePosition:
      value:
        errors:
          - code: projectmanagement.insertion.relativePosition.unknown
            message: The work order WO-2026-00123 cannot be positioned relative to itself.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementServiceOrderLinkBadRequestMissingServiceOrderCode:
      value:
        errors:
          - code: projectmanagement.serviceorder.code.mandatory
            message: Missing service order code in path.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementRouteServiceOrderLinkBadRequestMissingCode:
      value:
        errors:
          - code: projectmanagement.routeserviceorder.workorder.code.mandatory
            message: Property code is required.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementServiceOrderLinkBadRequestUnknownInsertionMode:
      value:
        errors:
          - code: projectmanagement.insertion.insertionMode.unknown
            message: 'The insertion mode ''middle'' is unknown.'
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementServiceOrderLinkBadRequestMissingPosition:
      value:
        errors:
          - code: projectmanagement.insertion.position.mandatory
            message: 'Property insertion.position is required when insertion.insertionMode is ''index''.'
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementServiceOrderLinkBadRequestMissingRelativePosition:
      value:
        errors:
          - code: projectmanagement.insertion.relativePosition.mandatory
            message: 'Property insertion.relativePosition is required when insertion.insertionMode is ''after''.'
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementServiceOrderLinkBadRequestInvalidJSON:
      value:
        errors:
          - code: projectmanagement.invalid.json
            message: Invalid Json format.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementServiceOrderLinkBadRequestUnknownField:
      value:
        errors:
          - code: projectmanagement.field.unknown
            message: 'The field ''type'' is unknown. Please correct your JSON request.'
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementRouteServiceOrderLinkBadRequestOfficeConflict:
      value:
        errors:
          - code: projectmanagement.routeserviceorder.office.conflict
            message: The parent must be in equal or higher hierarchy of work order.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementRouteServiceOrderLinkBadRequestStatusConflict:
      value:
        errors:
          - code: projectmanagement.routeserviceorder.status.conflict
            message: The service order is completed or higher, and takes no more work on.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementRouteServiceOrderLinkBadRequestFull:
      value:
        errors:
          - code: projectmanagement.routeserviceorder.full
            message: The service order already carries the maximum number of work orders.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementRouteServiceOrderLinkBadRequestWorkOrderStatusConflict:
      value:
        errors:
          - code: projectmanagement.routeserviceorder.workorder.status.conflict
            message: The work order status does not allow it to join this service order.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementRouteServiceOrderLinkBadRequestTeamConflict:
      value:
        errors:
          - code: projectmanagement.routeserviceorder.team.conflict
            message: 'Work order team don''t match the service order one.'
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementServiceOrderLinkBadRequestCurrentServiceOrderConflict:
      value:
        errors:
          - code: projectmanagement.workorder.currentserviceorder.conflict
            message: The service order the work order currently sits in is completed or higher, and will not let it go.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementServiceOrderLinkBadRequestCurrentServiceOrderStatusConflict:
      value:
        errors:
          - code: projectmanagement.workorder.currentserviceorder.status.conflict
            message: The work order is completed or higher, and the route service order it currently sits in will not let it go.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementServiceOrderLinkBadRequestCurrentServiceOrderNotLinked:
      value:
        errors:
          - code: projectmanagement.workorder.currentserviceorder.notlinked
            message: The work order is not carried by the service order it is being taken out of.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementServiceOrderLinkBadRequestRuleViolated:
      value:
        errors:
          - code: projectmanagement.rule.violated
            message: The operation was refused by a business rule.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementStandardServiceOrderLinkBadRequestUnknownStandardServiceOrder:
      value:
        errors:
          - code: projectmanagement.standardserviceorder.code.unknown
            message: 'The service order SO-2026-0043 is unknown. It doesn''t exist or it is outside oauth2 hierarchy.'
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementStandardServiceOrderLinkBadRequestUnknownWorkOrder:
      value:
        errors:
          - code: projectmanagement.standardserviceorder.workorder.code.unknown
            message: 'The work order WO-2026-00123 is unknown. It doesn''t exist or it is outside oauth2 hierarchy.'
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementStandardServiceOrderLinkBadRequestMissingCode:
      value:
        errors:
          - code: projectmanagement.standardserviceorder.workorder.code.mandatory
            message: Property code is required.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementStandardServiceOrderLinkBadRequestOfficeConflict:
      value:
        errors:
          - code: projectmanagement.standardserviceorder.office.conflict
            message: The parent must be in equal or higher hierarchy of work order.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementStandardServiceOrderLinkBadRequestStatusConflict:
      value:
        errors:
          - code: projectmanagement.standardserviceorder.status.conflict
            message: The service order is completed or higher, and takes no more work on.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
    ProjectManagementStandardServiceOrderLinkBadRequestFull:
      value:
        errors:
          - code: projectmanagement.standardserviceorder.full
            message: The service order already carries the maximum number of work orders.
        errorReference: 823e4567-e89b-12d3-a456-426614174000
  responses:
    200_fieldTracking_positions:
      description: OK - List of technician positions.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/PositionListResponse"
          examples:
            Positions with more pages:
              value:
                continuationToken: c2FqZGhmYmtrMzQ1YiBrZiA5MyBrYmdrcTg3MjMgazg5bm4gICAwNCAgbmVpcnQ4NzkzbiBnb3A4NA==
                data:
                  - latitude: 48.8566
                    longitude: 2.3522
                    timestamp: 2025-10-25T08:05:00Z
                  - latitude: 48.8571
                    longitude: 2.3535
                    timestamp: 2025-10-25T08:06:42Z
                  - latitude: 48.8583
                    longitude: 2.3549
                    timestamp: 2025-10-25T08:08:15Z
                  - latitude: 48.8597
                    longitude: 2.3561
                    timestamp: 2025-10-25T08:10:30Z
                  - latitude: 48.8597
                    longitude: 2.3562
                    timestamp: 2025-10-25T08:12:05Z
            Last page:
              value:
                continuationToken: null
                data:
                  - latitude: 48.8602
                    longitude: 2.357
                    timestamp: 2025-10-25T08:14:00Z
                  - latitude: 48.8605
                    longitude: 2.3575
                    timestamp: 2025-10-25T08:16:20Z
                  - latitude: 48.8608
                    longitude: 2.358
                    timestamp: 2025-10-25T08:18:45Z
                  - latitude: 48.861
                    longitude: 2.3583
                    timestamp: 2025-10-25T08:20:10Z
                  - latitude: 48.8612
                    longitude: 2.3585
                    timestamp: 2025-10-25T08:22:30Z
            Empty result:
              value:
                continuationToken: null
                data: []
    200_fieldTracking_activities:
      description: OK - List of work order activities.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ActivityListResponse"
    400_fieldTracking_bad_request:
      description: Bad Request - continuation token error.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            Invalid continuation token:
              value:
                errors:
                  - code: fieldTracking.continuationToken.invalid
                    message: The provided continuation token does not respect the expected format.
                errorReference: 59ddc09a23159395367307ab95b1c41a
    404_fieldTracking_technician_not_found:
      description: Not Found - Technician not found.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            404 Work order not found:
              value:
                errors:
                  - code: fieldTracking.technician.notfound
                    message: Technician with code 'UNKNOWN_TECH' not found.
                errorReference: a745dc4c5a2b473aaf8ce94c9260aa8f
    404_fieldTracking_workOrder_not_found:
      description: Not Found - Work order not found.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            404 Work order not found:
              value:
                errors:
                  - code: fieldTracking.workOrder.notfound
                    message: Work order not found
                errorReference: a745dc4c5a2b473aaf8ce94c9260aa8f
    200_staff_characteristics:
      description: A list of characteristics.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/CharacteristicListResponse"
          examples:
            A list which has more pages to be loaded:
              $ref: "#/components/examples/CharacteristicListWithMorePagesResponse"
            The last page of a list:
              $ref: "#/components/examples/CharacteristicListLastPageResponse"
            Empty list:
              $ref: "#/components/examples/ListEmptyResponse"
    200_staff_skills:
      description: A list of skills.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/SkillListResponse"
          examples:
            A list which has more pages to be loaded:
              $ref: "#/components/examples/SkillListWithMorePagesResponse"
            The last page of a list:
              $ref: "#/components/examples/SkillListLastPageResponse"
            Empty list:
              $ref: "#/components/examples/ListEmptyResponse"
    201_staff_skill_created:
      content:
        application/json:
          examples:
            Skill created:
              value: ""
      description: Skill created.
    204_staff_skill_updated:
      content:
        application/json:
          examples:
            Skill updated:
              value: ""
      description: Skill updated.
    400_staff_bad_request:
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            Invalid continuation token:
              value:
                errors:
                  - code: referentials.continuationToken.invalid
                    message: The provided continuation token does not respect the expected format.
                errorReference: 59ddc09a23159395367307ab95b1c41a
      description: Bad Request - invalid continuation token.
    400_staff_skill_bad_request:
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            Missing code in path:
              value:
                errors:
                  - code: staff.skill.code.mandatory
                    message: Missing code in path.
                errorReference: 669b11d0ae8145aa9b106b049091b371
            Code exceeding limit:
              value:
                errors:
                  - code: staff.skill.code.length
                    message: The code length must not exceed 10 characters.
                errorReference: a569b11d0ae8145aa9b106b049091b371
            Name exceeding limit:
              value:
                errors:
                  - code: staff.skill.name.length
                    message: The name length must not exceed 30 characters.
                errorReference: k899b11d0ae8145aa9b106b049091b371
            Name Missing:
              value:
                errors:
                  - code: staff.skill.name.mandatory
                    message: Property name is required.
                errorReference: k899b11d0ae8145aa9b106b049091b371
      description: Bad Request - validation errors.
    200_referentials_customer:
      description: Customer found successfully.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/Customer"
          examples:
            Customer with mandatory fields only defined:
              $ref: "#/components/examples/CustomerWithMandatoryFieldsOnly"
            Customer without custom fields defined:
              $ref: "#/components/examples/CustomerWithoutCustomFieldsDefined"
            Customer with all fields defined:
              $ref: "#/components/examples/CustomerWithAllFieldsDefined"
            Sub Customer with mandatory fields only defined:
              $ref: "#/components/examples/SubCustomerWithMandatoryFieldsOnly"
            Sub Customer with all fields defined:
              $ref: "#/components/examples/SubCustomerWithAllFieldsDefined"
            Customer with custom fields:
              $ref: "#/components/examples/CustomerWithCustomFields"
    201_referentials_customer_created:
      content:
        application/json:
          examples:
            Customer created:
              value: ""
      description: Customer created.
    204_referentials_customer_updated:
      content:
        application/json:
          examples:
            Customer updated:
              value: ""
      description: Customer updated.
    400_referentials_customer_get_bad_request:
      description: Bad Request - validation errors.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            Missing code in path:
              $ref: "#/components/examples/CustomerGetBadRequestMissingCode"
    400_referentials_customer_put_bad_request:
      description: Bad Request - Validation errors
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            Missing addressDetails property:
              $ref: "#/components/examples/CustomerPutBadRequestMissingAddressDetails"
            Missing city property:
              $ref: "#/components/examples/CustomerPutBadRequestMissingCity"
            Missing code in path:
              $ref: "#/components/examples/CustomerPutBadRequestMissingCode"
            Missing name property:
              $ref: "#/components/examples/CustomerPutBadRequestMissingName"
            Missing mandatory custom field:
              $ref: "#/components/examples/CustomerPutBadRequestMissingCustomField"
            Invalid JSON:
              $ref: "#/components/examples/CustomerPutBadRequestInvalidJSON"
            Duplicated field:
              $ref: "#/components/examples/CustomerPutBadRequestDuplicatedField"
            Unknown field:
              $ref: "#/components/examples/CustomerPutBadRequestUnknownField"
            Office unknown:
              $ref: "#/components/examples/CustomerPutBadRequestOfficeUnknown"
            Parent customer unknown:
              $ref: "#/components/examples/CustomerPutBadRequestParentCustomerUnknown"
            Parent customer identical:
              $ref: "#/components/examples/CustomerPutBadRequestParentCustomerIdentical"
            Parent customer child of the customer:
              $ref: "#/components/examples/CustomerPutBadRequestParentCustomerChild"
            Too many hierarchy levels:
              $ref: "#/components/examples/CustomerPutBadRequestHierarchyLevels"
    404_referentials_customer_not_found:
      description: Customer not found.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            Customer not found:
              $ref: "#/components/examples/CustomerNotFoundResponse"
    200_referentials_site:
      description: Site found successfully.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/Site"
          examples:
            A site with mandatory fields only defined:
              $ref: "#/components/examples/SiteWithMandatoryFieldsOnly"
            A site with all fields defined:
              $ref: "#/components/examples/SiteWithAllFieldsDefined"
            A Sub Site with mandatory fields only defined:
              $ref: "#/components/examples/SubSiteWithMandatoryFieldsOnly"
            A Sub Site with all fields defined:
              $ref: "#/components/examples/SubSiteWithAllFieldsDefined"
            A site with custom fields:
              $ref: "#/components/examples/SiteWithCustomFields"
    201_referentials_site_created:
      content:
        application/json:
          examples:
            Site created:
              value: ""
      description: Site created.
    204_referentials_site_updated:
      content:
        application/json:
          examples:
            Site updated:
              value: ""
      description: Site updated.
    400_referentials_site_get_bad_request:
      description: Bad Request - validation errors.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            Missing site code in request:
              $ref: "#/components/examples/SiteGetBadRequestMissingCode"
    400_referentials_site_put_bad_request:
      description: Bad Request - validation errors
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            Missing addressDetails property:
              $ref: "#/components/examples/SitePutBadRequestMissingAddressDetails"
            Missing city property:
              $ref: "#/components/examples/SitePutBadRequestMissingCity"
            Missing code in path:
              $ref: "#/components/examples/SitePutBadRequestMissingCode"
            Missing name property:
              $ref: "#/components/examples/SitePutBadRequestMissingName"
            Missing customer property:
              $ref: "#/components/examples/SitePutBadRequestMissingCustomer"
            Missing mandatory custom field:
              $ref: "#/components/examples/SitePutBadRequestMissingCustomField"
            Invalid JSON:
              $ref: "#/components/examples/SitePutBadRequestInvalidJSON"
            Duplicated field:
              $ref: "#/components/examples/SitePutBadRequestDuplicatedField"
            Unknown field:
              $ref: "#/components/examples/SitePutBadRequestUnknownField"
            Office unknown:
              $ref: "#/components/examples/SitePutBadRequestOfficeUnknown"
            Customer unknown:
              $ref: "#/components/examples/SitePutBadRequestCustomerUnknown"
            Parent site unknown:
              $ref: "#/components/examples/SitePutBadRequestParentSiteUnknown"
            Parent site identical:
              $ref: "#/components/examples/SitePutBadRequestParentSiteIdentical"
            Parent site child of the site:
              $ref: "#/components/examples/SitePutBadRequestParentSiteChild"
            Too many hierarchy levels:
              $ref: "#/components/examples/SitePutBadRequestHierarchyLevels"
    404_referentials_site_not_found:
      description: Customer or Site not found.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            Site not found:
              $ref: "#/components/examples/SiteNotFoundResponse"
            Customer Not Found:
              $ref: "#/components/examples/CustomerNotFoundInSiteResponse"
    200_referentials_asset:
      description: Asset found successfully.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/Asset"
          examples:
            Asset with mandatory fields only defined:
              $ref: "#/components/examples/AssetWithMandatoryFieldsOnly"
            Asset without custom fields defined:
              $ref: "#/components/examples/AssetWithoutCustomFieldsDefined"
            Asset with all fields defined:
              $ref: "#/components/examples/AssetWithAllFieldsDefined"
            Sub Asset with mandatory fields only defined:
              $ref: "#/components/examples/SubAssetWithMandatoryFieldsOnly"
            Sub Asset with all fields defined:
              $ref: "#/components/examples/SubAssetWithAllFieldsDefined"
    400_referentials_asset_get_bad_request:
      description: Bad Request - validation errors.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            Missing site code in request:
              $ref: "#/components/examples/AssetGetBadRequestMissingCode"
    404_referentials_asset_not_found:
      description: Asset not found.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            Asset not found:
              $ref: "#/components/examples/AssetNotFoundResponse"
    200_businessOrganization_items:
      description: A list of items.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ItemListResponse"
          examples:
            A list which has more pages to be loaded:
              $ref: "#/components/examples/ItemListWithMorePagesResponse"
            The last page of a list:
              $ref: "#/components/examples/ItemListLastPageResponse"
            Empty list:
              $ref: "#/components/examples/ListEmptyResponse"
    400_businessOrganization_items_bad_request:
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            Invalid continuation token:
              value:
                errors:
                  - code: referentials.continuationToken.invalid
                    message: The provided continuation token does not respect the expected format.
                errorReference: 59ddc09a23159395367307ab95b1c41a
      description: Bad Request - invalid continuation token.
    200_businessOrganization_item:
      description: Item found successfully.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/Item"
          examples:
            Item with custom fields:
              $ref: "#/components/examples/ItemWithCustomFields"
    201_businessOrganization_item_created:
      content:
        application/json:
          examples:
            Item created:
              value: ""
      description: Item created.
    204_businessOrganization_item_updated:
      content:
        application/json:
          examples:
            Item updated:
              value: ""
      description: Item updated.
    400_businessOrganization_item_get_bad_request:
      description: Bad Request - validation errors
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            Missing code in path:
              $ref: "#/components/examples/ItemGetBadRequestMissingCode"
    400_businessOrganization_item_put_bad_request:
      description: Bad Request - validation errors
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            Missing code in path:
              $ref: "#/components/examples/ItemPutBadRequestMissingCode"
            Missing name property:
              $ref: "#/components/examples/ItemPutBadRequestMissingName"
            Missing itemCategoryCode property:
              $ref: "#/components/examples/ItemPutBadRequestMissingItemCategoryCode"
            Missing dimensions property:
              $ref: "#/components/examples/ItemPutBadRequestMissingDimensions"
            Missing attributes property:
              $ref: "#/components/examples/ItemPutBadRequestMissingAttributes"
            Missing attributes.isGeneric property:
              $ref: "#/components/examples/ItemPutBadRequestMissingIsGeneric"
            Missing attributes.isParentItem property:
              $ref: "#/components/examples/ItemPutBadRequestMissingIsParentItem"
            Missing attributes.hasFixedQuantity property:
              $ref: "#/components/examples/ItemPutBadRequestMissingHasFixedQuantity"
            Missing attributes.availableOnMobile property:
              $ref: "#/components/examples/ItemPutBadRequestMissingAvailableOnMobile"
            Missing billingParameters property:
              $ref: "#/components/examples/ItemPutBadRequestMissingBillingParameters"
            Missing invoiceMode property:
              $ref: "#/components/examples/ItemPutBadRequestMissingInvoiceMode"
            Name too long:
              $ref: "#/components/examples/ItemPutBadRequestNameTooLong"
            Reference too long:
              $ref: "#/components/examples/ItemPutBadRequestReferenceTooLong"
            Description too long:
              $ref: "#/components/examples/ItemPutBadRequestDescriptionTooLong"
            BarCode too long:
              $ref: "#/components/examples/ItemPutBadRequestBarCodeTooLong"
            Manufacturer too long:
              $ref: "#/components/examples/ItemPutBadRequestManufacturerTooLong"
            Serial number format too long:
              $ref: "#/components/examples/ItemPutBadRequestSerialNumberFormatTooLong"
            Invalid isGeneric value:
              $ref: "#/components/examples/ItemPutBadRequestInvalidIsGeneric"
            Invalid isParentItem value:
              $ref: "#/components/examples/ItemPutBadRequestInvalidIsParentItem"
            Invalid hasFixedQuantity value:
              $ref: "#/components/examples/ItemPutBadRequestInvalidHasFixedQuantity"
            Invalid availableOnMobile value:
              $ref: "#/components/examples/ItemPutBadRequestInvalidAvailableOnMobile"
            Invalid trackedInStock value:
              $ref: "#/components/examples/ItemPutBadRequestInvalidTrackedInStock"
            Invalid displayPriceOnMobile value:
              $ref: "#/components/examples/ItemPutBadRequestInvalidDisplayPriceOnMobile"
            Invalid dimensions value:
              $ref: "#/components/examples/ItemPutBadRequestInvalidDimensions"
            Invalid invoiceMode value:
              $ref: "#/components/examples/ItemPutBadRequestInvalidInvoiceMode"
            Invalid displayPriceOnWeb value:
              $ref: "#/components/examples/ItemPutBadRequestInvalidDisplayPriceOnWeb"
            Invalid vatRate value:
              $ref: "#/components/examples/ItemPutBadRequestInvalidVatRate"
            Item category unknown:
              $ref: "#/components/examples/ItemPutBadRequestItemCategoryUnknown"
            VatRates not null when unitPrice is zero or null:
              $ref: "#/components/examples/ItemPutBadRequestVatRatesNotNullWhenNoPrice"
            DisplayPriceOnMobile not null when unitPrice is zero or null:
              $ref: "#/components/examples/ItemPutBadRequestDisplayPriceOnMobileNotNullWhenNo\
                Price"
            DisplayPriceOnWeb not null when unitPrice is zero or null:
              $ref: "#/components/examples/ItemPutBadRequestDisplayPriceOnWebNotNullWhenNoPri\
                ce"
            Missing displayPriceOnMobile when unitPrice is greater than zero:
              $ref: "#/components/examples/ItemPutBadRequestMissingDisplayPriceOnMobile"
            DisplayPriceOnMobile true when availableOnMobile false:
              $ref: "#/components/examples/ItemPutBadRequestDisplayPriceOnMobileConflict"
            Missing displayPriceOnWeb when unitPrice is greater than zero:
              $ref: "#/components/examples/ItemPutBadRequestMissingDisplayPriceOnWeb"
            Invalid JSON:
              $ref: "#/components/examples/ItemPutBadRequestInvalidJSON"
            Duplicated field:
              $ref: "#/components/examples/ItemPutBadRequestDuplicatedField"
            Unknown field:
              $ref: "#/components/examples/ItemPutBadRequestUnknownField"
    404_businessOrganization_item_not_found:
      description: Not Found - The item code does not exist.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            Item code unknown:
              $ref: "#/components/examples/ItemGetNotFound"
    200_scheduling_workOrder:
      description: OK – Scheduling data for the requested work order.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/SchedulingResponse"
          examples:
            Full scheduling data:
              summary: Work order fully scheduled with crew and customer appointment
              value:
                schedule:
                  timeWindow:
                    startDate: 2026-04-10T09:00:00Z
                    endDate: 2026-04-10T10:00:00Z
                  fieldResources:
                    mainResourceCode: tech-55
                    technicianCrewCodes:
                      - tech-88
                      - tech-98
                    equipmentCrewCodes:
                      - truck-04
                customer:
                  geolocation:
                    lat: 48.8566
                    lng: 2.3522
                  appointment:
                    date: 2026-04-10T10:00:00Z
                    slot:
                      startDate: 2026-04-10T08:00:00Z
                      endDate: 2026-04-10T12:00:00Z
            Solo technician, no appointment:
              summary: Work order assigned to a single technician, no customer appointment
              value:
                schedule:
                  timeWindow:
                    startDate: 2026-04-10T14:00:00Z
                    endDate: 2026-04-10T16:00:00Z
                  fieldResources:
                    mainResourceCode: tech-55
                    technicianCrewCodes: null
                    equipmentCrewCodes: null
                customer:
                  geolocation:
                    lat: 48.8566
                    lng: 2.3522
                  appointment: null
            Main resource is equipment, no geolocation:
              summary: Equipment-led work order, geolocation unavailable, slot only
              value:
                schedule:
                  timeWindow:
                    startDate: 2026-04-11T08:00:00Z
                    endDate: 2026-04-11T09:30:00Z
                  fieldResources:
                    mainResourceCode: truck-04
                    technicianCrewCodes:
                      - tech-55
                    equipmentCrewCodes: null
                customer:
                  geolocation: null
                  appointment:
                    date: null
                    slot:
                      startDate: 2026-04-11T08:00:00Z
                      endDate: 2026-04-11T12:00:00Z
            No customer data:
              summary: Scheduled work order with no customer-facing data
              value:
                schedule:
                  timeWindow:
                    startDate: 2026-04-12T10:00:00Z
                    endDate: 2026-04-12T11:00:00Z
                  fieldResources:
                    mainResourceCode: tech-55
                    technicianCrewCodes: null
                    equipmentCrewCodes: null
                customer: null
    400_scheduling_workOrder_bad_request:
      description: Bad Request – The request is structurally invalid. For the `uuid:`
        variant, this is returned when the provided value is not a valid UUID
        format.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            Invalid UUID format:
              summary: Returned on the uuid variant when the value is not a valid UUID
              value:
                errors:
                  - code: scheduling.workorder.uuid.invalid
                    message: The value 'not-a-uuid' is not a valid UUID.
                errorReference: abcdefghij0123456789
    404_scheduling_workOrder_not_found:
      description: Not Found – Work order does not exist, or exists but is not yet
        scheduled (status ≤ PRE-SCHEDULED).
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            Work order not found:
              value:
                errors:
                  - code: scheduling.workorder.notfound
                    message: Work order with code 'WO-2026-00123' not found.
                errorReference: abcdefghij0123456789
            Work order not yet scheduled:
              value:
                errors:
                  - code: scheduling.workorder.notscheduled
                    message: Work order with code 'WO-2026-00123' is not yet scheduled.
                errorReference: abcdefghij0123456789
    201_scheduling_schedule_created:
      description: Work order scheduled for the first time.
      content:
        application/json:
          examples:
            Work order scheduled:
              value: ""
    204_scheduling_schedule_updated:
      description: Scheduling of an already scheduled work order updated.
      content:
        application/json:
          examples:
            Scheduling updated:
              value: ""
    400_scheduling_schedule_bad_request:
      description: |-
        Bad Request - validation or business rule error.
        Errors listed under "Control conflicts" can be bypassed with `schedulerRequirements.skipControls`.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            # Unknown references
            Unknown work order:
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestUnknownWorkOrder"
            Unknown technician:
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestUnknownTechnician"
            Unknown equipment:
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestUnknownEquipment"
            Unknown main resource:
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestUnknownMainResource"
            # Missing or malformed input
            Missing wo code in path:
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestMissingWoCodeInPath"
            Invalid UUID format:
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestInvalidUuid"
            Invalid JSON, duplicated or unknown field:
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestInvalidJSON"
            Missing time window (qualified work order):
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestMissingTimeWindow"
            Missing report filler (qualified work order):
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestMissingReportFiller"
            Equipment scheduled without technician:
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestEquipmentWithoutTechnician"
            Missing or invalid schedule mode:
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestScheduleModeInvalid"
            Unknown skipControls value:
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestUnknownSkipControl"
            Missing or invalid date, day or timezone:
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestDateFormat"
            Invalid date order:
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestDateOrder"
            Negative duration:
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestNegativeDuration"
            # Business rules
            Maximum duration exceeded:
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestDurationExceeded"
            Maximum start date exceeded:
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestStartExceeded"
            Working hours violated:
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestWorkingHoursViolation"
            Tour exceeds working day:
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestTourExceedsWorkingDay"
            Resource subscription invalid:
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestSubscriptionInvalid"
            Resource office hierarchy mismatch:
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestOfficeMismatch"
            Skill missing:
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestSkillMissing"
            Characteristics missing:
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestCharacteristicsMissing"
            Work order status invalid:
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestStatusInvalid"
            Scheduling rejected (other rule):
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestRejected"
            # Control conflicts, suppressible via skipControls
            Technician work order overlap (workOrderOverlap):
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestTechnicianWorkOrderOverlap"
            Machine work order overlap (workOrderOverlap):
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestEquipmentWorkOrderOverlap"
            Technician unavailable (unavailabilityOverlap):
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestTechnicianUnavailable"
            Machine unavailable (unavailabilityOverlap):
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestEquipmentUnavailable"
            SLA hours violated (slasRespect):
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestSlasViolation"
            Appointment hours violated (appointmentRespect):
              $ref: "#/components/examples/SchedulingSchedulePutBadRequestAppointmentViolation"
    200_fieldService_usedItems:
      description: OK - Paginated list of used items on the work order.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/UsedItemListResponse"
          examples:
            First page with continuation token:
              value:
                continuationToken: eyJsYXN0VXBkYXRlIjoiMjAyNC0xMC0xNVQxNjowNTowMFoifQ==
                data:
                  - lineItemId: 80ae5498-6d98-45d0-be83-11748b49692a
                    itemCode: PUMP-V3
                    agentCode: T_SMITH_04
                    billing:
                      associatedSectionCode: REPLACEMENT_SECTION
                      invoiceMode: INTERNAL
                      name: Pompe elec motron v3
                      reference: 182DGH32
                      expectedQuantity: 1
                      usedQuantity: 1
                      usedVatRate: 0.2
                      unitPrice:
                        catalogValue: 69
                        associatedContract: 2683
                        value: 59
                        currency: USD
                    tracking:
                      serialNumber: SN-9982-XP
                      stockCode: null
                    lastUpdate: 2024-10-15T16:05:00Z
            Last page - no continuation token:
              value:
                continuationToken: null
                data:
                  - lineItemId: ffffffff-0000-0000-0000-000000000001
                    itemCode: JOINT-50MM
                    agentCode: T_MARTIN_07
                    billing:
                      associatedSectionCode: null
                      invoiceMode: EXTERNAL
                      name: Joint caoutchouc 50mm
                      reference: null
                      expectedQuantity: null
                      usedQuantity: 3
                      usedVatRate: null
                      unitPrice:
                        catalogValue: null
                        associatedContract: null
                        value: 4.5
                        currency: EUR
                    tracking:
                      serialNumber: null
                      stockCode: STOCK-PARIS-03
                    lastUpdate: 2024-10-14T09:10:00Z
            Empty list:
              value:
                continuationToken: null
                data: []
    400_fieldService_usedItems_bad_request:
      description: Bad Request - validation error or invalid continuation token.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            Invalid continuation token:
              value:
                errors:
                  - code: fieldService.continuationToken.invalid
                    message: The provided continuation token does not respect the expected format.
                errorReference: 59ddc09a23159395367307ab95b1c41a
            pageSize exceeded:
              value:
                errors:
                  - code: fieldService.pageSize.exceeded
                    message: pageSize must not exceed 200.
                errorReference: 223e4567-e89b-12d3-a456-426614174001
    404_fieldService_workOrder_not_found:
      description: Not Found - Work order not found or outside caller's org unit.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            404 Work order not found:
              value:
                errors:
                  - code: fieldService.workOrder.notfound
                    message: Work order not found.
                errorReference: a745dc4c5a2b473aaf8ce94c9260aa8f
    400_diagnostic_note_bad_request:
      description: Bad Request - validation errors.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            Missing wo code in path:
              $ref: "#/components/examples/DiagnosticNotePutBadRequestMissingWoCodeInPath"
            Missing note code in path:
              $ref: "#/components/examples/DiagnosticNotePutBadRequestMissingNoteCodeInPath"
            Unknown work order:
              $ref: "#/components/examples/DiagnosticNotePutBadRequestUnknownWorkOrder"
            Unknown note type code:
              $ref: "#/components/examples/DiagnosticNotePutBadRequestUnknownNoteTypeCode"
            Unknown report field code:
              $ref: "#/components/examples/DiagnosticNotePutBadRequestUnknownReportFieldCode"
            Date format:
              $ref: "#/components/examples/DiagnosticNotePutBadRequestDateFormat"
            Report field value format:
              $ref: "#/components/examples/DiagnosticNotePutBadRequestReportFieldValueFormat"
            Missing note type code:
              $ref: "#/components/examples/DiagnosticNotePutBadRequestMissingNoteTypeCode"
            Missing content:
              $ref: "#/components/examples/DiagnosticNotePutBadRequestMissingContent"
            Missing content.text:
              $ref: "#/components/examples/DiagnosticNotePutBadRequestMissingContentText"
            Missing content.reportFields:
              $ref: "#/components/examples/DiagnosticNotePutBadRequestMissingContentReportFie\
                lds"
            Missing content.fields.mandatory:
              $ref: "#/components/examples/DiagnosticNotePutBadRequestMissingContentFieldsMan\
                datory"
            Missing coordinates:
              $ref: "#/components/examples/DiagnosticNotePutBadRequestMissingCoordinates"
            Date in the future:
              $ref: "#/components/examples/DiagnosticNotePutBadRequestDateInFuture"
            Invalid JSON:
              $ref: "#/components/examples/DiagnosticNotePutBadRequestInvalidJSON"
    201_diagnostic_note_created:
      description: Note created.
      content:
        application/json:
          examples:
            Note created:
              value: ""
    204_diagnostic_note_updated:
      description: Note updated.
      content:
        application/json:
          examples:
            Note updated:
              value: ""
    204_diagnostic_flags_updated:
      description: Flags updated.
      content:
        application/json:
          examples:
            Flags updated:
              value: ""
    400_diagnostic_flags_bad_request:
      description: Bad Request - validation errors.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            Unknown work order:
              $ref: "#/components/examples/DiagnosticFlagsPutBadRequestUnknownWorkOrder"
            Unknown flag code:
              $ref: "#/components/examples/DiagnosticFlagsPutBadRequestUnknownFlagCode"
            Missing wo code in path:
              $ref: "#/components/examples/DiagnosticFlagsPutBadRequestMissingWoCodeInPath"
            Missing flags:
              $ref: "#/components/examples/DiagnosticFlagsPutBadRequestMissingFlags"
            Flags format:
              $ref: "#/components/examples/DiagnosticFlagsPutBadRequestFlagsFormat"
            Invalid JSON:
              $ref: "#/components/examples/DiagnosticFlagsPutBadRequestInvalidJSON"
    201_referentials_asset_created:
      description: Asset created.
      content:
        application/json:
          examples:
            Asset created:
              value: ""
    204_referentials_asset_updated:
      description: Asset updated.
      content:
        application/json:
          examples:
            Asset updated:
              value: ""
    400_referentials_asset_put_bad_request:
      description: Bad Request - validation errors
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            Missing label property:
              value:
                errors:
                  - code: referentials.customers.asset.label.mandatory
                    message: Property label is required.
                errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
            Missing site code:
              value:
                errors:
                  - code: referentials.customers.asset.sitecode.mandatory
                    message: Property siteCode is required.
                errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
            Missing asset type code:
              value:
                errors:
                  - code: referentials.customers.asset.assettypecode.mandatory
                    message: Property assetTypeCode is required.
                errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
            Missing code in path:
              value:
                errors:
                  - code: referentials.customers.asset.code.mandatory
                    message: Missing code in path.
                errorReference: 669b11d0ae8145aa9b106b049091b371
            Invalid JSON:
              value:
                errors:
                  - code: referentials.customers.asset.invalid.json
                    message: Invalid Json format.
                errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
            Duplicated field:
              value:
                errors:
                  - code: referentials.customers.asset.invalid.json
                    message: Duplicate field 'label'.
                errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
            Unknown field:
              value:
                errors:
                  - code: referentials.customers.asset.field.unknown
                    message: The field 'foo_bar' is unknown. Please correct your JSON request.
                errorReference: d3c79ddca4f9413cad99dc934cc7d0aa
            Office unknown:
              value:
                errors:
                  - code: referentials.customers.asset.office.unknown
                    message: The organizational unit 'DUMMY' is unknown.
                errorReference: 669b11d0ae8145aa9b106b049091b371
            Office Not Descendant of User's Office:
              value:
                errors:
                  - code: referentials.customers.asset.office.user.hierarchy.error
                    message: The office is not a descendant of the user's one.
                errorReference: 669b11d0ae8145aa9b106b049091b371
            Office Not Descendant of Site's Office:
              value:
                errors:
                  - code: referentials.customers.asset.office.site.hierarchy.error
                    message: The office is not a descendant of the site's one.
                errorReference: 669b11d0ae8145aa9b106b049091b371
            Office Not Descendant of Parent Asset's Office:
              value:
                errors:
                  - code: referentials.customers.asset.office.parent.hierarchy.error
                    message: The office is not a descendant of the parent asset's one.
                errorReference: 669b11d0ae8145aa9b106b049091b371
            Incompatible parent asset office with site office:
              value:
                errors:
                  - code: referentials.customers.asset.parent.site.mismatch
                    message: The parent asset 'parentAssetCode' does not belong to the site
                      'siteCode'.
                errorReference: 669b11d0ae8145aa9b106b049091b371
            Moving a parent asset:
              value:
                errors:
                  - code: referentials.customers.asset.with.child.cannot.be.moved
                    message: The asset 'assetCode' has child assets and cannot be moved. A specific
                      transferAsset endpoint will be developed to transfer
                      the site, office and parentAsset of an asset with
                      children.
                errorReference: f27b6e670c3d404e48095900660dbf128a05
            Site unknown:
              value:
                errors:
                  - code: referentials.customers.asset.site.unknown
                    message: The site 'DUMMY' is unknown.
                errorReference: 669b11d0ae8145aa9b106b049091b371
            Asset type unknown:
              value:
                errors:
                  - code: referentials.customers.asset.assettype.unknown
                    message: The asset type 'DUMMY' is unknown.
                errorReference: 669b11d0ae8145aa9b106b049091b371
            Parent asset unknown:
              value:
                errors:
                  - code: referentials.customers.asset.parent.unknown
                    message: The parent asset 'DUMMY' is unknown.
                errorReference: 669b11d0ae8145aa9b106b049091b371
            Parent asset identical:
              value:
                errors:
                  - code: referentials.customers.asset.parent.identical
                    message: The asset cannot be its own parent.
                errorReference: 669b11d0ae8145aa9b106b049091b371
            Parent asset child of the asset:
              value:
                errors:
                  - code: referentials.customers.asset.hierarchy.error
                    message: The asset parent is also a child of the asset.
                errorReference: 669b11d0ae8145aa9b106b049091b371
            Too many hierarchy levels:
              value:
                errors:
                  - code: referentials.customers.asset.hierarchy.error
                    message: Hierarchy contains 10 or more levels.
                errorReference: 669b11d0ae8145aa9b106b049091b371
    200_rostering_slots:
      description: OK
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/SlotSearchResult"
    400_rostering_slots_bad_request:
      description: Bad request
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/BusinessErrorCode"
    201_webhooks_subscription_created:
      description: Subscription successfully created
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/SubscriptionCreationResponse"
          examples:
            SubscriptionSuccessfullyCreated:
              $ref: "#/components/examples/SubscriptionSuccessfullyCreated"
    400_webhooks_subscription_bad_request:
      description: |-
        The subscription creation request is not correctly formatted.
        Subscription not created.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            MissingRequestBody:
              $ref: "#/components/examples/MissingRequestBody"
            MissingPropertyCallback:
              $ref: "#/components/examples/MissingPropertyCallback"
            MissingPropertyCallbackUrl:
              $ref: "#/components/examples/MissingPropertyCallbackUrl"
            MissingPropertyEventTypes:
              $ref: "#/components/examples/MissingPropertyEventTypes"
            EventTypesEmptyList:
              $ref: "#/components/examples/EventTypesEmptyList"
            EventTypesTooManyElements:
              $ref: "#/components/examples/EventTypesTooManyElements"
            EventTypesWrongEventType:
              $ref: "#/components/examples/EventTypesWrongEventType"
            CallbackWrongUrlFormat:
              $ref: "#/components/examples/CallbackWrongUrlFormat"
            CallbackUrlMaxLength:
              $ref: "#/components/examples/CallbackUrlMaxLength"
            CallbackSecretMaxLength:
              $ref: "#/components/examples/CallbackSecretMaxLength"
            CallbackHeaderNameLength:
              $ref: "#/components/examples/CallbackHeaderNameLength"
            CallbackHeaderValueLength:
              $ref: "#/components/examples/CallbackHeaderValueLength"
            CallbackHeaderNameFormat:
              $ref: "#/components/examples/CallbackHeaderNameFormat"
            CallbackHeaderNameMissing:
              $ref: "#/components/examples/CallbackHeaderNameMissing"
            CallbackHeaderNameDuplicate:
              $ref: "#/components/examples/CallbackHeaderNameDuplicate"
    422_webhooks_subscription_unprocessable:
      description: |
        Syntax is correct, but unable to create the given subscription.
        Subscription not created.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            MaximumSubscriptionsReached:
              $ref: "#/components/examples/MaximumSubscriptionsReached"
    200_webhooks_subscriptions:
      description: Subscription's list successfully retrieved
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/SubscriptionListResponse"
          examples:
            List of Subscriptions:
              $ref: "#/components/examples/ListSubscriptions"
            Empty list of Subscriptions:
              $ref: "#/components/examples/EmptyListSubscriptions"
    200_webhooks_subscription_deleted:
      description: Subscription successfully deleted
    404_webhooks_subscription_not_found:
      description: Subscription not found
    204_projectManagement_workOrder_linked:
      description: Work order linked to its parent, or moved to the requested position.
      content:
        application/json:
          examples:
            Work order linked:
              value: ""
    400_projectManagement_project_bad_request:
      description: Bad Request - validation or business rule error.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            # Unknown references
            Unknown project:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestUnknownProject"
            Unknown work order:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestUnknownWorkOrder"
            Ambiguous work order code:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestAmbiguousWorkOrder"
            Unknown relative position:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestUnknownRelativePosition"
            Work order positioned relative to itself:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestSelfRelativePosition"
            Unknown job in block:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestUnknownBlock"
            Unknown job in isBlockedBy:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestUnknownIsBlockedBy"
            # Missing or malformed input
            Missing project code in path:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestMissingProjectCode"
            Missing type:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestMissingType"
            Unknown type:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestUnknownType"
            Missing work order code:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestMissingCode"
            Unknown insertion mode:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestUnknownInsertionMode"
            Missing position (index mode):
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestMissingPosition"
            Negative position:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestNegativePosition"
            Missing relative position (before / after mode):
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestMissingRelativePosition"
            Unknown insertion job type:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestUnknownJobType"
            Missing code in block:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestMissingBlockCode"
            Missing jobType in block:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestMissingBlockJobType"
            Unknown jobType in block:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestUnknownBlockJobType"
            Missing code in isBlockedBy:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestMissingIsBlockedByCode"
            Missing jobType in isBlockedBy:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestMissingIsBlockedByJobType"
            Unknown jobType in isBlockedBy:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestUnknownIsBlockedByJobType"
            Invalid JSON or wrong field type:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestInvalidJSON"
            Unknown field:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestUnknownField"
            # Business rules
            Project office conflict:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestOfficeConflict"
            Project completed:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestStatusConflict"
            Current project completed:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestCurrentProjectStatusConflict"
            Dependencies not allowed on this project office:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestDependencyOfficeConflict"
            Dependency cycle:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestDependencyCycle"
            Dependency overlap:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestDependencyOverlap"
            Other business rule:
              $ref: "#/components/examples/ProjectManagementProjectLinkBadRequestRuleViolated"
    400_projectManagement_routeServiceOrder_bad_request:
      description: Bad Request - validation or business rule error.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            # Unknown references
            Unknown route service order:
              $ref: "#/components/examples/ProjectManagementRouteServiceOrderLinkBadRequestUnknownRouteServiceOrder"
            Unknown work order:
              $ref: "#/components/examples/ProjectManagementRouteServiceOrderLinkBadRequestUnknownWorkOrder"
            Unknown relative position:
              $ref: "#/components/examples/ProjectManagementServiceOrderLinkBadRequestUnknownRelativePosition"
            Work order positioned relative to itself:
              $ref: "#/components/examples/ProjectManagementServiceOrderLinkBadRequestSelfRelativePosition"
            # Missing or malformed input
            Missing service order code in path:
              $ref: "#/components/examples/ProjectManagementServiceOrderLinkBadRequestMissingServiceOrderCode"
            Missing work order code:
              $ref: "#/components/examples/ProjectManagementRouteServiceOrderLinkBadRequestMissingCode"
            Unknown insertion mode:
              $ref: "#/components/examples/ProjectManagementServiceOrderLinkBadRequestUnknownInsertionMode"
            Missing position (index mode):
              $ref: "#/components/examples/ProjectManagementServiceOrderLinkBadRequestMissingPosition"
            Missing relative position (before / after mode):
              $ref: "#/components/examples/ProjectManagementServiceOrderLinkBadRequestMissingRelativePosition"
            Invalid JSON or wrong field type:
              $ref: "#/components/examples/ProjectManagementServiceOrderLinkBadRequestInvalidJSON"
            Unknown field:
              $ref: "#/components/examples/ProjectManagementServiceOrderLinkBadRequestUnknownField"
            # Business rules
            Service order office conflict:
              $ref: "#/components/examples/ProjectManagementRouteServiceOrderLinkBadRequestOfficeConflict"
            Service order completed or validated:
              $ref: "#/components/examples/ProjectManagementRouteServiceOrderLinkBadRequestStatusConflict"
            Service order full:
              $ref: "#/components/examples/ProjectManagementRouteServiceOrderLinkBadRequestFull"
            Work order not qualified:
              $ref: "#/components/examples/ProjectManagementRouteServiceOrderLinkBadRequestWorkOrderStatusConflict"
            Work order team conflict:
              $ref: "#/components/examples/ProjectManagementRouteServiceOrderLinkBadRequestTeamConflict"
            Current service order completed:
              $ref: "#/components/examples/ProjectManagementServiceOrderLinkBadRequestCurrentServiceOrderConflict"
            Work order completed in its current route:
              $ref: "#/components/examples/ProjectManagementServiceOrderLinkBadRequestCurrentServiceOrderStatusConflict"
            Work order not carried by its current service order:
              $ref: "#/components/examples/ProjectManagementServiceOrderLinkBadRequestCurrentServiceOrderNotLinked"
            Other business rule:
              $ref: "#/components/examples/ProjectManagementServiceOrderLinkBadRequestRuleViolated"
    400_projectManagement_standardServiceOrder_bad_request:
      description: Bad Request - validation or business rule error.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            # Unknown references
            Unknown standard service order:
              $ref: "#/components/examples/ProjectManagementStandardServiceOrderLinkBadRequestUnknownStandardServiceOrder"
            Unknown work order:
              $ref: "#/components/examples/ProjectManagementStandardServiceOrderLinkBadRequestUnknownWorkOrder"
            Unknown relative position:
              $ref: "#/components/examples/ProjectManagementServiceOrderLinkBadRequestUnknownRelativePosition"
            Work order positioned relative to itself:
              $ref: "#/components/examples/ProjectManagementServiceOrderLinkBadRequestSelfRelativePosition"
            # Missing or malformed input
            Missing service order code in path:
              $ref: "#/components/examples/ProjectManagementServiceOrderLinkBadRequestMissingServiceOrderCode"
            Missing work order code:
              $ref: "#/components/examples/ProjectManagementStandardServiceOrderLinkBadRequestMissingCode"
            Unknown insertion mode:
              $ref: "#/components/examples/ProjectManagementServiceOrderLinkBadRequestUnknownInsertionMode"
            Missing position (index mode):
              $ref: "#/components/examples/ProjectManagementServiceOrderLinkBadRequestMissingPosition"
            Missing relative position (before / after mode):
              $ref: "#/components/examples/ProjectManagementServiceOrderLinkBadRequestMissingRelativePosition"
            Invalid JSON or wrong field type:
              $ref: "#/components/examples/ProjectManagementServiceOrderLinkBadRequestInvalidJSON"
            Unknown field:
              $ref: "#/components/examples/ProjectManagementServiceOrderLinkBadRequestUnknownField"
            # Business rules
            Service order office conflict:
              $ref: "#/components/examples/ProjectManagementStandardServiceOrderLinkBadRequestOfficeConflict"
            Service order completed or validated:
              $ref: "#/components/examples/ProjectManagementStandardServiceOrderLinkBadRequestStatusConflict"
            Service order full:
              $ref: "#/components/examples/ProjectManagementStandardServiceOrderLinkBadRequestFull"
            Current service order completed:
              $ref: "#/components/examples/ProjectManagementServiceOrderLinkBadRequestCurrentServiceOrderConflict"
            Work order completed in its current route:
              $ref: "#/components/examples/ProjectManagementServiceOrderLinkBadRequestCurrentServiceOrderStatusConflict"
            Work order not carried by its current service order:
              $ref: "#/components/examples/ProjectManagementServiceOrderLinkBadRequestCurrentServiceOrderNotLinked"
            Other business rule:
              $ref: "#/components/examples/ProjectManagementServiceOrderLinkBadRequestRuleViolated"
    200_rostering_crews:
      description: OK – Crews active over the requested period.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/CrewListResponse"
          examples:
            A list which has more pages:
              summary: Full page, a continuation token is returned
              value:
                continuationToken: eyJsYXN0SW5kZXgiOnsic3RhcnREYXRlIjoiMjAyNi0wOS0yM1QwNjowMDowMFoiLCJjcmV3SWQiOjEwNTA2MH19
                data:
                  - mainResource:
                      code: T-LEA
                      type: technician
                      intervals:
                        - startDate: 2026-09-21T06:00:00Z
                          endDate: 2026-09-23T00:00:00Z
                    secondaryResources:
                      technicians:
                        - code: T-DUBOIS
                          intervals:
                            - startDate: 2026-09-21T06:00:00Z
                              endDate: 2026-09-23T00:00:00Z
                      equipments:
                        - code: truck-04
                          intervals:
                            - startDate: 2026-09-21T06:00:00Z
                              endDate: 2026-09-23T00:00:00Z
                  - mainResource:
                      code: T-DAVID
                      type: technician
                      intervals:
                        - startDate: 2026-09-23T06:00:00Z
                          endDate: 2026-09-26T00:00:00Z
                    secondaryResources:
                      technicians: []
                      equipments:
                        - code: truck-04
                          intervals:
                            - startDate: 2026-09-23T06:00:00Z
                              endDate: 2026-09-24T00:00:00Z
                            - startDate: 2026-09-25T06:00:00Z
                              endDate: 2026-09-26T00:00:00Z
            The last page:
              summary: Equipment-led crew with an open-ended interval, no more pages
              value:
                continuationToken: null
                data:
                  - mainResource:
                      code: crane-02
                      type: equipment
                      intervals:
                        - startDate: 2026-09-22T06:00:00Z
                          endDate: null
                    secondaryResources:
                      technicians:
                        - code: T-MARTIN
                          intervals:
                            - startDate: 2026-09-22T06:00:00Z
                              endDate: 2026-10-01T00:00:00Z
                      equipments: []
            Empty list:
              value:
                continuationToken: null
                data: []
    400_rostering_crews_bad_request:
      description: Bad Request - invalid query parameters.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            Missing period:
              value:
                errors:
                  - code: rostering.crews.period.missing
                    message: startDate and endDate are mandatory
                errorReference: 923e4567-e89b-12d3-a456-426614174000
            Invalid period (format or order):
              value:
                errors:
                  - code: rostering.crews.period.invalid
                    message: startDate and endDate must be ISO 8601 dates, and endDate must be after startDate
                errorReference: 923e4567-e89b-12d3-a456-426614174000
            Period too long:
              value:
                errors:
                  - code: rostering.crews.period.tooLong
                    message: The requested period cannot exceed one year
                errorReference: 923e4567-e89b-12d3-a456-426614174000
            Invalid size:
              value:
                errors:
                  - code: rostering.crews.size.invalid
                    message: size must be a positive integer
                errorReference: 923e4567-e89b-12d3-a456-426614174000
            Invalid continuation token:
              value:
                errors:
                  - code: rostering.crews.continuationToken.invalid
                    message: The continuation token is malformed or expired
                errorReference: 923e4567-e89b-12d3-a456-426614174000
    401_unauthorized:
      description: Unauthorized - authentication issue.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            401 Unauthorized:
              value:
                errors:
                  - code: unauthorized.nocredentials
                    message: No credentials.
                errorReference: f939c6b8c15045c9a70f500fdb570555
            401 Bad credentials:
              value:
                errors:
                  - code: unauthorized.badcredentials
                    message: Bad Credentials.
                errorReference: f1028f99811b422eb21f5ff176664069
    403_forbidden:
      description: Forbidden - not enough rights.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            403 Access forbiden:
              value:
                errors:
                  - code: access.forbiden
                    message: You don't have the rights to access this resource.
                errorReference: a745dc4c5a2b473aaf8ce94c9260aa8f
    429_too_many_requests:
      description: Too Many Requests.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            429 Too many requests:
              value:
                errors:
                  - code: ratelimiter.toomanyrequest
                    message: Rejected because of the rate limit definition.
                errorReference: 973326230a3f44daba6cc34a5939b4fb
    500_internal_server_error:
      description: Internal server error.
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorResponse"
          examples:
            500 Internal server error:
              value:
                errors:
                  - code: internal.server.error
                    message: Something went wrong.
                errorReference: 6377010431314bf6b0b95ec4d32ddae0
