Ably Channels

We built Ably channels to offer class-leading reliability — with realtime APIs that can stream your data from any device, on any platform, to any number of subscribers in under 100ms — allied to remarkably simple developer implementation.

Pub/sub Channels Diagram
Pub/sub Channels Diagram

Ably Channels: Key features

  • Limitless subscribers

    Publish realtime data on channels instantly to a limitless number of subscribers.

    See how
    See how
  • Device & user presence

    You can subscribe to events when devices or users enter, leave or update their state on channels.

    See how
    See how
  • Persisted data

    We persist the data streamed on your channels, meaning your users or servers can retrieve historical data days later.

    See how
    See how
  • Flexible security

    Authenticate your clients directly using our simple API keys, or use our secure Ably tokens or open JWT to authenticate your users.

    See how
    See how
  • Unique to Ably

    Stream continuity

    Ably ensures data stream continuity over unreliable connections, even when devices become disconnected for short periods of time.

    See how
    See how
  • Unique to Ably

    Message ordering

    We ensure integrity of your streams by maintaining the order you published your messages for all subscribed clients, under all conditions.

    See how
    See how
  • Supreme dependability

    Ably’s Channels value proposition is simple: you can depend on our service. That’s because we focus on three key deliverables that we believe make our platform unique:

    • Integrity

      Publish and subscribe data on channels even when the network is unreliable: providing continuity, delivery, and ordering of messages under all conditions.

    • Performance

      Our proximity to your subscribers with 14 datacenters globally means we are able to guarantee the lowest latency service: less than 65ms median roundtrip latencies

    • Availability

      Channels are available globally, structured so that no single location or server jeopardizes the service. Under adverse conditions, our client library SDKs can intelligently route traffic to available services.

    Our 100% uptime guarantee

Channels in action

We believe Ably offers a unique combination of features, benefits and implementational simplicity that makes us suitable for an almost limitless number of developer applications — whether it’s updating your subscribers on the latest betting odds or delivering an entire SaaS solution.

  • Chat and VoIP platforms

    Build secure group and one-to-one chat applications for the web and mobile devices, and collaborative social media platforms.

    View
    View
  • Sports and Gambling

    Deliver engaging realtime user experiences for gamers backed by secure, low latency, guaranteed data delivery.

    View
    View
  • SaaS Platforms

    Deliver web and mobile collaborative realtime components to your platform using our scalable realtime data delivery platform.

    View
    View

More use cases in our Showcase

Dive deeper

Want to know more about the unique ways Ably can help you deliver a more dependable service for your subscribers?

  • Serverless functions

    Invoke serverless functions when messages are published on channels. We support AWS, Google and Microsoft clouds.

    Learn more
    Learn more
  • Native push notifications

    Channels also support mobile push notifications. Publish a push-enabled message on a Channel, and we’ll instantly fan-out delivery of push notifications to all registered devices.

    Learn more
    Learn more
  • Multi-protocol support

    With MQTT, AMQP, STOMP, Pusher and PubNub protocols support, our protocol adapter service simplifies migration and minimizes vendor lock-in.

    Learn more
    Learn more
  • Webhooks

    Instantly notify your servers over HTTP when messages are published, or users become present on your Channels.

    Learn more
    Learn more
  • End-to-end encryption

    We offer symmetric 256-bit AES encryption ensuring no one can inspect your data payloads, not even us.

    Learn more
    Learn more
  • 1st class Websocket support

    Our client library SDKs utilize efficient multiplexed Websocket connections to subscribe and publish messages on Channels.

    Learn more
    Learn more
  • Messages queues

    Consuming data from Channels using message queues simplifies your server-side design, and makes it more scalable.

    Learn more
    Learn more
  • Firehose your data

    Stream data published within the Ably platform directly to another streaming or queueing service such as Amazon Kinesis or Apache Storm.

    Learn more
    Learn more
  • Binary encoding

    We use an efficient binary encoding that reduces bandwidth and improves serialization and transmission performance.

    Learn more
    Learn more

The developer’s dream

Key to Ably’s rapid adoption by developers is the fact that we invest a lot in making implementation as easy as possible. In short, we handle the complexity so you can get on with implementing the services your customers need. For example, we ensure our APIs are consistent on every platform.

