Link a work order to a route service order

Add MCP server to your AI tool

Allow AI tools and LLMs to interact with the API documentation portal through MCP.

MCP server URL

https://developers.praxedo.com/mcp

Standard setup for AI tools providing an mcp.json file

mcp.json
{
  "public-rest-apis MCP server": {
    "url": "https://developers.praxedo.com/mcp"
  }
}

Close
POST /eTech/rest/ws/projectManagement/v1/routeServiceOrders/code:{routeServiceOrderCode}/link

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

Path parameters

  • routeServiceOrderCode string Required

    Business code of the route service order.

application/json

Body Required

  • code string Required

    Business code of the work order to link.

  • insertion object

    Position of the work order among the service order's work orders. When absent, the work order is linked last.

    Additional properties are NOT allowed.

    Hide insertion attributes Show insertion attributes object
    • insertionMode string

      How the position is expressed.

      Values are first, last, index, before, or after. Default value is last.

    • position integer

      Zero-based position among the service order's work orders. Required by index, ignored otherwise. Clamped to the bounds of the list.

    • relativePosition string

      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.

Responses

  • 204 application/json

    Work order linked to its parent, or moved to the requested position.

  • 400 application/json

    Bad Request - validation or business rule error.

    Hide response attributes Show response attributes object
    • errors array[object]

      Array of errors. Contains at least one element.

      Hide errors attributes Show errors attributes object

      Contains code and message for error.

      • code string Required
      • message string Required
    • errorReference string Required

      Error unique reference. Communicated to support, this will help to locate the issue.

      Format should match the following pattern: [0-1a-z].

  • 401 application/json

    Unauthorized - authentication issue.

    Hide response attributes Show response attributes object
    • errors array[object]

      Array of errors. Contains at least one element.

      Hide errors attributes Show errors attributes object

      Contains code and message for error.

      • code string Required
      • message string Required
    • errorReference string Required

      Error unique reference. Communicated to support, this will help to locate the issue.

      Format should match the following pattern: [0-1a-z].

  • 403 application/json

    Forbidden - not enough rights.

    Hide response attributes Show response attributes object
    • errors array[object]

      Array of errors. Contains at least one element.

      Hide errors attributes Show errors attributes object

      Contains code and message for error.

      • code string Required
      • message string Required
    • errorReference string Required

      Error unique reference. Communicated to support, this will help to locate the issue.

      Format should match the following pattern: [0-1a-z].

  • 429 application/json

    Too Many Requests.

    Hide response attributes Show response attributes object
    • errors array[object]

      Array of errors. Contains at least one element.

      Hide errors attributes Show errors attributes object

      Contains code and message for error.

      • code string Required
      • message string Required
    • errorReference string Required

      Error unique reference. Communicated to support, this will help to locate the issue.

      Format should match the following pattern: [0-1a-z].

  • 500 application/json

    Internal server error.

    Hide response attributes Show response attributes object
    • errors array[object]

      Array of errors. Contains at least one element.

      Hide errors attributes Show errors attributes object

      Contains code and message for error.

      • code string Required
      • message string Required
    • errorReference string Required

      Error unique reference. Communicated to support, this will help to locate the issue.

      Format should match the following pattern: [0-1a-z].

