Fully-private real-time messaging service run from your AWS account. Power your WebSocket-based web and mobile application experiences from your own AWS account with flexible, stable, and easy to use APIs. There are no servers to manage, no scaling knobs to turn, and it installs in minutes with CloudFormation.
Automatically scales to your workload
Supported in 22 regions around the world
aws cloudformation create-stack \ --stack-name HotsockInstallerPermissions \ --template-url https://hotsock-stack-templates-us-west-2.s3.us-west-2.amazonaws.com/installer-permissions.yml \ --capabilities CAPABILITY_NAMED_IAM \ --tags Key=hotsock:service,Value=Hotsock
aws cloudformation create-stack \ --stack-name Hotsock \ --template-url https://hotsock-stack-templates-${AWS_REGION}.s3.${AWS_REGION}.amazonaws.com/hotsock-v1.x.yml \ --capabilities CAPABILITY_NAMED_IAM CAPABILITY_AUTO_EXPAND \ --role-arn arn:aws:iam::$(aws sts get-caller-identity --query "Account" --output text):role/hotsock/HotsockInstallerRole \ --tags Key=hotsock:service,Value=Hotsock
lambda_client . invoke ( FunctionName = 'Hotsock-PublishFunction-AAABBBCCCDDD' , Payload = json . dumps ( { 'channel' : 'my-channel' , 'event' : 'my-event' , 'data' : '👋' } ) )
lambdaClient . send ( new InvokeCommand ( { FunctionName : "Hotsock-PublishFunction-AAABBBCCCDDD" , Payload : JSON . stringify ( { channel : "my-channel" , event : "my-event" , data : "👋" , } ) , } ) )
lambdaClient . Invoke ( context . TODO ( ) , & lambda . InvokeInput { FunctionName : aws . String ( "Hotsock-PublishFunction-AAABBBCCCDDD" ) , Payload : [ ] byte ( `{"channel": "my-channel", "event": "my-event", "data": "👋"}` ) , } )
lambdaClient . invoke ( new InvokeRequest ( ) . withFunctionName ( "Hotsock-PublishFunction-AAABBBCCCDDD" ) . withPayload ( "{\"channel\":\"my-channel\",\"event\":\"my-event\",\"data\":\"👋\"}" ) ) ;
lambda_client . invoke ( { function_name : 'Hotsock-PublishFunction-AAABBBCCCDDD' , payload : { channel : 'my-channel' , event : 'my-event' , data : '👋' } . to_json } )
$lambdaClient -> invoke ( [ 'FunctionName' => 'Hotsock-PublishFunction-AAABBBCCCDDD' , 'Payload' => json_encode ( [ 'channel' => 'my-channel' , 'event' => 'my-event' , 'data' => '👋' ] ) , ] ) ;
await lambdaClient . Invoke ( new InvokeRequest { FunctionName = "Hotsock-PublishFunction-AAABBBCCCDDD" , Payload = "{\"channel\":\"my-channel\",\"event\":\"my-event\",\"data\":\"👋\"}" } ) ;
const hotsock = new HotsockClient ( "wss://real-time.example.com" , { connectTokenFn : ( ) => "eyJhbGciOiJFUzI1NiIsIm..." , } ) hotsock . channels ( "my-channel" ) . bind ( "my-event" , ( message ) => { console . log ( "Received message:" , message ) } )
2. Publish Publish messages from your backend in any language with the AWS SDK you already use. Or allow connected WebSocket clients to publish to channels directly.
View publish docs Python JS Go Java Ruby PHP C#
aws cloudformation create-stack \ --stack-name HotsockInstallerPermissions \ --template-url https://hotsock-stack-templates-us-west-2.s3.us-west-2.amazonaws.com/installer-permissions.yml \ --capabilities CAPABILITY_NAMED_IAM \ --tags Key=hotsock:service,Value=Hotsock
aws cloudformation create-stack \ --stack-name Hotsock \ --template-url https://hotsock-stack-templates-${AWS_REGION}.s3.${AWS_REGION}.amazonaws.com/hotsock-v1.x.yml \ --capabilities CAPABILITY_NAMED_IAM CAPABILITY_AUTO_EXPAND \ --role-arn arn:aws:iam::$(aws sts get-caller-identity --query "Account" --output text):role/hotsock/HotsockInstallerRole \ --tags Key=hotsock:service,Value=Hotsock
lambda_client . invoke ( FunctionName = 'Hotsock-PublishFunction-AAABBBCCCDDD' , Payload = json . dumps ( { 'channel' : 'my-channel' , 'event' : 'my-event' , 'data' : '👋' } ) )
lambdaClient . send ( new InvokeCommand ( { FunctionName : "Hotsock-PublishFunction-AAABBBCCCDDD" , Payload : JSON . stringify ( { channel : "my-channel" , event : "my-event" , data : "👋" , } ) , } ) )
lambdaClient . Invoke ( context . TODO ( ) , & lambda . InvokeInput { FunctionName : aws . String ( "Hotsock-PublishFunction-AAABBBCCCDDD" ) , Payload : [ ] byte ( `{"channel": "my-channel", "event": "my-event", "data": "👋"}` ) , } )
lambdaClient . invoke ( new InvokeRequest ( ) . withFunctionName ( "Hotsock-PublishFunction-AAABBBCCCDDD" ) . withPayload ( "{\"channel\":\"my-channel\",\"event\":\"my-event\",\"data\":\"👋\"}" ) ) ;
lambda_client . invoke ( { function_name : 'Hotsock-PublishFunction-AAABBBCCCDDD' , payload : { channel : 'my-channel' , event : 'my-event' , data : '👋' } . to_json } )
$lambdaClient -> invoke ( [ 'FunctionName' => 'Hotsock-PublishFunction-AAABBBCCCDDD' , 'Payload' => json_encode ( [ 'channel' => 'my-channel' , 'event' => 'my-event' , 'data' => '👋' ] ) , ] ) ;
await lambdaClient . Invoke ( new InvokeRequest { FunctionName = "Hotsock-PublishFunction-AAABBBCCCDDD" , Payload = "{\"channel\":\"my-channel\",\"event\":\"my-event\",\"data\":\"👋\"}" } ) ;
const hotsock = new HotsockClient ( "wss://real-time.example.com" , { connectTokenFn : ( ) => "eyJhbGciOiJFUzI1NiIsIm..." , } ) hotsock . channels ( "my-channel" ) . bind ( "my-event" , ( message ) => { console . log ( "Received message:" , message ) } )
aws cloudformation create-stack \ --stack-name HotsockInstallerPermissions \ --template-url https://hotsock-stack-templates-us-west-2.s3.us-west-2.amazonaws.com/installer-permissions.yml \ --capabilities CAPABILITY_NAMED_IAM \ --tags Key=hotsock:service,Value=Hotsock
aws cloudformation create-stack \ --stack-name Hotsock \ --template-url https://hotsock-stack-templates-${AWS_REGION}.s3.${AWS_REGION}.amazonaws.com/hotsock-v1.x.yml \ --capabilities CAPABILITY_NAMED_IAM CAPABILITY_AUTO_EXPAND \ --role-arn arn:aws:iam::$(aws sts get-caller-identity --query "Account" --output text):role/hotsock/HotsockInstallerRole \ --tags Key=hotsock:service,Value=Hotsock
lambda_client . invoke ( FunctionName = 'Hotsock-PublishFunction-AAABBBCCCDDD' , Payload = json . dumps ( { 'channel' : 'my-channel' , 'event' : 'my-event' , 'data' : '👋' } ) )
lambdaClient . send ( new InvokeCommand ( { FunctionName : "Hotsock-PublishFunction-AAABBBCCCDDD" , Payload : JSON . stringify ( { channel : "my-channel" , event : "my-event" , data : "👋" , } ) , } ) )
lambdaClient . Invoke ( context . TODO ( ) , & lambda . InvokeInput { FunctionName : aws . String ( "Hotsock-PublishFunction-AAABBBCCCDDD" ) , Payload : [ ] byte ( `{"channel": "my-channel", "event": "my-event", "data": "👋"}` ) , } )
lambdaClient . invoke ( new InvokeRequest ( ) . withFunctionName ( "Hotsock-PublishFunction-AAABBBCCCDDD" ) . withPayload ( "{\"channel\":\"my-channel\",\"event\":\"my-event\",\"data\":\"👋\"}" ) ) ;
lambda_client . invoke ( { function_name : 'Hotsock-PublishFunction-AAABBBCCCDDD' , payload : { channel : 'my-channel' , event : 'my-event' , data : '👋' } . to_json } )
$lambdaClient -> invoke ( [ 'FunctionName' => 'Hotsock-PublishFunction-AAABBBCCCDDD' , 'Payload' => json_encode ( [ 'channel' => 'my-channel' , 'event' => 'my-event' , 'data' => '👋' ] ) , ] ) ;
await lambdaClient . Invoke ( new InvokeRequest { FunctionName = "Hotsock-PublishFunction-AAABBBCCCDDD" , Payload = "{\"channel\":\"my-channel\",\"event\":\"my-event\",\"data\":\"👋\"}" } ) ;
const hotsock = new HotsockClient ( "wss://real-time.example.com" , { connectTokenFn : ( ) => "eyJhbGciOiJFUzI1NiIsIm..." , } ) hotsock . channels ( "my-channel" ) . bind ( "my-event" , ( message ) => { console . log ( "Received message:" , message ) } )
Just some of the features... Security on your terms No one wants to learn their data was used for AI training or part of a multi-tenant breach. All services are run privately in your AWS account. Your data always remains yours , only accessible by you .
Presence Channels Track who's online or what devices are currently subscribed to the same channel. Great for chat rooms and document collaboration where you need awareness of other active participants.
Custom Domains Maintain consistent branding and customer trust by keeping WebSocket connections on your own domain name.
Web Console Easily debug and test JWT validation, token claims, connections, channel subscriptions, and messages.
Serverless Powered by on-demand services such as API Gateway , DynamoDB , Lambda , EventBridge , SNS , and SQS . It scales to zero when you're not using it or can handle millions of connections and billions of messages for high-volume production workloads.
Start for free, then pay as you grow. New installations have Free Tier access forever , which includes all features but is capped at 1 million free WebSockets messages per month. Paid Tier options remove these limits and add access to email support! Learn more
Price
$1.25 per million messages
$99/month
$299/month
$599/month
$1,299/month
$2,799/month
Included messages per month
1 million free messages each month, then pay as you go
300 million (~10 million per day) $0.50 per additional million
1.5 billion (~50 million per day) $0.45 per additional million
7.5 billion (~250 million per day) $0.40 per additional million
30 billion (~1 billion per day) $0.35 per additional million
150 billion (~5 billion per day) $0.30 per additional million
AWS Configuration
1 account, 1 region
1 account, 1 region
5 accounts, 2 regions
25 accounts, 5 regions
100 accounts, all regions
500 accounts, all regions
Support
Standard
Standard
Premium
Premium
Premium
Premium