Select your preferred language and try it below or learn more with our our documentation.

  • 
    var ably = new Ably.Realtime('1WChTA.7iYPMQ:Wlx5kHGlC_51r0cv');
    var channel = ably.channels.get('wig-ace');
    
    // Publish a message to the wig-ace channel
    channel.publish('greeting', 'hello');
    
    
    AblyRealtime ably = new AblyRealtime("1WChTA.7iYPMQ:Wlx5kHGlC_51r0cv");
    Channel channel = ably.channels.get("wig-ace");
    
    /* Publish a message to the wig-ace channel */
    channel.publish("wig-ace", "hello");
    
    
    ARTRest realtime = [[ARTRealtime alloc] initWithKey:"1WChTA.7iYPMQ:Wlx5kHGlC_51r0cv"];
    ARTRealtimeChannel *channel = [ably.channels get:@"wig-ace"];
    
    // Publish a message to the wig-ace channel
    [channel publish:@"greeting" data:@"hello"];
    
    
    let ably = ARTRealtime(key: "1WChTA.7iYPMQ:Wlx5kHGlC_51r0cv")
    let channel = ably.channels.get("wig-ace")
    
    /// Publish a message to the wig-ace channel
    channel.publish("greeting", data: "hello")
    
    
    var ably = new AblyRealtime("1WChTA.7iYPMQ:Wlx5kHGlC_51r0cv");
    var channel = ably.Channels.Get("wig-ace");
    
    // Publish a message to the wig-ace channel
    channel.Publish("greeting", "hello");
    
    
    var ably = new require('ably').Realtime('1WChTA.7iYPMQ:Wlx5kHGlC_51r0cv');
    var channel = ably.channels.get('wig-ace');
    
    // Publish a message to the wig-ace channel
    channel.publish('greeting', 'hello');
    
    
    $ably = new Ably\AblyRest('1WChTA.7iYPMQ:Wlx5kHGlC_51r0cv');
    $channel = $ably->channel('wig-ace');
    
    // Publish a message to the wig-ace channel
    $channel->publish('myEvent', 'Hello!');
    
    
    AblyRealtime ably = new AblyRealtime("1WChTA.7iYPMQ:Wlx5kHGlC_51r0cv");
    Channel channel = ably.channels.get("wig-ace");
    
    /* Publish a message to the wig-ace channel */
    channel.publish("wig-ace", "hello");
    
    
    # Need to wrap within an EventMachine reactor which provides an asynchronous evented framework for the library to run within.
    EventMachine.run do
      ably = Ably::Realtime.new('1WChTA.7iYPMQ:Wlx5kHGlC_51r0cv')
    end
    channel = ably.channels.get('wig-ace')
    
    # Publish a message to the wig-ace channel
    channel.publish 'greeting', 'hello'
    
    
    ably = AblyRest('1WChTA.7iYPMQ:Wlx5kHGlC_51r0cv')
    channel = ably.channels.get('wig-ace')
    
    # Publish a message to the wig-ace channel
    channel.publish('greeting', 'hello')
    
    
    options := ably.NewClientOptions("1WChTA.7iYPMQ:Wlx5kHGlC_51r0cv")
    ably, err := ably.NewRealtimeClient(options)
    channel := ably.Channels.Get("wig-ace")
    
    /* Publish a message to the wig-ace channel */
    channel.Publish("wig-ace", "hello")
    
    
    # Copy and paste the curl command below into your console to try this demo now
    # Publish a message to the wig-ace channel
    
    curl -X POST https://rest.ably.io/channels/wig-ace/messages \
      -u '1WChTA.7iYPMQ:Wlx5kHGlC_51r0cv' \
      --data 'name=greeting&data=hello'
    
  • 
    // Subscribe to messages on channel
    channel.subscribe('greeting', function(message) {
      alert(message.data);
    });
    
    
    /* Subscribe to messages on channel */
    MessageListener listener;
    listener = new MessageListener() {
      @Override
      public void onMessage(Message message) {
        System.out.print(message.data);
      }};
    };
    channel.subscribe("greeting", listener);
    
    
    // Subscribe to messages on channel
    [channel subscribe:@"greeting" callback:^(ARTMessage *message) {
      NSLog(@"%@", message.data);
    }];
    
    
    /// Subscribe to messages on channel
    channel.subscribe("greeting") { message in
      print("\(message.data)")
    }
    
    
    /* Subscribe to messages on channel */
    
    channel.Subscribe("greeting", (message) => {
      Console.WriteLine(message.data);
    });
    
    
    // Subscribe to messages on channel
    channel.subscribe('greeting', function(message) {
      console.log(message.data);
    });
    
    
    // Subscribe only supported by Realtime client library SDKs such as Javascript, iOS, Android
    // PHP supports history to retrieve messages over REST
    
    $messagesPage = $channel->history();
    echo($messagesPage->items[0]->data);
    
    
    /* Subscribe to messages on channel */
    
    MessageListener listener;
    listener = new MessageListener() {
      @Override
      public void onMessage(Message message) {
        System.out.print(message.data);
      }};
    };
    channel.subscribe("greeting", listener);
    
    
    # Subscribe to messages on channel
    
    channel.subscribe 'greeting' do |message|
      puts message.data
    end
    
    
    # Subscribe only supported by Realtime client library SDKs such as Javascript, iOS, Android
    # Python supports history to retrieve messages over REST
    
    message_page = channel.history()
    print(messagesPage.items[0].data)
    
    
    /* Subscribe to messages on channel */
    
    sub, err := channel.Subscribe()
    if err != nil {
        // Handle err
    }
    for msg := range sub.MessageChannel() {
        fmt.Println(msg.Data)
    }
    
    
    # Your browser is already subscribed to messages on channel wig-ace
    # Copy and paste the curl command into your console now to see Ably realtime in action
    

    You're in a good company

    Thousands of developers rely on Ably's Channels to deliver billions of messages each day.

    Get started now with our free plan

    It includes 3m messages per month, 100 peak connections, 100 peak channels, and loads of features.

    Create your free account