Routing Configuration and Reporting APIs
Starting 26B, Field Service introduces new public Routing API endpoints within the Configuration Provider microservice, enabling users to discover routing profiles and list buckets associated with a given profile. Additionally, the new implementation of import and export endpoints for routing plans streamlines the automation of routing plan changes, including those managed through Oracle Fusion AI Studio.
The following endpoints have been introduced:
Feature Description
| Endpoint | Description | |
|---|---|---|
| 1 |
|
Retrieves a paginated collection of routing profile labels and metadata, with support for pagination and HATEOAS links. |
| 2 |
|
Retrieves a paginated list of buckets (resources) associated with the specified routing profile label, including metadata and HATEOAS links. |
| 3 |
|
Retrieves a paginated list of routing runs and key statistics for a specified resource and date required for the routing summary. |
| 4 |
|
Exports a routing plan in JSON format. The response returns the plan object under the “scheduling_plan” property. If
download=true , the API responds with an attachment (without HATEOAS links); otherwise, the response includes HATEOAS links and no attachment header. |
| 5 |
|
Imports a routing plan into a routing profile. The payload must be wrapped under the “scheduling_plan” property. During import, referenced labels are validated and resolved. If the plan does not exist, it is inserted as new; if a plan with the same label exists, a 409 response is returned (use
forceImport to overwrite the existing plan). |
| 6 |
|
Upserts a routing plan into a routing profile - inserting it if missing or updating it if it exists (no 409 errors for duplicates). Parameters and semantics are the same as the custom-actions/import endpoint. |
| 7 |
|
Retrieves a summary report and detailed per-activity assignment metrics for the specified routing run, including aggregate statistics and HATEOAS category links. |
Getting Routing Profiles
GET /api/field-service/routing/v1/routingProfiles/
- Purpose: Returns a collection of routing profile labels (and associated metadata/links).
- Auth: JWT Bearer; read scope for routing profile metadata.
- Query parameters:
- limit: integer; optional; default applies. Maximum number of items per page.
- offset: integer; optional; default 0. Zero-based index of the first item.
Request example:
curl -u '<CLIENT-ID>@<INSTANCE-NAME>:<CLIENT-SECRET>' -H 'Accept: application/json' 'https://<instance_name>/routingProfiles/?limit=2&offset=2'
Response example:
- Body: Collection with items, totalResults, limit, offset, hasMore, and links. Links include describedby and canonical .
- Error handling:
- 400 Bad Request for invalid pagination parameters (e.g., negative offset, invalid limit) .
- 401 Unauthorized for missing/invalid auth.
Response scheme:
{"description":"The collection of routing profile labels.","properties":{"items":{"type":"array","description":"An array of routing profile labels.","items":{"title":"Routing Profile Label","type":"string","minLength":1,"maxLength":160}},"totalResults":{"type":"integer","description":"The total number of the resource type records in the collection. "},"hasMore":{"type":"boolean","description":"Contains one of the following values: true or false. The default value is true.<p>True indicates there are more results that can be retrieved with successive paging requests. False or the value is not present, indicates, there are no more results or this is the final page.</p>"},"offset":{"type":"integer","description":"The offset value specified in the request."},"limit":{"type":"integer","description":"The limit value specified in the request. If the value is not specified in the request or if the specified value is not accepted, then it defaults to 100."}}}
Response example:
{"totalResults": 8,"offset": 0,"items": [{"profileLabel": "AUTOTESTforActionLinksMethods"},{"profileLabel": "AutoTestGroupActionDeleteCancel"},{"profileLabel": "AutoTestGroupActionDeleteOk"},{"profileLabel": "AutoTestGroupActionActivateCancel"},{"profileLabel": "AutoTestGroupActionActivateOk"},{"profileLabel": "AutoTestGroupActionDeactivateCancel"},{"profileLabel": "AutoTestGroupActionDeactivateOk"},{"profileLabel": "ResInfoRoutingProfile"}],"links": [{"rel": "describedby","href": "http://configuration-provider.ofsc.team/metadata-catalog/routing"},{"rel": "canonical","href": "http://configuration-provider.ofsc.team/routingProfiles"}]}
Getting buckets associated with the given profile
GET /api/field-service/routing/v1/routingProfiles/{profileLabel}/buckets
Retrieves a paginated list of buckets (resources) associated with the specified routing profile label, including metadata and HATEOAS links.
- Auth: JWT Bearer; read scope for routing profile metadata.
- Path parameters:
- profileLabel: string; required. The label of the routing profile.
- Query parameters:
- limit: integer; optional; default 10. Maximum number of buckets to return.
- offset: integer; optional; default 0. Zero-based index of the first item.
Request example:
curl -u '<CLIENT-ID>@<INSTANCE-NAME>:<CLIENT-SECRET>' -H 'Accept: application/json' 'https://<instance_name>/api/field-service/routing/v1/routingProfiles/BulkWithImmediate/buckets'
Response:
- Media types: application/schema+json, application/json.
- Body: Paginated collection (items, totalResults, hasMore, offset, limit) and HATEOAS links (describedby, canonical, next when applicable).
- Error handling:
- 401 Unauthorized for missing/invalid auth.
- 404 Not Found when the routing profile with the specified label does not exist or isn’t visible to the caller.
- 400 Bad Request when profileLabel violates length constraints.
- 400 Bad Request for invalid pagination parameters.
Schema:
{ "description": "A collection of buckets assigned to the routing profile.", "properties": { "items": { "type": "array", "description": "An array of resource objects representing the buckets.", "items": { "type": "object", "properties": { "externalId": { "type": "string", "description": "The external identifier of the resource (bucket)." }, "name": { "type": "string", "description": "The display name of the resource." }, "schedulingProfileId": { "type": "integer", "description": "The ID of the routing profile this bucket is associated with." } } } }, "totalResults": { "type": "integer", "description": "The total number of bucket records in the collection." }, "hasMore": { "type": "boolean", "description": "True if more results are available for paging; false otherwise." }, "offset": { "type": "integer", "description": "The offset value specified in the request." }, "limit": { "type": "integer", "description": "The limit value specified in the request. Defaults to 10." } } }
Response example:
{ "totalResults": 3, "limit": 10, "offset": 0, "hasMore": false, "items": [ { "externalId": "BundledActivity", "name": "BundledActivity", "schedulingProfileId": 118 }, { "externalId": "bulk_routing_bucket", "name": "Bulk Routing Bucket", "schedulingProfileId": 118 }, { "externalId": "Bucket_LA", "name": "Bucket_LA", "schedulingProfileId": 118 } ], "links": [ { "rel": "describedby", "href": "http://configuration-provider.ofsc.team/metadata-catalog/routing" }, { "rel": "canonical", "href": "http://configuration-provider.ofsc.team/routingProfiles/BulkWithImmediate/buckets" }, { "rel": "next", "href": "http://configuration-provider.ofsc.team/routingProfiles/BulkWithImmediate/buckets?offset=10&limit=10" } ] }
Getting list of routing runs by date
GET /api/field-service/routing/v1/routingRuns/{resourceExternalId}/{date}
Retrieves a paginated list of routing runs and key statistics for a specified resource and date required for the routing summary.
- Auth: JWT Bearer; read scope for routing run metadata.
- Path Parameters
- resourceExternalId: string; required. The external identifier of the resource (bucket).
- date: date (yyyy-MM-dd); required. The date of the scheduling run.
- Query Parameters
- limit: integer; optional. Maximum number of records to return.
- offset: integer; optional. Number of records to skip before starting to return records.
Request Example
curl -u '<CLIENT-ID>@<INSTANCE-NAME>:<CLIENT-SECRET>' -H 'Accept: application/json' 'https://api/field-service/routing/v1/routingRuns/bulk_routing_bucket/2025-08-01?limit=2&offset=0'
Response
- Media types: application/schema+json, application/json.
- Body: Paginated collection (items, totalResults, hasMore, offset, limit) and HATEOAS links (describedby, canonical, next when applicable):
- items[]: objects containing runId, started (ISO date-time), resourceExternalId, schedulingPlanId, planName, planLabel, schedulingRunType, runStartType, activitiesToBeAssigned, assignedActivities, totalResources, resourcesChangedRoutes, resultStatus.
- Error Handling
- 400 Bad Request:
- Invalid limit or offset (must be unsigned integer).
- resourceExternalId length > 160 characters.
- Invalid date format (must be yyyy-MM-dd) or invalid calendar value (e.g., month 13).
- 404 Not Found:
- No routing runs for the specified resource/date (or resource not found in this context).
- 400 Bad Request:
Schema
{ "description":"The collection of routing runs for the specified resource and date.", "properties":{ "items":{ "type":"array", "description":"An array of routing runs.", "items":{ "title":"Routing Run", "type":"object", "properties":{ "runId":{ "type":"integer", "description":"Unique identifier of the routing run." }, "started":{ "type":"string", "format":"date-time", "description":"Run start timestamp in ISO-8601 format." }, "resourceExternalId":{ "type":"string", "minLength":1, "maxLength":160, "description":"External identifier of the resource." }, "schedulingPlanId":{ "type":"integer", "description":"Identifier of the scheduling plan." }, "planName":{ "type":"string", "description":"Name of the scheduling plan." }, "planLabel":{ "type":"string", "description":"Label of the scheduling plan." }, "schedulingRunType":{ "type":"string", "description":"Run type derived from plan profile and creator.", "enum":[ "manual", "onceaday", "recurrent", "immediate", "continuous" ] }, "runStartType":{ "type":"string", "description":"How the run was started.", "enum":[ "automatic", "manual" ] }, "activitiesToBeAssigned":{ "type":"integer", "description":"Number of activities to be assigned." }, "assignedActivities":{ "type":"integer", "description":"Number of activities assigned." }, "totalResources":{ "type":"integer", "description":"Total number of resources considered in the run." }, "resourcesChangedRoutes":{ "type":"integer", "description":"Number of resources with changed routes." }, "resultStatus":{ "type":"string", "description":"Current status of the run.", "enum":[ "undefined", "rolledback", "scheduled", "running", "completed", "waiting", "stopped", "skipped", "failed" ] } }, "required":[ "runId" ] } }, "totalResults":{ "type":"integer", "description":"The total number of the resource type records in the collection." }, "hasMore":{ "type":"boolean", "description":"Contains one of the following values: true or false. The default value is true. True indicates there are more results that can be retrieved with successive paging requests. False or the value is not present, indicates, there are no more results or this is the final page." }, "offset":{ "type":"integer", "description":"The offset value specified in the request." }, "limit":{ "type":"integer", "description":"The limit value specified in the request. If the value is not specified in the request or if the specified value is not accepted, then it defaults to 10." } } }
Response Example
{ "totalResults": 31, "limit": 2, "offset": 0, "hasMore": true, "items": [ { "runId": 1039023, "started": "2025-08-01T13:49:46", "resourceExternalId": "bulk_routing_bucket", "schedulingPlanId": 1000, "planName": "bulk", "planLabel": "bulk", "schedulingRunType": "onceaday", "runStartType": "automatic", "activitiesToBeAssigned": 0, "assignedActivities": 0, "totalResources": 2, "resourcesChangedRoutes": 0, "resultStatus": "skipped" }, { "runId": 1039019, "started": "2025-08-01T13:49:46", "resourceExternalId": "bulk_routing_bucket", "schedulingPlanId": 1002, "planName": "123", "planLabel": "123", "schedulingRunType": "recurrent", "runStartType": "automatic", "activitiesToBeAssigned": 2, "assignedActivities": 0, "totalResources": 2, "resourcesChangedRoutes": 0, "resultStatus": "skipped" } ], "links": [ { "rel": "describedby", "href": "http://configuration-provider.ofsc.team/metadata-catalog/routingRuns" }, { "rel": "canonical", "href": "http://configuration-provider.ofsc.team/routingRuns/bulk_routing_bucket/2025-08-01?limit=2" }, { "rel": "next", "href": "http://configuration-provider.ofsc.team/routingRuns/bulk_routing_bucket/2025-08-01?offset=2&limit=2" } ] }
Exporting Routing Plan as an AI-friendly JSON
GET /api/field-service/routing/v1/routingProfiles/{profileLabel}/plans/{planLabel}/custom-actions/export
Exports a routing plan in JSON format. The response returns the plan object under the “scheduling_plan” property. If download=true, the API responds with an attachment (without HATEOAS links); otherwise, the response includes HATEOAS links and no attachment header.
- Auth: JWT Bearer; read scope for routing plan metadata.
- Path Parameters
- profileLabel: string; required; minLength: 1; maxLength: 40.
- planLabel: string; required; minLength: 1; maxLength: 40.
- Query Parameters
- download: boolean; optional; default: false. When true, returns the payload as a file attachment; when false, prints JSON with HATEOAS links.
Request Example
curl -H 'Authorization: Bearer <JWT>' -H 'Accept: application/json' 'https://<instance_name>/v2/routingProfiles/AutoTestGroupActionDeleteOk/plans/BulkRouting/custom-actions/export?download=true'
Response
- Media types: application/schema+json, application/json.
- Body: JSON containing
- scheduling_plan: the exported plan definition (fields as in the routing plan model).
- When download=false, top-level HATEOAS links included; when download=true, content-disposition attachment header is set and links are omitted.
- Error Handling
- 400 Bad Request:
- profileLabel or planLabel length not in [1, 40] .
- 401 Unauthorized:
- Missing or invalid Authorization bearer token.
- 404 Not Found:
- Routing profile label not found, or plan label not found within the profile.
- 400 Bad Request:
Note The plan exported by the V2 endpoint is not provided with the signature as the one with V1, so it could be easily modified by the customer using the proper automation, e.g. Oracle Fusion AI Studio, and re-imported then.
Response example
{ "scheduling_plan": { "label": "manual_plan", "name": "manual plan", "description": null, "active": true, "type": "manual", "start_day_offset": 0, "from_time": null, "to_time": null, "interval": null, "weekdays": { "Sun": false, "Mon": false, "Tue": false, "Wed": false, "Thu": false, "Fri": false, "Sat": false }, "time_limit": 5, "time_limit_percent_slt": 70, "auto_ordering": 1, "uniformity_coeff": 0, "home_zone_overstep_wght": 4, "resource_overtime": 0, "unacceptable_travel_time": 240, "unacceptable_travel_distance": 200, "travel_optimization_strategy": "shortest", "use_slt": false, "limit_work_by_points": false, "default_home_zone_radius": 1, "home_zone_enable": false, "reopt_enable": 0, "reopt_reduce_overdue_thold": null, "immediate_scheduling_type": null, "bundling_from": 0, "bundling_to": 1, "assignment_to": 1, "immediate_scheduling_subtype": "normal", "collab_routing_time_limit": 0, "reopt_move_cost_override": 0, "reopt_move_cost": 10, "sw_reservation_override": false, "sw_reservation": 20, "scheduling_to_contractor": false, "ignore_work_zone_mismatch": false, "only_internal_resources": true, "goal_based_optimization": "balanced", "inventory_required_days": 99, "daily_distance_limit_is_used": false, "unacceptable_daily_distance": null, "use_machine_learning": false, "recomm_min_time_limit": -1, "recomm_max_time_limit": -1, "recomm_balanced_time_limit": -1, "message_flow_label": null, "predecessor_label": null, "trigger_filter_label": null, "activity_groups": [ { "activity_location": "bucket_non_scheduled", "unacceptable_overdue": 0, "overdue_cost": 50, "non_assignment_cost": 1500, "sla_cost_coeff": 3, "sla_overdue_cost": -1, "sla_violation_fact_cost": -1, "is_multiday": false, "autoordering_type": 1, "sla_policy": 0, "bundling_policy": 0, "filter_label": "Other", "provider_groups": [ { "priority": "1.0", "filter_label": "Other" } ] }, { "activity_location": "bucket_routing_date", "unacceptable_overdue": 0, "overdue_cost": 50, "non_assignment_cost": 1500, "sla_cost_coeff": 3, "sla_overdue_cost": -1, "sla_violation_fact_cost": -1, "is_multiday": false, "autoordering_type": 1, "sla_policy": 0, "bundling_policy": 0, "filter_label": "Other", "provider_groups": [ { "priority": "1.0", "filter_label": "Other" } ] }, { "activity_location": "resource_non_scheduled", "unacceptable_overdue": 0, "overdue_cost": 50, "non_assignment_cost": 1500, "sla_cost_coeff": 3, "sla_overdue_cost": -1, "sla_violation_fact_cost": -1, "is_multiday": false, "autoordering_type": 1, "sla_policy": 0, "bundling_policy": 0, "filter_label": "Other", "provider_groups": [ { "priority": "1.0", "filter_label": "Other" } ] }, { "activity_location": "resource_routing_date", "unacceptable_overdue": 0, "overdue_cost": 50, "non_assignment_cost": 1500, "sla_cost_coeff": 3, "sla_overdue_cost": -1, "sla_violation_fact_cost": -1, "is_multiday": false, "autoordering_type": 1, "sla_policy": 0, "bundling_policy": 0, "filter_label": "Other", "provider_groups": [ { "priority": "1.0", "filter_label": "Other" } ] } ], "reoptimization_filters": [] } }
Import of the unsigned routing plan
POST /api/field-service/routing/v1/routingProfiles/{routingProfileLabel}/plans/custom-actions/import
Imports a routing plan into a routing profile. The payload must be wrapped under the “scheduling_plan” property. During import, referenced labels are validated and resolved. If the plan does not exist, it is inserted as new; if a plan with the same label exists, a 409 response is returned (use forceImport to overwrite the existing plan).
- Auth: JWT Bearer; write scope for routing plan metadata.
- Path Parameters
- routingProfileLabel: string; required; minLength: 1; maxLength: 40.
- Request Body - JSON with:
- scheduling_plan: object; required. Full routing plan definition to import.
Request Example
curl -X POST -H "Authorization: Bearer <JWT>" -H "Content-Type: application/json" "https://<instance_name>/api/field-service/routing/v1/routingProfiles/AutoTestGroupActionDeleteOk/plans/custom-actions/import" -d '{ "scheduling_plan": { "label": "manual_plan", "name": "manual plan", "type": "manual" } }'
Response
- Media types: application/schema+json, application/json.
- Success
- 200 success summary: planLabel, profileLabel, created|updated, warnings, counts, links.export
- Error Handling
- 400 Bad Request:
- routingProfileLabel length not in [1, 40] or invalid payload.
- 401 Unauthorized:
- Missing or invalid Authorization bearer token.
- 404 Not Found:
- Unknown routing profile label.
- 409 Conflict:
- Plan with the same label already exists (import variant only).
- 400 Bad Request:
Force import of the unsigned routing plan
POST /api/field-service/routing/v1/routingProfiles/{routingProfileLabel}/plans/custom-actions/forceImport
Upserts a routing plan into a routing profile - inserting it if missing or updating it if it exists (no 409 errors for duplicates). Parameters and semantics are the same as the custom-actions/import endpoint.
- Auth: JWT Bearer; write scope for routing plan metadata.
- Path Parameters
- routingProfileLabel: string; required; minLength: 1; maxLength: 40.
- Request Body - JSON with:
- scheduling_plan: object; required. Full routing plan definition to import.
Request Example
curl -X POST -H "Authorization: Bearer <JWT>" -H "Content-Type: application/json" "https://<instance_name>/api/field-service/routing/v1/routingProfiles/AutoTestGroupActionDeleteOk/plans/custom-actions/forceImport" -d '{ "scheduling_plan": { "label": "manual_plan", "name": "manual plan", "type": "manual" } }'
Response
- Media types: application/schema+json, application/json.
- Success
- 200 success summary: planLabel, profileLabel, created|updated, warnings, counts, links.export
- Error Handling
- 400 Bad Request:
- routingProfileLabel length not in [1, 40] or invalid payload.
- 401 Unauthorized:
- Missing or invalid Authorization bearer token.
- 404 Not Found:
- Unknown routing profile label.
- 409 Conflict:
- Only for non-overridable conflicts (generally not returned for simple duplicates in forceImport).
- 400 Bad Request:
Assignment Report and Summary of the Routing
GET /api/field-service/routing/v1/routingRuns/{runId}/custom-actions/report
Retrieves a summary report and detailed per-activity assignment metrics for the specified routing run, including aggregate statistics and HATEOAS category links.
- assigned
- notAssigned
- reassigned
- reordered
- unassigned.
Request
- Auth: JWT Bearer; write scope for routing plan metadata.
- Path Parameters:
- runId: number; required. The ID of the routing run to be retrieved.
- Query Parameters: none
Request Example
curl -u '<CLIENT-ID>@<INSTANCE-NAME>:<CLIENT-SECRET>' -H 'Accept: application/json' 'https://<instance_name>/routingRuns/{runId}/custom-actions/report'
Response
- Media types: application/schema+json, application/json.
- Body - object with properties including:
- runId: number
- resourceId: number
- resourceExternalId: string
- schedulingPlanId: number
- planName: string
- planLabel: string
- schedulingPlanType: enum [manual, onceaday, recurrent, immediate, continuous]
- Aggregated metrics such as averageWaitingTimeMinutes, averageMileageKm, etc., and link objects for assigned, notAssigned, reassigned, reordered, unassigned (each with rel: canonical). Top-level links include canonical and describedby.
- Error Handling
- 400 Bad Request:
- runId is not a positive integer (or cannot parsed).
- 404 Not Found:
- Routing run with specified runId does not exist.
- 400 Bad Request:
Schema
{ "description":"The routing run report.", "properties":{ "runId":{ "type":"number", "description":"The ID of the routing run." }, "resourceId":{ "type":"number", "description":"The ID of the resource." }, "resourceExternalId":{ "type":"string", "description":"The external ID of the resource." }, "schedulingPlanId":{ "type":"number", "description":"The ID of the scheduling plan." }, "planName":{ "type":"string", "description":"The name of the scheduling plan." }, "planLabel":{ "type":"string", "description":"The label of the scheduling plan." }, "schedulingPlanType":{ "type":"string", "description":"The type of the scheduling plan/run.", "enum":[ "manual", "onceaday", "recurrent", "immediate", "continuous" ] }, "runStartType":{ "type":"string", "description":"How the run was started.", "enum":[ "automatic", "manual" ] }, "runDate":{ "type":"string", "format":"date", "description":"The date of the run." }, "routeDateStart":{ "type":"string", "format":"date", "description":"The start date of the route." }, "started":{ "type":"string", "format":"date-time", "description":"The start date and time of the run." }, "finished":{ "type":"string", "format":"date-time", "description":"The finish date and time of the run." }, "durationSeconds":{ "type":"number", "description":"The duration of the run in seconds." }, "totalResources":{ "type":"number", "description":"The total number of resources." }, "resourcesChangedRoutes":{ "type":"number", "description":"The number of resources that changed routes." }, "activitiesToBeAssigned":{ "type":"number", "description":"The number of activities to be assigned." }, "totalActivitiesChanged":{ "type":"number", "description":"The total number of activities changed." }, "assignedActivities":{ "type":"number", "description":"The number of assigned activities." }, "notAssignedActivities":{ "type":"number", "description":"The number of not assigned activities." }, "reassignedActivities":{ "type":"number", "description":"The number of reassigned activities." }, "reorderedActivities":{ "type":"number", "description":"The number of reordered activities." }, "unassignedActivities":{ "type":"number", "description":"The number of unassigned activities." }, "assurance":{ "type":"number", "description":"The assurance level." }, "resultStatus":{ "type":"string", "description":"The result status of the run.", "enum":[ "undefined", "rolledback", "scheduled", "running", "completed", "waiting", "stopped", "skipped", "failed" ] }, "resultDescription":{ "type":"string", "description":"The result description of the run." }, "averageWorkTimeMinutes":{ "type":"number", "description":"The average work time in minutes." }, "averageOvertimeMinutes":{ "type":"number", "description":"The average overtime in minutes." }, "averageTravelTimeMinutes":{ "type":"number", "description":"The average travel time in minutes." }, "averageWaitingTimeMinutes":{ "type":"number", "description":"The average waiting time in minutes." }, "averageMileageKm":{ "type":"number", "description":"The average mileage in kilometers." }, "assigned":{ "type":"object", "description":"Links to assigned activities." }, "notAssigned":{ "type":"object", "description":"Links to not assigned activities." }, "reassigned":{ "type":"object", "description":"Links to reassigned activities." }, "reordered":{ "type":"object", "description":"Links to reordered activities." }, "unassigned":{ "type":"object", "description":"Links to unassigned activities." } } }
Response Example
{ "runId": 1038866, "resourceId": 20399, "resourceExternalId": "bulk_routing_bucket", "schedulingPlanId": 186, "planName": "Bulk Routing", "planLabel": "BulkRouting", "schedulingPlanType": "manual", "runStartType": "manual", "runDate": "2025-08-01", "routeDateStart": "2025-08-01", "started": "2025-07-31T11:41:35", "finished": "2025-07-31T11:45:38", "durationSeconds": 243, "totalResources": 2, "resourcesChangedRoutes": 2, "activitiesToBeAssigned": 4, "totalActivitiesChanged": 7, "assignedActivities": 3, "notAssignedActivities": 1, "reassignedActivities": 1, "reorderedActivities": 1, "unassignedActivities": 1, "assurance": 99.900000000000006, "resultStatus": "completed", "resultDescription": null, "averageWorkTimeMinutes": 480.0, "averageOvertimeMinutes": 0.0, "averageTravelTimeMinutes": 20.0, "averageWaitingTimeMinutes": 330.0, "averageMileageKm": 2.0, "assigned": { "links": [ { "rel": "canonical", "href": "http://configuration-provider.ofsc.team/routingRuns/1038866/custom-actions/report/assigned" } ] }, "notAssigned": { "links": [ { "rel": "canonical", "href": "http://configuration-provider.ofsc.team/routingRuns/1038866/custom-actions/report/notAssigned" } ] }, "reassigned": { "links": [ { "rel": "canonical", "href": "http://configuration-provider.ofsc.team/routingRuns/1038866/custom-actions/report/reassigned" } ] }, "reordered": { "links": [ { "rel": "canonical", "href": "http://configuration-provider.ofsc.team/routingRuns/1038866/custom-actions/report/reordered" } ] }, "unassigned": { "links": [ { "rel": "canonical", "href": "http://configuration-provider.ofsc.team/routingRuns/1038866/custom-actions/report/unassigned" } ] }, "links": [ { "rel": "canonical", "href": "http://configuration-provider.ofsc.team/routingRuns/1038866" }, { "rel": "describedby", "href": "http://configuration-provider.ofsc.team/metadata-catalog/routingRuns" } ] }
Assigned sub-endpoint
Schema
{ "description": "The list of assigned activities.", "properties": { "items": { "type": "array", "items": { "type": "object", "properties": { "activityId": { "type": "number", "description": "The ID of the activity." }, "fromResource": { "type": "string", "description": "The external ID of the resource from which the activity was moved." }, "toResource": { "type": "string", "description": "The external ID of the resource to which the activity was moved." }, "fromDate": { "type": "string", "description": "The date from which the activity was moved.", "format": "date" }, "toDate": { "type": "string", "description": "The date to which the activity was moved.", "format": "date" }, "travelEstimationMethod": { "type": "number", "description": "The travel estimation method used." } } } }, "totalResults": { "type": "integer", "description": "The total number of items in the collection." }, "hasMore": { "type": "boolean", "description": "True if more results are available for paging; false otherwise." }, "offset": { "type": "integer", "description": "The offset value specified in the request." }, "limit": { "type": "integer", "description": "The limit value specified in the request. Defaults to 10." } } }
Assigned sub-endpoint
Result Example
{ "totalResults": 3, "limit": 10, "offset": 0, "hasMore": false, "items": [ { "activityId": 8769454, "fromResourceExternalId": "bulk_routing_bucket", "toResourceExternalId": "resource_phoenix", "fromDate": "2025-08-01", "toDate": "2025-08-01", "travelEstimationMethod": 12 }, { "activityId": 8769455, "fromResourceExternalId": "bulk_routing_bucket", "toResourceExternalId": "resource_phoenix", "fromDate": "2025-08-01", "toDate": "2025-08-01", "travelEstimationMethod": 105 }, { "activityId": 8769465, "fromResourceExternalId": "bulk_routing_bucket", "toResourceExternalId": "resource_phoenix", "fromDate": "2025-08-01", "toDate": "2025-08-01", "travelEstimationMethod": 12 } ], "links": [ { "rel": "describedby", "href": "http://configuration-provider.ofsc.team/metadata-catalog/routingRuns" }, { "rel": "canonical", "href": "http://configuration-provider.ofsc.team/routingRuns/1038866/custom-actions/report/assigned" }, { "rel": "next", "href": "http://configuration-provider.ofsc.team/routingRuns/1038866/custom-actions/report/assigned?offset=10&limit=10" } ] }
Not assigned sub-endpoint
Schema
{ "description": "The list of not assigned activities.", "properties": { "items": { "type": "array", "items": { "type": "object", "properties": { "activityId": { "type": "number", "description": "The ID of the activity." }, "initialResource": { "type": "string", "description": "The external ID of the initial resource." }, "notAssignedReasonCode": { "type": "number", "description": "The reason code for not assigning the activity." }, "errorMessage": { "type": "string", "description": "The error message for not assigning the activity." } } } }, "totalResults": { "type": "integer", "description": "The total number of items in the collection." }, "hasMore": { "type": "boolean", "description": "True if more results are available for paging; false otherwise." }, "offset": { "type": "integer", "description": "The offset value specified in the request." }, "limit": { "type": "integer", "description": "The limit value specified in the request. Defaults to 10." } } }
Not assigned sub-endpoint
Response Example
{ "totalResults": 1, "limit": 10, "offset": 0, "hasMore": false, "items": [ { "activityId": 8769456, "resourceExternalId": "bulk_routing_bucket", "notAssignedReasonCode": 6068, "notAssignedReason": "Field Resources with required Work Skills are not found." } ], "links": [ { "rel": "describedby", "href": "http://configuration-provider.ofsc.team/metadata-catalog/routingRuns" }, { "rel": "canonical", "href": "http://configuration-provider.ofsc.team/routingRuns/1038866/custom-actions/report/notAssigned" }, { "rel": "next", "href": "http://configuration-provider.ofsc.team/routingRuns/1038866/custom-actions/report/notAssigned?offset=10&limit=10" } ] }
Reassigned sub-endpoint
Schema
{ "description": "The list of reassigned activities.", "properties": { "items": { "type": "array", "items": { "type": "object", "properties": { "activityId": { "type": "number", "description": "The ID of the activity." }, "fromResource": { "type": "string", "description": "The external ID of the resource from which the activity was moved." }, "toResource": { "type": "string", "description": "The external ID of the resource to which the activity was moved." }, "fromDate": { "type": "string", "description": "The date from which the activity was moved.", "format": "date" }, "toDate": { "type": "string", "description": "The date to which the activity was moved.", "format": "date" }, "travelEstimationMethod": { "type": "number", "description": "The travel estimation method used." } } } }, "totalResults": { "type": "integer", "description": "The total number of items in the collection." }, "hasMore": { "type": "boolean", "description": "True if more results are available for paging; false otherwise." }, "offset": { "type": "integer", "description": "The offset value specified in the request." }, "limit": { "type": "integer", "description": "The limit value specified in the request. Defaults to 10." } } }
Reassigned sub-endpoint
Response Example
{ "totalResults": 1, "limit": 10, "offset": 0, "hasMore": false, "items": [ { "activityId": 8769459, "fromResourceExternalId": "bulk_routing_technician", "toResourceExternalId": "resource_phoenix", "fromDate": "2025-08-01", "toDate": "2025-08-01", "travelEstimationMethod": 12 } ], "links": [ { "rel": "describedby", "href": "http://configuration-provider.ofsc.team/metadata-catalog/routingRuns" }, { "rel": "canonical", "href": "http://configuration-provider.ofsc.team/routingRuns/1038866/custom-actions/report/reassigned" }, { "rel": "next", "href": "http://configuration-provider.ofsc.team/routingRuns/1038866/custom-actions/report/reassigned?offset=10&limit=10" } ] }
Reordered sub-endpoint
Schema
{ "description": "The list of reordered activities.", "properties": { "items": { "type": "array", "items": { "type": "object", "properties": { "activityId": { "type": "number", "description": "The ID of the activity." }, "resourceExternalId": { "type": "string", "description": "The external ID of the resource." }, "routeDate": { "type": "string", "description": "The date of the route.", "format": "date" }, "fromPreviousActivityId": { "type": "number", "description": "The ID of the previous activity before reordering." }, "toPreviousActivityId": { "type": "number", "description": "The ID of the previous activity after reordering." }, "travelEstimationMethod": { "type": "number", "description": "The travel estimation method used." } } } }, "totalResults": { "type": "integer", "description": "The total number of items in the collection." }, "hasMore": { "type": "boolean", "description": "True if more results are available for paging; false otherwise." }, "offset": { "type": "integer", "description": "The offset value specified in the request." }, "limit": { "type": "integer", "description": "The limit value specified in the request. Defaults to 10." } } }
Reordered sub-endpoint
Response Example
{ "totalResults": 1, "limit": 10, "offset": 0, "hasMore": false, "items": [ { "activityId": 8769457, "resourceExternalId": "bulk_routing_technician", "routeDate": "2025-08-01", "fromPreviousActivityId": 8769458, "toPreviousActivityId": 8769467, "travelEstimationMethod": 12 } ], "links": [ { "rel": "describedby", "href": "http://configuration-provider.ofsc.team/metadata-catalog/routingRuns" }, { "rel": "canonical", "href": "http://configuration-provider.ofsc.team/routingRuns/1038866/custom-actions/report/reordered" }, { "rel": "next", "href": "http://configuration-provider.ofsc.team/routingRuns/1038866/custom-actions/report/reordered?offset=10&limit=10" } ] }
Unassigned sub-endpoint
Schema
{ "description": "The list of unassigned activities.", "properties": { "items": { "type": "array", "items": { "type": "object", "properties": { "activityId": { "type": "number", "description": "The ID of the activity." }, "fromResource": { "type": "string", "description": "The external ID of the resource from which the activity was moved." }, "toResource": { "type": "string", "description": "The external ID of the resource to which the activity was moved." }, "fromDate": { "type": "string", "description": "The date from which the activity was moved.", "format": "date" }, "toDate": { "type": "string", "description": "The date to which the activity was moved.", "format": "date" }, "travelEstimationMethod": { "type": "number", "description": "The travel estimation method used." } } } }, "totalResults": { "type": "integer", "description": "The total number of items in the collection." }, "hasMore": { "type": "boolean", "description": "True if more results are available for paging; false otherwise." }, "offset": { "type": "integer", "description": "The offset value specified in the request." }, "limit": { "type": "integer", "description": "The limit value specified in the request. Defaults to 10." } } }
Unassigned sub-endpoint
Response Example
{ "totalResults": 1, "limit": 10, "offset": 0, "hasMore": false, "items": [ { "activityId": 8769464, "fromResourceExternalId": "resource_phoenix", "toResourceExternalId": "bulk_routing_bucket", "fromDate": "2025-08-01", "toDate": "2025-08-01", "travelEstimationMethod": 14 } ], "links": [ { "rel": "describedby", "href": "http://configuration-provider.ofsc.team/metadata-catalog/routingRuns" }, { "rel": "canonical", "href": "http://configuration-provider.ofsc.team/routingRuns/1038866/custom-actions/report/unassigned" }, { "rel": "next", "href": "http://configuration-provider.ofsc.team/routingRuns/1038866/custom-actions/report/unassigned?offset=10&limit=10" } ] }
Business Benefits
- Future-Ready Discovery and Integration: Consistent, public, paginated endpoints enable seamless discovery of routing profiles and their associated buckets, supporting new UI development and automation use cases.
- Increased Operational Efficiency: Streamlined, API-driven access to routing data and plans reduces manual effort and accelerates business processes.
- Improved Data Visibility: Detailed retrieval and reporting endpoints provide transparency into routing activity, enabling better monitoring and analytics.
- Standardized API Contracts and Error Handling: Uniform interfaces and predictable error responses increase reliability for integrations and internal tools, lowering maintenance overhead.
- Enhanced Automation and Integration: Import/export and upsert endpoints facilitate automated deployment and synchronization of routing plans across environments and external systems, including AI-based tools.
Steps to enable and configure
- No special enablement is required; these endpoints are accessible with standard platform authentication and authorization:
- A JWT Bearer token is required.
- Read scopes are enforced for metadata endpoints (e.g.,
platform:metadata_api_routing_profile:read).
- Client applications should provide valid
limitandoffsetvalues, and correctly handle pagination links and thehasMoreflag according to the service’s collection contract. - Before integrating with internal or third-party tools, ensure all usage complies with Oracle security, privacy, and compliance guidelines.
Tips and considerations
Request/Response Details
All list endpoints returning collections share a consistent response structure, including:
- items: Array of results
- totalResults (Integer): Total number of items available
- limit (Integer): Maximum number of items returned per page
- offset (Integer): Zero-based index of the first item in the results
- hasMore (Boolean): Indicates if additional results are available
- links: HATEOAS links, including
canonicalanddescribedby; the next link is included when more results exist
Authentication and Authorization
- JWT Bearer token is required.
- Read scope
platform:metadata_api_routing_profile:readis enforced for these GET endpoints.
Pagination
- Default limits apply;
limitmust be within supported bounds andoffsetmust begreater than or equal toZero. - Invalid values for pagination parameters result in a
400 Bad Request error.
Label Validation
- Labels must be non-empty and within the permitted length.
- Invalid label values return a
400 Bad Requestresponse with a descriptive message.
Error Handling
- Standardized
4xx/5xxerror codes are used. - Callers should display error messages and only consider retrying idempotent GET requests.
Security
- Ensure that tokens and scopes comply with Oracle’s internal security, privacy, and compliance guidelines before integrating these endpoints into automation or tooling.
Key resources
NA
Access requirements
NA