Message Ops

Use the HTTPS Web origin for the /api/v1 routes. The stock Web deployment does not forward the legacy /oauth/token route; see the integration limitation below. URL-encode environment, VPN, queue and identifier path segments. Swagger is disabled outside development/test; do not expect /api/docs on a production installation.

Authentication and permission model

Use a sop_ token for integrations through the public Web origin. Service Accounts require their own scoped roles and an existing matching service policy for broker operations; v1.7.1 has no customer UI/API to provision that policy. Personal tokens require administrator-enabled API access and use manual assignments only, never SSO-derived grants. A manual Queue Viewer/Queue Operator assignment supplies human queue access; see queue access and policy limits. Both use Authorization: Bearer sop_...; tokens are shown once, expire after the configured period (default 90 days) and are invalidated by regeneration. A valid token does not bypass environment/queue policies, content permissions, license limits or safety controls.

Browser sign-in uses Secure/HttpOnly session cookies in production. Explicit Bearer credentials take precedence over cookies. Sensitive administrative operations require a human session with recent MFA; possession of a long-lived token alone cannot satisfy interactive step-up. Cookie-authenticated writes are subject to origin/CSRF checks.

The API contains a legacy POST /oauth/token endpoint, but it is unavailable through the stock public Web route. The API backend is internal, and there is no /api/v1/oauth/token alias. Do not expose the entire API to make this route reachable. Legacy client credentials also lack environment role assignments, so their scopes alone cannot authorize broker operations. Public integrations should use the token paths and policy prerequisites above.

Search and inspect messages

For broker examples, use a personal token with manual queue assignments or a service account whose required persisted policy has already been provisioned and verified. For the shell examples, set WEB_URL to your public HTTPS origin without a trailing slash and supply TOKEN from your approved credential store. Examples use illustrative environment production, VPN default and queue DMQ.EXAMPLE; substitute a scope your account may access. Do not paste token values into shared scripts or logs.

curl --fail-with-body --silent --show-error "$WEB_URL/api/v1/environments" \
  -H "Authorization: Bearer $TOKEN"
curl --fail-with-body --silent --show-error \
  "$WEB_URL/api/v1/environments/production/vpns/default/queues?includeStats=true" \
  -H "Authorization: Bearer $TOKEN"

Search has a flat JSON body. A metadata-only example avoids assuming content-read permission:

curl --fail-with-body --silent --show-error -X POST "$WEB_URL/api/v1/messages/search" \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  --data '{
    "environmentId": "production",
    "vpnName": "default",
    "queueName": "DMQ.EXAMPLE",
    "searchTerm": "order-123",
    "searchFields": ["messageId", "correlationId"],
    "maxMessagesToScan": 1000,
    "maxResults": 25,
    "includePayloadPreview": false
  }'

HTTP 202 returns {"searchId":"...","status":"accepted"}. Set SEARCH_ID from that response and poll at a reasonable interval until completed or failed:

curl --fail-with-body --silent --show-error "$WEB_URL/api/v1/messages/searches/$SEARCH_ID" \
  -H "Authorization: Bearer $TOKEN"
curl --fail-with-body --silent --show-error "$WEB_URL/api/v1/messages/searches/$SEARCH_ID/results" \
  -H "Authorization: Bearer $TOKEN"

Results contain searchId, status and results. Use a returned messageRef with GET /api/v1/messages/{messageRef}; full payload is GET /api/v1/messages/{messageRef}/payload with payload permission. Search resources are distinct from operation jobs.

Search and inspect messages
Search fieldv1.7.1 behavior
environmentId, vpnName, queueNameRequired nonempty strings.
searchTermNonblank, maximum 4,096 characters; case-insensitive substring match across selected fields.
searchFieldsNonempty unique list of messageId, correlationId, destination, properties, payload; omission selects all.
destination, messageId, correlationId, replicationGroupMessageIdOptional exact filters.
timeWindowOptional from/to date-time strings; from must not exceed to.
properties, payloadContainsExact property map or payload substring; content-read permission required.
transactionId, senderSystem, receiverSystem, senderInterfaceName, receiverInterfaceName, sapDocumentNumber, shipmentNumberOptional business-key filters; content-read permission required.
maxMessagesToScanInteger 1–500,000; deployment default 100,000.
maxResultsInteger 1–10,000; default 100.
includePayloadPreviewDefault false; forced off without payload-read permission.
payloadPreviewBytesInteger 1–65,536; Worker default 1,024.