POST /eTech/rest/ws/projectManagement/v1/routeServiceOrders/code:{routeServiceOrderCode}/link
curl \
 --request POST 'https://ws-eu1.praxedo.com/eTech/rest/ws/projectManagement/v1/routeServiceOrders/code:SO-2026-0042/link' \
 --header "Authorization: Bearer $ACCESS_TOKEN" \
 --header "Content-Type: application/json" \
 --data '{
  "code": "WO-2026-00123"
}'
Request examples
{
  "code": "WO-2026-00123"
}
{
  "code": "WO-2026-00123",
  "insertion": {
    "insertionMode": "first"
  }
}
{
  "code": "WO-2026-00123",
  "insertion": {
    "insertionMode": "index",
    "position": 2
  }
}
{
  "code": "WO-2026-00123",
  "insertion": {
    "insertionMode": "after",
    "relativePosition": "WO-2026-00120"
  }
}
Response examples (204)
Response examples (400)
{
  "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"
}
{
  "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"
}
{
  "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"
}
{
  "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"
}
{
  "errors": [
    {
      "code": "projectmanagement.serviceorder.code.mandatory",
      "message": "Missing service order code in path."
    }
  ],
  "errorReference": "823e4567-e89b-12d3-a456-426614174000"
}
{
  "errors": [
    {
      "code": "projectmanagement.routeserviceorder.workorder.code.mandatory",
      "message": "Property code is required."
    }
  ],
  "errorReference": "823e4567-e89b-12d3-a456-426614174000"
}
{
  "errors": [
    {
      "code": "projectmanagement.insertion.insertionMode.unknown",
      "message": "The insertion mode 'middle' is unknown."
    }
  ],
  "errorReference": "823e4567-e89b-12d3-a456-426614174000"
}
{
  "errors": [
    {
      "code": "projectmanagement.insertion.position.mandatory",
      "message": "Property insertion.position is required when insertion.insertionMode is 'index'."
    }
  ],
  "errorReference": "823e4567-e89b-12d3-a456-426614174000"
}
{
  "errors": [
    {
      "code": "projectmanagement.insertion.relativePosition.mandatory",
      "message": "Property insertion.relativePosition is required when insertion.insertionMode is 'after'."
    }
  ],
  "errorReference": "823e4567-e89b-12d3-a456-426614174000"
}
{
  "errors": [
    {
      "code": "projectmanagement.invalid.json",
      "message": "Invalid Json format."
    }
  ],
  "errorReference": "823e4567-e89b-12d3-a456-426614174000"
}
{
  "errors": [
    {
      "code": "projectmanagement.field.unknown",
      "message": "The field 'type' is unknown. Please correct your JSON request."
    }
  ],
  "errorReference": "823e4567-e89b-12d3-a456-426614174000"
}
{
  "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"
}
{
  "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"
}
{
  "errors": [
    {
      "code": "projectmanagement.routeserviceorder.full",
      "message": "The service order already carries the maximum number of work orders."
    }
  ],
  "errorReference": "823e4567-e89b-12d3-a456-426614174000"
}
{
  "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"
}
{
  "errors": [
    {
      "code": "projectmanagement.routeserviceorder.team.conflict",
      "message": "Work order team don't match the service order one."
    }
  ],
  "errorReference": "823e4567-e89b-12d3-a456-426614174000"
}
{
  "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"
}
{
  "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"
}
{
  "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"
}
{
  "errors": [
    {
      "code": "projectmanagement.rule.violated",
      "message": "The operation was refused by a business rule."
    }
  ],
  "errorReference": "823e4567-e89b-12d3-a456-426614174000"
}
Response examples (401)
{
  "errors": [
    {
      "code": "unauthorized.nocredentials",
      "message": "No credentials."
    }
  ],
  "errorReference": "f939c6b8c15045c9a70f500fdb570555"
}
{
  "errors": [
    {
      "code": "unauthorized.badcredentials",
      "message": "Bad Credentials."
    }
  ],
  "errorReference": "f1028f99811b422eb21f5ff176664069"
}
Response examples (403)
{
  "errors": [
    {
      "code": "access.forbiden",
      "message": "You don't have the rights to access this resource."
    }
  ],
  "errorReference": "a745dc4c5a2b473aaf8ce94c9260aa8f"
}
Response examples (429)
{
  "errors": [
    {
      "code": "ratelimiter.toomanyrequest",
      "message": "Rejected because of the rate limit definition."
    }
  ],
  "errorReference": "973326230a3f44daba6cc34a5939b4fb"
}
Response examples (500)
{
  "errors": [
    {
      "code": "internal.server.error",
      "message": "Something went wrong."
    }
  ],
  "errorReference": "6377010431314bf6b0b95ec4d32ddae0"
}