Verify subscription credentials - streaming (Deprecated)

Streams real-time cloud credentials verification progress over a WebSocket connection using structured JSON messages.
All messages are serialized as JSON with camelCase property names and inherit from ControlUp.Foundry.Domain.Models.Verification.Messages.VerificationMessage.

Message Types (see Domain.Models.Verification.Messages namespace):

  • ControlUp.Foundry.Domain.Models.Verification.Messages.VerificationStartedMessage: Verification process begins
    • Properties: type, timestamp
  • ControlUp.Foundry.Domain.Models.Verification.Messages.StepStartedMessage: A verification step begins
    • Properties: type, timestamp, stepNumber, stepName
  • ControlUp.Foundry.Domain.Models.Verification.Messages.StepCompletedMessage: A verification step completes
    • Properties: type, timestamp, stepNumber, stepName, status, duration, detail
    • status values: "success" | "warning" | "failure"
  • ControlUp.Foundry.Domain.Models.Verification.Messages.VerificationCompletedMessage: Verification process ends
    • Properties: type, timestamp, success, duration, errorMessage

Usage Flow:

  1. Client establishes WebSocket connection to /api/v1/cloud/subscriptions/{id}/credentials/verify/stream
  2. Server validates subscription exists and user has permission
  3. Server accepts WebSocket connection (HTTP 101 Switching Protocols)
  4. Server sends ControlUp.Foundry.Domain.Models.Verification.Messages.VerificationStartedMessage
  5. For each verification step (provider-specific):
    • Server sends ControlUp.Foundry.Domain.Models.Verification.Messages.StepStartedMessage
    • Server performs verification against cloud provider API
    • Server sends ControlUp.Foundry.Domain.Models.Verification.Messages.StepCompletedMessage with results
  6. Server sends ControlUp.Foundry.Domain.Models.Verification.Messages.VerificationCompletedMessage
  7. Server closes WebSocket with normal closure or error status

WebSocket Client Example (JavaScript):

const subscriptionId = '123e4567-e89b-12d3-a456-426614174000';
const ws = new WebSocket(`wss://api.example.com/api/v1/cloud/subscriptions/${subscriptionId}/credentials/verify/stream`);
            
ws.onopen = () => {
  console.log('WebSocket connected - waiting for verification to start...');
};
            
ws.onmessage = (event) => {
  const message = JSON.parse(event.data);
            
  switch(message.type) {
    case 'verification_started':
      console.log('Verification started at:', message.timestamp);
      // Initialize UI for verification progress
      break;
            
    case 'step_started':
      console.log(`Step ${message.stepNumber}: ${message.stepName} - started`);
      // Show spinner/progress indicator for this step
      break;
            
    case 'step_completed':
      console.log(`Step ${message.stepNumber}: ${message.stepName} - ${message.status} in ${message.duration}`);
      if (message.detail) {
        console.log(`  Detail: ${message.detail}`);
      }
      // Update UI with status icon: ✓ (success), ⚠ (warning), ✗ (failure)
      break;
            
    case 'verification_completed':
      console.log(`Verification ${message.success ? 'succeeded' : 'failed'} - Duration: ${message.duration}`);
      if (message.errorMessage) {
        console.error(`Error: ${message.errorMessage}`);
      }
      // Finalize UI with overall result
      break;
            
    default:
      console.warn('Unknown message type:', message.type);
  }
};
            
ws.onerror = (error) => {
  console.error('WebSocket error:', error);
  // Handle connection errors
};
            
ws.onclose = (event) => {
  console.log(`WebSocket closed - Code: ${event.code}, Reason: ${event.reason}`);
  // Clean up UI and resources
};

Example Message Sequence (Azure Subscription):

{"type":"verification_started","timestamp":"2025-10-23T10:30:00.000Z"}
{"type":"step_started","stepNumber":1,"stepName":"Validating Azure credentials format","timestamp":"2025-10-23T10:30:00.100Z"}
{"type":"step_completed","stepNumber":1,"stepName":"Validating Azure credentials format","status":"success","duration":"00:00:00.150","timestamp":"2025-10-23T10:30:00.250Z"}
{"type":"step_started","stepNumber":2,"stepName":"Testing connectivity to Azure Resource Manager","timestamp":"2025-10-23T10:30:00.300Z"}
{"type":"step_completed","stepNumber":2,"stepName":"Testing connectivity to Azure Resource Manager","status":"success","duration":"00:00:01.200","detail":"Successfully authenticated with tenant ID: abc123","timestamp":"2025-10-23T10:30:01.500Z"}
{"type":"step_started","stepNumber":3,"stepName":"Verifying required Azure permissions","timestamp":"2025-10-23T10:30:01.550Z"}
{"type":"step_completed","stepNumber":3,"stepName":"Verifying required Azure permissions","status":"failure","duration":"00:00:00.800","detail":"Missing required role: Virtual Machine Contributor","timestamp":"2025-10-23T10:30:02.350Z"}
{"type":"verification_completed","success":false,"duration":"00:00:02.500","errorMessage":"Verification failed","timestamp":"2025-10-23T10:30:02.500Z"}

Notes:

  • All timestamps are in ISO 8601 UTC format
  • Duration fields are in TimeSpan format (hh:mm:ss.fffffff)
  • Step numbers are sequential, starting from 1
  • The detail field in ControlUp.Foundry.Domain.Models.Verification.Messages.StepCompletedMessage is optional (null for success, may contain info for warnings/failures)
  • WebSocket closes automatically after sending ControlUp.Foundry.Domain.Models.Verification.Messages.VerificationCompletedMessage
  • If an error occurs during verification, the server will attempt to close the WebSocket with appropriate status code
Path Params
uuid
required

The unique cloud subscription identifier.

Responses
101

Switching Protocols - WebSocket connection established.

200

OK

Language
Credentials
LoadingLoading…
Response
Click Try It! to start a request and see the response here! Or choose an example:
application/json