Content-bearing unified searches, including omitted searchFields, require source-queue content-read permission. Stored content searches remain protected on later status/result reads. A 256 MiB aggregate browse-buffer bound can stop a search before its requested count. Unknown search fields are rejected. See Queues and Messages for masking and reference expiry.

Submit an operation and read its outcome

POST /api/v1/resubmissions, /moves and /deletions accept explicit environmentId and a selection. Use either selection.messageRefs or selection.criteria with vpnName and queueName, plus search predicates. Reference selections must resolve to the expected scope. Criteria are resolved against the live queue and the bulk limit applies; no matches produce CRITERIA_NO_MATCHES.

Resubmit/move also require target.type (queue or topic) and target.destination. Destination permissions are checked separately. Move also requires source-delete authority. Direct move/delete require reason and always require changeReference in production. The following dry-run move uses a live reference obtained from your search; replace msgref-from-your-search before submission:

{
  "environmentId": "production",
  "selection": {"messageRefs": ["msgref-from-your-search"]},
  "target": {"type": "queue", "destination": "RETRY.QUEUE"},
  "options": {"dryRun": true},
  "reason": "Verify retry selection",
  "changeReference": "CHG-12345",
  "idempotencyKey": "unique-key-for-this-dry-run"
}

Save the edited request as move-request.json and submit:

curl --fail-with-body --silent --show-error -X POST "$WEB_URL/api/v1/moves" \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  --data-binary @move-request.json

The HTTP 202 response is a public job object with id and status. Follow GET /api/v1/jobs/{id}, /events and /report. Dry run does not mutate the broker and does not guarantee a later live result. Use a new idempotency key if changing from dry run to a real request.

For move and delete, idempotencyKey is an optional JSON body field. Reuse it with the same request to retrieve the existing job after an uncertain submission response; a different request with the same key conflicts. Keys are scoped to authenticated identity kind and ID, and normal access checks still apply. Do not rely on an Idempotency-Key HTTP header in v1.7.1; it is not read by these handlers. Resubmission does not cache idempotent responses. Check existing jobs before resubmitting a possibly accepted request.

Resubmit options include dryRun, preserveHeaders, preserveProperties and addResubmissionMetadata. The API accepts maxRatePerSecond, but the v1.7.1 Worker does not enforce it; do not use it as a rate limit. Move supports dry run and header/property preservation; delete supports dry run. Resubmit leaves the original in place; use move when source removal is intended. Broker acknowledgement is required before move removes the source. Cancellation is cooperative and does not undo completed items.

Schedule an operation

POST /api/v1/schedules accepts name, operation (resubmit, move, delete) and request_template, using the corresponding operation body. In production, every request_template must include changeReference, including resubmit; move/delete also require reason. For one-time work, set schedule_type: "once" and a future ISO 8601 run_at with year and UTC offset. For recurring work, set schedule_type: "cron" and a five-field UTC schedule_expression. Do not provide both timing fields.

This recurring dry-run example resolves a fresh bounded selection at 02:00 UTC daily:

{
  "name": "Daily retry review",
  "operation": "move",
  "schedule_type": "cron",
  "schedule_expression": "0 2 * * *",
  "request_template": {
    "environmentId": "production",
    "selection": {"criteria": {"vpnName": "default", "queueName": "DMQ.EXAMPLE", "maxResults": 25}},
    "target": {"type": "queue", "destination": "RETRY.QUEUE"},
    "options": {"dryRun": true},
    "reason": "Scheduled retry review",
    "changeReference": "CHG-12345"
  }
}

Review and disable/delete a test schedule after validation. Editing/enabling transfers execution ownership to the manager. Use criteria rather than expiring references for recurring work. Schedules explains timing, consumed one-time runs and recovery.

Errors

