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
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
Link the work order after every work order of the service order
{
"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)
Unknown route service order
{
"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)
401 unauthorized
{
"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"
}