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 field | v1.7.1 behavior |
|---|---|
environmentId, vpnName, queueName | Required nonempty strings. |
searchTerm | Nonblank, maximum 4,096 characters; case-insensitive substring match across selected fields. |
searchFields | Nonempty unique list of messageId, correlationId, destination, properties, payload; omission selects all. |
destination, messageId, correlationId, replicationGroupMessageId | Optional exact filters. |
timeWindow | Optional from/to date-time strings; from must not exceed to. |
properties, payloadContains | Exact property map or payload substring; content-read permission required. |
transactionId, senderSystem, receiverSystem, senderInterfaceName, receiverInterfaceName, sapDocumentNumber, shipmentNumber | Optional business-key filters; content-read permission required. |
maxMessagesToScan | Integer 1–500,000; deployment default 100,000. |
maxResults | Integer 1–10,000; default 100. |
includePayloadPreview | Default false; forced off without payload-read permission. |
payloadPreviewBytes | Integer 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
| Method | Path | Purpose |
|---|---|---|
| POST | /api/v1/auth/change-password | Change the current user’s local password |
| POST | /api/v1/auth/login | Local email/password sign-in |
| POST | /api/v1/auth/logout | Clear the current browser/API session |
| GET | /api/v1/auth/methods | List available authentication methods |
| POST | /api/v1/auth/methods/resolve | Resolve available authentication methods for a login hint |
| POST | /api/v1/auth/mfa/challenge/options | Get MFA challenge options for the pending sign-in |
| POST | /api/v1/auth/mfa/recovery-code/verify | Verify a recovery code using a pre-MFA token |
| GET | /api/v1/auth/mfa/status | Authenticated user MFA status |
| POST | /api/v1/auth/mfa/step-up/recovery-code/verify | Verify a recovery code for a step-up MFA challenge |
| POST | /api/v1/auth/mfa/step-up/totp/verify | Verify a TOTP code for a step-up MFA challenge |
| POST | /api/v1/auth/mfa/step-up/webauthn/start | Start a passkey step-up challenge |
| POST | /api/v1/auth/mfa/step-up/webauthn/verify | Verify a passkey step-up challenge |
| POST | /api/v1/auth/mfa/totp/challenge/verify | Verify a TOTP code using a pre-MFA token |
| POST | /api/v1/auth/mfa/totp/enroll/confirm | Confirm TOTP enrollment for the authenticated user |
| POST | /api/v1/auth/mfa/totp/enroll/start | Start TOTP enrollment for the authenticated user |
| POST | /api/v1/auth/mfa/webauthn/challenge/start | Start a passkey authentication challenge using a pre-MFA token |
| POST | /api/v1/auth/mfa/webauthn/challenge/verify | Verify a passkey authentication challenge using a pre-MFA token |
| POST | /api/v1/auth/mfa/webauthn/enroll/confirm | Confirm passkey enrollment for the authenticated user |
| POST | /api/v1/auth/mfa/webauthn/enroll/start | Start passkey enrollment for the authenticated user |
| GET | /api/v1/auth/session | Get the current session |
| GET | /api/v1/auth/sso/callback | OIDC callback endpoint |
| POST | /api/v1/auth/sso/callback | SAML callback endpoint |
| POST | /api/v1/auth/sso/start | Start an SSO sign-in flow |
| GET | /api/v1/me | Current authenticated user profile |
| GET | /api/v1/me/mfa | Current authenticated user MFA status |
| DELETE | /api/v1/me/mfa/credentials/{credentialId} | Delete a current user MFA credential |
| POST | /api/v1/me/mfa/recovery-codes/regenerate | Regenerate current user recovery codes |
| PATCH | /api/v1/me/preferences | Update current authenticated user profile preferences |
| POST | /api/v1/users/me/api-token | Generate or regenerate personal API token |
| POST | /oauth/token | Legacy backend endpoint; unavailable through stock public Web ingress |
Broker operations and schedules
| Method | Path | Purpose |
|---|---|---|
| POST | /api/v1/messages/search | Search/browse messages on a queue |
| GET | /api/v1/messages/searches/{searchId} | Get search status |
| GET | /api/v1/messages/searches/{searchId}/results | Get search results |
| GET | /api/v1/messages/{messageRef} | Get message metadata, headers, properties and payload preview |
| GET | /api/v1/messages/{messageRef}/payload | Get full payload where authorised |
| GET | /api/v1/audit/events | Search audit events |
| GET | /api/v1/audit/events/{eventId} | Get a single audit event |
| POST | /api/v1/deletions | Create a delete/clean job |
| POST | /api/v1/deletions/preview | Preview a deletion (dry run) |
| GET | /api/v1/deletions/{jobId} | Get a deletion job |
| POST | /api/v1/deletions/{jobId}/cancel | Cancel a deletion job |
| GET | /api/v1/deletions/{jobId}/report | Get a deletion outcome report |
| GET | /api/v1/environments | List environments visible to the caller |
| POST | /api/v1/environments | Create environment profile |
| POST | /api/v1/environments/resolve-targets | Resolve 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/status | Get queue inventory refresh status |
| POST | /api/v1/environments/{environmentId}/queue-inventory/sync | Trigger asynchronous queue inventory sync |
| POST | /api/v1/environments/{environmentId}/test-connection | Test SEMP and messaging connectivity |
| GET | /api/v1/environments/{environmentId}/vpns | List message VPNs visible to the caller |
| GET | /api/v1/environments/{environmentId}/vpns/{vpnName}/queues | List 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}/stats | Get queue statistics |
| GET | /api/v1/jobs | List jobs visible to the caller |
| GET | /api/v1/jobs/{jobId} | Get job |
| POST | /api/v1/jobs/{jobId}/cancel | Cancel job where supported |
| GET | /api/v1/jobs/{jobId}/events | Get job event stream/history |
| GET | /api/v1/jobs/{jobId}/report | Get job report |
| POST | /api/v1/moves | Create a move job; publish to target then remove original after success |
| POST | /api/v1/moves/preview | Preview a move (dry run) |
| GET | /api/v1/moves/{jobId} | Get a move job |
| POST | /api/v1/moves/{jobId}/cancel | Cancel a move job |
| GET | /api/v1/moves/{jobId}/report | Get a move outcome report |
| POST | /api/v1/resubmissions | Create a resubmission job |
| POST | /api/v1/resubmissions/preview | Preview a resubmission (dry run) |
| GET | /api/v1/resubmissions/{jobId} | Get a resubmission job |
| POST | /api/v1/resubmissions/{jobId}/cancel | Cancel a resubmission job |
| GET | /api/v1/resubmissions/{jobId}/report | Get a resubmission outcome report |
| GET | /api/v1/schedules | List schedules |
| POST | /api/v1/schedules | Create 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}/disable | Disable a schedule |
| POST | /api/v1/schedules/{id}/enable | Enable a schedule |
| GET | /api/v1/schedules/{id}/executions | List a schedule’s execution history |
Administration and integrations
| Method | Path | Purpose |
|---|---|---|
| GET | /api/v1/admin/api-clients | List machine API clients |
| POST | /api/v1/admin/api-clients | Create 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-policy | Get the global authentication policy |
| PUT | /api/v1/admin/auth-policy | Update the global authentication policy |
| POST | /api/v1/admin/auth/login-throttle/reset | Reset password attempt budgets for a resolved client IP |
| GET | /api/v1/admin/auth/settings | Get global auth settings |
| PUT | /api/v1/admin/auth/settings | Update global auth settings |
| GET | /api/v1/admin/environment-groups | List accessible environment groups |
| POST | /api/v1/admin/environment-groups | Create 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}/assignments | List role assignments referencing this group |
| PUT | /api/v1/admin/environment-groups/{groupId}/members | Replace group members |
| GET | /api/v1/admin/group-sync | List group sync mappings |
| POST | /api/v1/admin/group-sync | Create 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/roles | List RBAC roles |
| POST | /api/v1/admin/roles | Create 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-token | Get platform API token settings |
| PATCH | /api/v1/admin/settings/api-token | Update platform API token settings |
| PUT | /api/v1/admin/settings/dashboard | Update the dashboard configuration |
| GET | /api/v1/admin/settings/observability | Get observability settings |
| PUT | /api/v1/admin/settings/observability | Update observability settings |
| POST | /api/v1/admin/settings/observability/test | Test a saved observability endpoint |
| GET | /api/v1/admin/settings/retention | Get platform data-retention settings |
| PATCH | /api/v1/admin/settings/retention | Update platform data-retention settings |
| GET | /api/v1/admin/settings/semp-traffic | Read SEMP background cadence and shared cache settings |
| PATCH | /api/v1/admin/settings/semp-traffic | Replace SEMP background cadence and shared cache settings |
| GET | /api/v1/admin/settings/semp-usage | Read near-real-time per-environment physical SEMP usage |
| GET | /api/v1/admin/sso/provider-presets | List SSO provider presets |
| GET | /api/v1/admin/sso/providers | List SSO providers |
| POST | /api/v1/admin/sso/providers | Create an SSO provider |
| POST | /api/v1/admin/sso/providers/parse-metadata | Parse 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}/disable | Disable an SSO provider |
| POST | /api/v1/admin/sso/providers/{providerId}/enable | Enable an SSO provider |
| POST | /api/v1/admin/sso/providers/{providerId}/test | Test an SSO provider configuration |
| GET | /api/v1/admin/users | List managed users |
| POST | /api/v1/admin/users | Create managed user |
| GET | /api/v1/admin/users/sponsor-candidates | Search 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-access | Enable or disable API access for a managed user |
| POST | /api/v1/admin/users/{userId}/api-token | Admin — generate or regenerate API token for a user or Service Account |
| GET | /api/v1/admin/users/{userId}/ip-allowlist | Get IP allowlist for a Service Account |
| PUT | /api/v1/admin/users/{userId}/ip-allowlist | Replace IP allowlist for a Service Account |
| POST | /api/v1/admin/users/{userId}/reset-mfa | Reset MFA for a managed user |
| POST | /api/v1/admin/users/{userId}/revoke-sessions | Revoke all of a user’s active sessions |
| PATCH | /api/v1/admin/users/{userId}/sponsor | Change the Sponsor for a Service Account |
| GET | /api/v1/compliance/evidence | List compliance-evidence bundles |
| POST | /api/v1/compliance/evidence | Generate a compliance-evidence bundle |
| GET | /api/v1/compliance/evidence/{id} | Get a compliance-evidence bundle |
| GET | /api/v1/compliance/evidence/{id}/export | Export a compliance-evidence bundle |
| POST | /api/v1/license | Upload and activate a signed JSON license |
| GET | /api/v1/license/status | Get platform license status |
| GET | /api/v1/observability/browser-config | Get browser telemetry configuration |
| POST | /api/v1/observability/browser-traces | Browser OTLP trace proxy |
| GET | /api/v1/platform-info | Get public platform/dashboard configuration |
| POST | /api/v1/service-accounts/{serviceAccountId}/api-token | Sponsor — generate or regenerate API token for a Service Account |
| GET | /api/v1/service-accounts/{serviceAccountId}/ip-allowlist | Sponsor — get IP allowlist for a Service Account |