Most errors use an error object containing code, message, correlationId and details. Validation messages can be arrays. Server failures return a generic message; use the correlation ID with sanitized service logs. Typical HTTP outcomes are 400 invalid input, 401 missing/expired credentials, 403 policy/license/MFA denial, 404 missing resource, 409 state/idempotency conflict, 410 expired reference and 429 throttling.

The legacy OAuth route instead returns OAuth JSON such as {"error":"invalid_request"} (400), unsupported_grant_type (400) or invalid_client (401). An accepted job can fail later; HTTP submission status is not its terminal result. See Troubleshooting for recovery actions.

Endpoint directory

Paths below are complete HTTP paths. Every protected operation enforces its applicable permission, scope, license and MFA checks; the presence of a route does not grant access. Request bodies for operational workflows are described above; administrator task guides explain the corresponding settings and controls. For generated clients, obtain the release-matched OpenAPI contract from your supplier and validate these v1.7.1 limits and authentication requirements when integrating.

Authentication and profile

Authentication and profile
MethodPathPurpose
POST/api/v1/auth/change-passwordChange the current user’s local password
POST/api/v1/auth/loginLocal email/password sign-in
POST/api/v1/auth/logoutClear the current browser/API session
GET/api/v1/auth/methodsList available authentication methods
POST/api/v1/auth/methods/resolveResolve available authentication methods for a login hint
POST/api/v1/auth/mfa/challenge/optionsGet MFA challenge options for the pending sign-in
POST/api/v1/auth/mfa/recovery-code/verifyVerify a recovery code using a pre-MFA token
GET/api/v1/auth/mfa/statusAuthenticated user MFA status
POST/api/v1/auth/mfa/step-up/recovery-code/verifyVerify a recovery code for a step-up MFA challenge
POST/api/v1/auth/mfa/step-up/totp/verifyVerify a TOTP code for a step-up MFA challenge
POST/api/v1/auth/mfa/step-up/webauthn/startStart a passkey step-up challenge
POST/api/v1/auth/mfa/step-up/webauthn/verifyVerify a passkey step-up challenge
POST/api/v1/auth/mfa/totp/challenge/verifyVerify a TOTP code using a pre-MFA token
POST/api/v1/auth/mfa/totp/enroll/confirmConfirm TOTP enrollment for the authenticated user
POST/api/v1/auth/mfa/totp/enroll/startStart TOTP enrollment for the authenticated user
POST/api/v1/auth/mfa/webauthn/challenge/startStart a passkey authentication challenge using a pre-MFA token
POST/api/v1/auth/mfa/webauthn/challenge/verifyVerify a passkey authentication challenge using a pre-MFA token
POST/api/v1/auth/mfa/webauthn/enroll/confirmConfirm passkey enrollment for the authenticated user
POST/api/v1/auth/mfa/webauthn/enroll/startStart passkey enrollment for the authenticated user
GET/api/v1/auth/sessionGet the current session
GET/api/v1/auth/sso/callbackOIDC callback endpoint
POST/api/v1/auth/sso/callbackSAML callback endpoint
POST/api/v1/auth/sso/startStart an SSO sign-in flow
GET/api/v1/meCurrent authenticated user profile
GET/api/v1/me/mfaCurrent authenticated user MFA status
DELETE/api/v1/me/mfa/credentials/{credentialId}Delete a current user MFA credential
POST/api/v1/me/mfa/recovery-codes/regenerateRegenerate current user recovery codes
PATCH/api/v1/me/preferencesUpdate current authenticated user profile preferences
POST/api/v1/users/me/api-tokenGenerate or regenerate personal API token
POST/oauth/tokenLegacy backend endpoint; unavailable through stock public Web ingress

Broker operations and schedules

Broker operations and schedules
MethodPathPurpose
POST/api/v1/messages/searchSearch/browse messages on a queue
GET/api/v1/messages/searches/{searchId}Get search status
GET/api/v1/messages/searches/{searchId}/resultsGet search results
GET/api/v1/messages/{messageRef}Get message metadata, headers, properties and payload preview
GET/api/v1/messages/{messageRef}/payloadGet full payload where authorised
GET/api/v1/audit/eventsSearch audit events
GET/api/v1/audit/events/{eventId}Get a single audit event
POST/api/v1/deletionsCreate a delete/clean job
POST/api/v1/deletions/previewPreview a deletion (dry run)
GET/api/v1/deletions/{jobId}Get a deletion job
POST/api/v1/deletions/{jobId}/cancelCancel a deletion job
GET/api/v1/deletions/{jobId}/reportGet a deletion outcome report
GET/api/v1/environmentsList environments visible to the caller
POST/api/v1/environmentsCreate environment profile
POST/api/v1/environments/resolve-targetsResolve environments by tags and labels
DELETE/api/v1/environments/{environmentId}Disable/delete environment profile
GET/api/v1/environments/{environmentId}Get environment profile
PATCH/api/v1/environments/{environmentId}Update environment profile
GET/api/v1/environments/{environmentId}/queue-inventory/statusGet queue inventory refresh status
POST/api/v1/environments/{environmentId}/queue-inventory/syncTrigger asynchronous queue inventory sync
POST/api/v1/environments/{environmentId}/test-connectionTest SEMP and messaging connectivity
GET/api/v1/environments/{environmentId}/vpnsList message VPNs visible to the caller
GET/api/v1/environments/{environmentId}/vpns/{vpnName}/queuesList queues visible to the caller
GET/api/v1/environments/{environmentId}/vpns/{vpnName}/queues/{queueName}Get queue details
GET/api/v1/environments/{environmentId}/vpns/{vpnName}/queues/{queueName}/statsGet queue statistics
GET/api/v1/jobsList jobs visible to the caller
GET/api/v1/jobs/{jobId}Get job
POST/api/v1/jobs/{jobId}/cancelCancel job where supported
GET/api/v1/jobs/{jobId}/eventsGet job event stream/history
GET/api/v1/jobs/{jobId}/reportGet job report
POST/api/v1/movesCreate a move job; publish to target then remove original after success
POST/api/v1/moves/previewPreview a move (dry run)
GET/api/v1/moves/{jobId}Get a move job
POST/api/v1/moves/{jobId}/cancelCancel a move job
GET/api/v1/moves/{jobId}/reportGet a move outcome report
POST/api/v1/resubmissionsCreate a resubmission job
POST/api/v1/resubmissions/previewPreview a resubmission (dry run)
GET/api/v1/resubmissions/{jobId}Get a resubmission job
POST/api/v1/resubmissions/{jobId}/cancelCancel a resubmission job
GET/api/v1/resubmissions/{jobId}/reportGet a resubmission outcome report
GET/api/v1/schedulesList schedules
POST/api/v1/schedulesCreate scheduled batch job
DELETE/api/v1/schedules/{id}Delete a schedule
GET/api/v1/schedules/{id}Get a schedule
PATCH/api/v1/schedules/{id}Update a schedule
POST/api/v1/schedules/{id}/disableDisable a schedule
POST/api/v1/schedules/{id}/enableEnable a schedule
GET/api/v1/schedules/{id}/executionsList a schedule’s execution history

Administration and integrations

Administration and integrations
MethodPathPurpose
GET/api/v1/admin/api-clientsList machine API clients
POST/api/v1/admin/api-clientsCreate a machine API client
DELETE/api/v1/admin/api-clients/{clientId}Delete a machine API client
PATCH/api/v1/admin/api-clients/{clientId}Update a machine API client
GET/api/v1/admin/auth-policyGet the global authentication policy
PUT/api/v1/admin/auth-policyUpdate the global authentication policy
POST/api/v1/admin/auth/login-throttle/resetReset password attempt budgets for a resolved client IP
GET/api/v1/admin/auth/settingsGet global auth settings
PUT/api/v1/admin/auth/settingsUpdate global auth settings
GET/api/v1/admin/environment-groupsList accessible environment groups
POST/api/v1/admin/environment-groupsCreate an environment group
DELETE/api/v1/admin/environment-groups/{groupId}Delete an environment group
GET/api/v1/admin/environment-groups/{groupId}Get environment group detail
PATCH/api/v1/admin/environment-groups/{groupId}Update an environment group
GET/api/v1/admin/environment-groups/{groupId}/assignmentsList role assignments referencing this group
PUT/api/v1/admin/environment-groups/{groupId}/membersReplace group members
GET/api/v1/admin/group-syncList group sync mappings
POST/api/v1/admin/group-syncCreate group sync mapping
DELETE/api/v1/admin/group-sync/{mappingId}Delete group sync mapping
PATCH/api/v1/admin/group-sync/{mappingId}Update group sync mapping
GET/api/v1/admin/rolesList RBAC roles
POST/api/v1/admin/rolesCreate custom role
DELETE/api/v1/admin/roles/{roleId}Delete custom role
PATCH/api/v1/admin/roles/{roleId}Update custom role
GET/api/v1/admin/settings/api-tokenGet platform API token settings
PATCH/api/v1/admin/settings/api-tokenUpdate platform API token settings
PUT/api/v1/admin/settings/dashboardUpdate the dashboard configuration
GET/api/v1/admin/settings/observabilityGet observability settings
PUT/api/v1/admin/settings/observabilityUpdate observability settings
POST/api/v1/admin/settings/observability/testTest a saved observability endpoint
GET/api/v1/admin/settings/retentionGet platform data-retention settings
PATCH/api/v1/admin/settings/retentionUpdate platform data-retention settings
GET/api/v1/admin/settings/semp-trafficRead SEMP background cadence and shared cache settings
PATCH/api/v1/admin/settings/semp-trafficReplace SEMP background cadence and shared cache settings
GET/api/v1/admin/settings/semp-usageRead near-real-time per-environment physical SEMP usage
GET/api/v1/admin/sso/provider-presetsList SSO provider presets
GET/api/v1/admin/sso/providersList SSO providers
POST/api/v1/admin/sso/providersCreate an SSO provider
POST/api/v1/admin/sso/providers/parse-metadataParse uploaded IdP metadata into provider fields
DELETE/api/v1/admin/sso/providers/{providerId}Archive an SSO provider
GET/api/v1/admin/sso/providers/{providerId}Get an SSO provider
PATCH/api/v1/admin/sso/providers/{providerId}Update an SSO provider
POST/api/v1/admin/sso/providers/{providerId}/disableDisable an SSO provider
POST/api/v1/admin/sso/providers/{providerId}/enableEnable an SSO provider
POST/api/v1/admin/sso/providers/{providerId}/testTest an SSO provider configuration
GET/api/v1/admin/usersList managed users
POST/api/v1/admin/usersCreate managed user
GET/api/v1/admin/users/sponsor-candidatesSearch for sponsor candidates
DELETE/api/v1/admin/users/{userId}Delete managed user
GET/api/v1/admin/users/{userId}Get managed user
PATCH/api/v1/admin/users/{userId}Update managed user
PATCH/api/v1/admin/users/{userId}/api-accessEnable or disable API access for a managed user
POST/api/v1/admin/users/{userId}/api-tokenAdmin — generate or regenerate API token for a user or Service Account
GET/api/v1/admin/users/{userId}/ip-allowlistGet IP allowlist for a Service Account
PUT/api/v1/admin/users/{userId}/ip-allowlistReplace IP allowlist for a Service Account
POST/api/v1/admin/users/{userId}/reset-mfaReset MFA for a managed user
POST/api/v1/admin/users/{userId}/revoke-sessionsRevoke all of a user’s active sessions
PATCH/api/v1/admin/users/{userId}/sponsorChange the Sponsor for a Service Account
GET/api/v1/compliance/evidenceList compliance-evidence bundles
POST/api/v1/compliance/evidenceGenerate a compliance-evidence bundle
GET/api/v1/compliance/evidence/{id}Get a compliance-evidence bundle
GET/api/v1/compliance/evidence/{id}/exportExport a compliance-evidence bundle
POST/api/v1/licenseUpload and activate a signed JSON license
GET/api/v1/license/statusGet platform license status
GET/api/v1/observability/browser-configGet browser telemetry configuration
POST/api/v1/observability/browser-tracesBrowser OTLP trace proxy
GET/api/v1/platform-infoGet public platform/dashboard configuration
POST/api/v1/service-accounts/{serviceAccountId}/api-tokenSponsor — generate or regenerate API token for a Service Account
GET/api/v1/service-accounts/{serviceAccountId}/ip-allowlistSponsor — get IP allowlist for a Service Account

Confirm