From 37f23a11d59f6a1244e95b2bac2a247248b5f73e Mon Sep 17 00:00:00 2001 From: Mark Hulbert <39801222+m-hulbert@users.noreply.github.com> Date: Fri, 11 Jul 2025 10:48:22 +0200 Subject: [PATCH 01/14] Convert platform about page to MDX --- .../pages/docs/platform/index.mdx | 46 +++++++++---------- 1 file changed, 22 insertions(+), 24 deletions(-) rename content/platform/index.textile => src/pages/docs/platform/index.mdx (55%) diff --git a/content/platform/index.textile b/src/pages/docs/platform/index.mdx similarity index 55% rename from content/platform/index.textile rename to src/pages/docs/platform/index.mdx index d565d748ae..339c578bf2 100644 --- a/content/platform/index.textile +++ b/src/pages/docs/platform/index.mdx @@ -7,22 +7,20 @@ Ably is a highly-scalable serverless WebSocket platform used to power realtime d At its core, Ably is a cloud-based Pub/Sub (publish/subscribe) platform-as-a-service (PaaS). It ensures that any messages published to Ably by any device will be received, in realtime, by any number of subscribing devices. - - Overview of Ably's platform and products - +![Overview of Ably's platform and products](../../../images/content/diagrams/ably-overview.png) -h2(#platform). Platform +## Platform Ably's platform enables data to be streamed between all internet-connected devices, such as browsers, servers and mobile phones. It offers enterprise-scale messaging, that automatically scales to meet demand, a highly-available service, message delivery guarantees, and low latency across the globe. Ably is engineered around the following four key principles to ensure the dependability of its service: -- "Performance":https://ably.com/four-pillars-of-dependability#performance := high performance ensures that the end-to-end latency and bandwidth for data sent via the platform is minimized, and maintained at scale. -- "Integrity":https://ably.com/four-pillars-of-dependability#integrity := Ably provides guarantees for the realtime messages sent using the Ably platform so that you don't need to handle missed, duplicated or unordered messages yourself. -- "Reliability":https://ably.com/four-pillars-of-dependability#reliability := a fault-tolerant platform is reliable by ensuring that there is sufficient redundancy at a regional and global level to provide continuity of service in the face of infrastructure failures. -- "Availability":https://ably.com/four-pillars-of-dependability#availability := the Ably platform is designed to be elastic and highly-available so that you can use it at any time, even under high load. +- [Performance](https://ably.com/four-pillars-of-dependability#performance) := high performance ensures that the end-to-end latency and bandwidth for data sent via the platform is minimized, and maintained at scale. +- [Integrity](https://ably.com/four-pillars-of-dependability#integrity) := Ably provides guarantees for the realtime messages sent using the Ably platform so that you don't need to handle missed, duplicated or unordered messages yourself. +- [Reliability](https://ably.com/four-pillars-of-dependability#reliability) := a fault-tolerant platform is reliable by ensuring that there is sufficient redundancy at a regional and global level to provide continuity of service in the face of infrastructure failures. +- [Availability](https://ably.com/four-pillars-of-dependability#availability) := the Ably platform is designed to be elastic and highly-available so that you can use it at any time, even under high load. -h2(#infrastructure). Infrastructure +## Infrastructure The Ably platform has fault-tolerant, highly-available, elastic global infrastructure for effortless scaling. @@ -30,9 +28,9 @@ It is built primarily on Amazon EC2 infrastructure. It runs in 7 physical data c Each data center scales independently to meet the load within that region. Load is dynamically assigned and reassigned across servers in realtime, and the service auto-heals and routes around network failures. -h2(#integrations). Integrations +## Integrations -Ably "integrations":/docs/integrations enable you to send your data from Ably to an external service or push data into Ably from an external service. You can trigger actions in your integrated services when events occur in Ably or send data to Ably from external systems. +Ably [integrations](/docs/integrations) enable you to send your data from Ably to an external service or push data into Ably from an external service. You can trigger actions in your integrated services when events occur in Ably or send data to Ably from external systems. Some of the integrations available with Ably include: @@ -41,48 +39,48 @@ Some of the integrations available with Ably include: * Amazon Lambda, Azure Functions, Google Cloud Functions, and Cloudflare Workers for serverless function execution. * Kafka, Amazon Kinesis, Amazon SQS, AMQP, and Pulsar for continuous data streaming. -h2(#products). Products and SDKs +## Products and SDKs Use Ably's products and SDKs to build realtime applications for your clients. They all utilize Ably's reliable platform to ensure that you don't need to worry about managing things such as scaling, latency and data integrity. -h3(#pub-sub). Ably Pub/Sub +### Ably Pub/Sub -Ably's core "Pub/Sub":/docs/basics product provides flexible APIs that are feature-rich and powerful. These flexible APIs are the building blocks for crafting any type of realtime experience for your customers. +Ably's core [Pub/Sub](/docs/basics) product provides flexible APIs that are feature-rich and powerful. These flexible APIs are the building blocks for crafting any type of realtime experience for your customers. Ably's other products are built on top of Pub/Sub. They utilize the same platform with the some guarantees and benefits. These products can be considered abstractions, with APIs designed to simplify and build applications more quickly for the most popular use cases. -h3(#chat). Ably Chat +### Ably Chat -Use the Ably "Chat":/docs/chat SDKs to build live chat components in your applications. It provides a set of purpose-built APIs to manage features such as rooms and messages, users' online status, typing indicators, and room-level reactions. +Use the Ably [Chat](/docs/chat) SDKs to build live chat components in your applications. It provides a set of purpose-built APIs to manage features such as rooms and messages, users' online status, typing indicators, and room-level reactions. Chat is an abstraction built over Ably Pub/Sub. It utilizes Ably's platform to benefit from all of the same performance guarantees and scaling potential. Chat is effective for use cases such as sports and gaming live streams, 1:1 agent chats, and any other use case that requires users to talk and interact with one another in realtime. -h3(#spaces). Ably Spaces +### Ably Spaces -Use the Ably "Spaces":/docs/spaces SDKs to build multiplayer collaborative components in your applications. It provides a set of purpose-built APIs to manage the participate state of users collaborating synchronously in an application, such as their the position of their cursors, or which elements they are interacting with. +Use the Ably [Spaces](/docs/spaces) SDKs to build multiplayer collaborative components in your applications. It provides a set of purpose-built APIs to manage the participate state of users collaborating synchronously in an application, such as their the position of their cursors, or which elements they are interacting with. Spaces is an abstraction built over Ably Pub/Sub. It utilizes Ably's platform to benefit from all of the same performance guarantees and scaling potential. Spaces is effective when building features such as interactive whiteboards, avatar stacks, and displaying and locking elements on a page, such as a cell in a spreadsheet, or a slide in a slideshow presentation. -h3(#liveobjects). Ably LiveObjects +### Ably LiveObjects -Use Ably "LiveObjects":/docs/liveobjects to synchronize application state across users and devices in realtime. LiveObjects provides purpose-built APIs and data structures for managing shared state, and it automatically handles concurrency, conflict resolution, synchronization and persistence. +Use Ably [LiveObjects](/docs/liveobjects) to synchronize application state across users and devices in realtime. LiveObjects provides purpose-built APIs and data structures for managing shared state, and it automatically handles concurrency, conflict resolution, synchronization and persistence. LiveObjects is managed and persisted on Ably Pub/Sub channels. It utilizes Ably's platform to benefit from all of the same performance guarantees and scaling potential. LiveObjects is effective for use cases such as realtime voting and polling systems, collaborative applications, live leaderboards, multiplayer game state synchronization, and any other scenario where application data is shared, can be updated concurrently by many users, and needs to be synchronized in realtime. -h3(#livesync). Ably LiveSync +### Ably LiveSync -Use Ably "LiveSync":/docs/livesync to synchronize changes between your database and frontend clients. It provides support for PostgreSQL and MongoDB and uses the Ably platform to synchronize your application's data. +Use Ably [LiveSync](/docs/livesync) to synchronize changes between your database and frontend clients. It provides support for PostgreSQL and MongoDB and uses the Ably platform to synchronize your application's data. LiveSync automatically streams changes you make in your database to clients to keep them in sync with the source of truth in your database. -h3(#asset-tracking). Ably Asset Tracking +### Ably Asset Tracking -Use the Ably "Asset Tracking":/docs/asset-tracking SDKs to build applications that track the location of assets such as delivery vehicles. +Use the Ably [Asset Tracking](/docs/asset-tracking) SDKs to build applications that track the location of assets such as delivery vehicles. Asset Tracking is an abstraction built over Ably Pub/Sub. It utilizes Ably's platform to benefit from all of the same performance guarantees and scaling potential. From 521272df014743a3622fe65eb8e29bf613a6f7b7 Mon Sep 17 00:00:00 2001 From: Mark Hulbert <39801222+m-hulbert@users.noreply.github.com> Date: Fri, 11 Jul 2025 10:49:47 +0200 Subject: [PATCH 02/14] Convert platform architecture index page to MDX --- .../docs/platform/architecture/index.mdx | 52 +++++++++---------- 1 file changed, 25 insertions(+), 27 deletions(-) rename content/platform/architecture/index.textile => src/pages/docs/platform/architecture/index.mdx (81%) diff --git a/content/platform/architecture/index.textile b/src/pages/docs/platform/architecture/index.mdx similarity index 81% rename from content/platform/architecture/index.textile rename to src/pages/docs/platform/architecture/index.mdx index efb7615992..a10b825326 100644 --- a/content/platform/architecture/index.textile +++ b/src/pages/docs/platform/architecture/index.mdx @@ -8,15 +8,15 @@ Ably's platform architecture is built to deliver dependable realtime experiences As the definitive realtime experience platform, Ably serves billions of devices monthly and delivers over half a trillion messages monthly. -h2. At a glance +## At a glance Ably's globally distributed infrastructure forms the foundation of the platform, allowing Ably to maintain exceptional performance, while serving massive scale and providing industry-leading quality of service guarantees. -Ably characterizes the system across "4 pillars of dependability":https://ably.com/four-pillars-of-dependability : +Ably characterizes the system across [4 pillars of dependability](https://ably.com/four-pillars-of-dependability): * **Performance**: Ably focuses on predictability of latencies to provide certainty in uncertain operating conditions. -** <30ms round trip latency within datacenter (99th percentile) -** <65ms global round trip latency (99th percentile) +** `<30ms` round trip latency within datacenter (99th percentile) +** `<65ms` global round trip latency (99th percentile) * **Integrity**: Guarantees for message ordering and delivery. ** Exactly-once delivery semantics ** Guaranteed message ordering from publishers to subscribers @@ -30,9 +30,9 @@ Ably characterizes the system across "4 pillars of dependability":https://ably.c ** 99.999% global service availability (5 minutes 15 seconds of downtime per year) ** 50% global capacity margin for instant demand surges -h2. Design objectives +## Design objectives -Ably's platform is a global service that supports all realtime messaging and associated services. It is architected to achieve horizontal scalability with "no effective ceiling":https://ably.com/blog/ablys-four-pillars-no-scale-ceiling on application scale, while maintaining consistent latency, message integrity, and system reliability across the global network. +Ably's platform is a global service that supports all realtime messaging and associated services. It is architected to achieve horizontal scalability with [no effective ceiling](https://ably.com/blog/ablys-four-pillars-no-scale-ceiling) on application scale, while maintaining consistent latency, message integrity, and system reliability across the global network. The platform has been designed with the following primary objectives in mind: @@ -43,9 +43,9 @@ The platform has been designed with the following primary objectives in mind: * **Consistent low latencies**: Within data centers, Ably aims for latencies to be in the low 10s of milliseconds and less than 100ms globally. Consistently achieving low latencies requires careful consideration of the placement of data and services across the system as well as prioritisation of the computation performed by each service. * **Quality of service**: Ably intentionally designs for high QoS targets to enable sophisticated realtime applications that would be impossible on platforms with weaker guarantees. -h2. Cluster architecture +## Cluster architecture -Ably's platform runs on AWS EC2 infrastructure with a globally distributed architecture. Ably's "clusters":/docs/platform-customization#dedicated-and-isolated-clusters typically span multiple regions, usually between two and ten. This multi-region approach maximizes availability and is a critical aspect of providing a fault tolerant service. +Ably's platform runs on AWS EC2 infrastructure with a globally distributed architecture. Ably's [clusters](/docs/platform-customization#dedicated-and-isolated-clusters) typically span multiple regions, usually between two and ten. This multi-region approach maximizes availability and is a critical aspect of providing a fault tolerant service. Each regional deployment operates independently, handling its own subscriber connections, REST traffic, channel management and message routing. When activity occurs on a channel across multiple regions, messages flow peer-to-peer between regions directly, eliminating central bottlenecks and single points of failure. @@ -56,9 +56,7 @@ Ably's architecture consists of four primary layers: * **Frontend Layer**: Handles REST requests and maintains realtime connections (such as WebSocket, Comet and SSE). * **Core Layer**: Performs all central message processing for channels. - - Ably Architecture Overview Diagram - +![Ably Architecture Overview Diagram](../../../../images/content/diagrams/architecture-overview.png) Each component scales independently in each region based on demand. Ably continuously monitors CPU, memory, and other key metrics, triggering autoscaling based on aggregated performance indicators. @@ -67,11 +65,11 @@ The key to Ably's horizontal scalability is intelligent load distribution that e * In the frontend layer, new instances join the load balancer pool and begin handling their share of incoming connections and REST requests. * In the core layer, Ably employs consistent hashing to distribute channels across core processes - each core maintains a set of pseudo-randomly generated hashes that determine channel placement. As the cluster scales, channels automatically relocate to maintain even load distribution. -h3. Routing layer +### Routing layer Ably's latency-optimized routing infrastructure provides multiple layers of resilience to ensure reliable connectivity even during partial system failures. -h4. Intelligent routing +#### Intelligent routing Ably's custom routing layer provides sophisticated traffic management through deep integration with the application architecture. @@ -79,7 +77,7 @@ The routing layer is cluster-aware and implements advanced retry strategies, ena This intelligent routing ensures traffic is directed optimally even as the system scales or during partial failures. -h4. DNS and edge protection +#### DNS and edge protection Ably uses latency-based routing to ensure clients are consistently routed to their closest datacenter. @@ -87,7 +85,7 @@ Ably employs multiple DNS providers and global load balancing strategies for res The routing layer automatically removes unhealthy regions from DNS resolution and offers advanced DDoS protection at the edge. -h4. Connection management +#### Connection management Ably's SDKs implement sophisticated connection management with automatic failover capabilities. @@ -99,39 +97,39 @@ Re-connection attempts cycle through up to 6 globally distributed endpoints. Cli Progressive connection timeout strategies ensure rapid recovery from transient issues, while continuous connection quality monitoring triggers proactive reconnection when performance degrades. -h3. Gossip layer +### Gossip layer Every cluster Ably operates includes a network of gossip nodes, spanning all regions, that participate in a (Scuttlebutt-inspired) gossip protocol to facilitate service discovery and even distribution of work across the cluster. Other nodes in the cluster communicate with the gossip layer to broadcast and receive information about the state of the cluster. As nodes are added and removed, or fail abruptly, the gossip layer ensures a single consistent view of the network is shared by all. The gossip layer also allows node health to be consistently determined system-wide without the need for any single coordinator. -h3. Frontend layer +### Frontend layer Ably's frontend infrastructure consists of several components that handle individual requests and connections from realtime subscribers. Each component scales independently according to demand, ensuring requests are processed in the optimal location based on client location and system state. -h4. Request handling +#### Request handling Nodes in the frontend layer process all incoming REST and realtime requests. They participate in the active service discovery mechanism between all nodes, maintaining realtime awareness of channel locations across the cluster, even as channels migrate during scaling events. Message fan-out is achieved by frontend nodes efficiently processing published messages and distributing them to all subscribed clients. The frontend layer also handles authentication, enforces rate limits, and provides additional DDoS protection. -h4. Protocol adapters +#### Protocol adapters -Ably's "protocol adapters":/docs/protocols enable interoperability with multiple industry protocols. These adapters translate between external protocols and Ably's internal protocols in both directions. Ably supports the MQTT standard as well as proprietary protocols like PubNub and Pusher. +Ably's [protocol adapters](/docs/protocols) enable interoperability with multiple industry protocols. These adapters translate between external protocols and Ably's internal protocols in both directions. Ably supports the MQTT standard as well as proprietary protocols like PubNub and Pusher. -h3. Core layer +### Core layer Ably's core infrastructure handles all messages as they transit through the system. It is designed to scale elastically according to demand while managing all associated channel and system state. -h4. Resource placement +#### Resource placement -Ably uses "consistent hashing":https://ably.com/blog/implementing-efficient-consistent-hashing to distribute resources such as channels, apps and accounts across available core compute capacity. +Ably uses [consistent hashing](https://ably.com/blog/implementing-efficient-consistent-hashing) to distribute resources such as channels, apps and accounts across available core compute capacity. Each compute instance within the core layer has a set of pseudo-randomly generated hashes which determines which resources are located at that instance. As the cluster scales, channels relocate to maintain an even load distribution. Any number of channels can exist as long as sufficient compute capacity is available. Whether handling many lightly-loaded channels or heavily-loaded ones, Ably's scaling and placement strategies ensure capacity is added as required and load is effectively distributed. When a core node fails, the system detects the failure through the cluster-wide gossip protocol, and its resources are automatically redistributed to healthy nodes. -h4. Message processing +#### Message processing -Nodes in the core layer are responsible for all channel message processing and persistence and apply operations such as "delta":/docs/channels/options/deltas computation, "batching":/docs/messages/batch and "integration rule":/docs/integrations invocation. They also aggregate and persist account and app "statistics":/docs/metadata-stats/stats and enforce "limits":/docs/pricing/limits. Nodes in the core layer communicate cross-regionally to facilitate inter-data-center message transit. +Nodes in the core layer are responsible for all channel message processing and persistence and apply operations such as [delta](/docs/channels/options/deltas) computation, [batching](/docs/messages/batch) and [integration rule](/docs/integrations) invocation. They also aggregate and persist account and app [statistics](/docs/metadata-stats/stats) and enforce [limits](/docs/pricing/limits). Nodes in the core layer communicate cross-regionally to facilitate inter-data-center message transit. -h4. Message persistence +#### Message persistence Messages are persisted in multiple locations to ensure that message availability and continuity are maintained even during individual node or data center failures. @@ -139,5 +137,5 @@ Once a message is acknowledged, it is stored in multiple physical locations, pro Messages are stored in two ways: -* **Ephemeral Storage**: Messages are held for 2 minutes in an in-memory database (Redis). This data is distributed according to Ably's consistent hashing mechanism and relocated when channels move between nodes. This short-term storage enables low-latency message delivery and retrieval and supports features like "connection recovery":/docs/connect/states. +* **Ephemeral Storage**: Messages are held for 2 minutes in an in-memory database (Redis). This data is distributed according to Ably's consistent hashing mechanism and relocated when channels move between nodes. This short-term storage enables low-latency message delivery and retrieval and supports features like [connection recovery](/docs/connect/states). * **Persisted Storage**: Messages can optionally be stored persistently on disk if longer term retention is required. Ably uses a globally distributed and clustered database (Cassandra) for this purpose, deployed across multiple data centers with message data replicated to three regions to ensure integrity and availability even if a region fails. From bd236ac5378c3a04ffbaf169b16a51391cbd4b05 Mon Sep 17 00:00:00 2001 From: Mark Hulbert <39801222+m-hulbert@users.noreply.github.com> Date: Fri, 11 Jul 2025 10:54:09 +0200 Subject: [PATCH 03/14] Convert deprecation policy and notices to MDX --- .../platform/deprecate/protocol-v1.textile | 33 ------------------ .../pages/docs/platform/deprecate/index.mdx | 12 +++---- .../docs/platform/deprecate/protocol-v1.mdx | 34 +++++++++++++++++++ .../docs/platform/deprecate/tls-v1-1.mdx | 18 +++++----- 4 files changed, 49 insertions(+), 48 deletions(-) delete mode 100644 content/platform/deprecate/protocol-v1.textile rename content/platform/deprecate/index.textile => src/pages/docs/platform/deprecate/index.mdx (79%) create mode 100644 src/pages/docs/platform/deprecate/protocol-v1.mdx rename content/platform/deprecate/tls-v1-1.textile => src/pages/docs/platform/deprecate/tls-v1-1.mdx (66%) diff --git a/content/platform/deprecate/protocol-v1.textile b/content/platform/deprecate/protocol-v1.textile deleted file mode 100644 index 8776b87b01..0000000000 --- a/content/platform/deprecate/protocol-v1.textile +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Deprecation of protocol version 1 - November 2025 -meta_description: "A policy detailing how Ably deprecates SDKs and APIs." -meta_keywords: "Ably, deprecation policy, deprecation, sunset" ---- - -SDKs using version 1 of Ably's realtime protocol will be sunset on 1st November 2025. - -This version was superseded by version 2 in January 2023. It introduced new functionality, with a more efficient and scalable backend implementation. New features are not available using version 1 of the protocol, nor in any SDKs implementing it. - -h2(#sdks). Affected SDKs - -SDK versions earlier than those listed below are now considered deprecated. If you are using a version older than those listed, upgrade before the 1st November 2025. - -|_. Product |_. Language |_. Versions | -| Pub/Sub | JavaScript | < "1.2.36":https://github.com/ably/ably-js/releases/tag/1.2.36 | -| Pub/Sub | Java | < "1.2.35":https://github.com/ably/ably-java/releases/tag/v1.2.35 | -| Pub/Sub | Swift / Objective-C | < "1.2.24":https://github.com/ably/ably-cocoa/releases/tag/1.2.24 | -| Pub/Sub | .NET | < "1.2.12":https://github.com/ably/ably-dotnet/releases/tag/1.2.12 | -| Pub/Sub | Go | < "1.2.14":https://github.com/ably/ably-go/releases/tag/v1.2.14 | -| Pub/Sub | Python | < "2.0.0-beta.6":https://github.com/ably/ably-python/releases/tag/v2.0.0-beta.6 | -| Pub/Sub | Ruby | < "1.2.5":https://github.com/ably/ably-ruby/releases/tag/v1.2.5 | -| Pub/Sub | PHP | < "1.1.9":https://github.com/ably/ably-php/releases/tag/1.1.9 | -| Pub/Sub | Flutter | < "1.2.25":https://github.com/ably/ably-flutter/releases/tag/v1.2.25 | -| Kafka Connect | - | < "2.1.4":https://github.com/ably/kafka-connect-ably/releases/tag/v2.1.4 | - -Contact "support":https://ably.com/support if you have any questions. - -h2(#requests). Request failures - -On the 1st November 2025 attempts to connect to Ably using an SDK that uses version 1 of the protocol will start to fail. Failures will be phased, with only a fraction of traffic being rejected at first, until 100% of requests are rejected after several weeks. - -Requests that are rejected will contain an error message and code referencing this deprecation notice and the associated "deprecation policy.":/docs/platform/deprecate diff --git a/content/platform/deprecate/index.textile b/src/pages/docs/platform/deprecate/index.mdx similarity index 79% rename from content/platform/deprecate/index.textile rename to src/pages/docs/platform/deprecate/index.mdx index 988734a6e1..12e4224008 100644 --- a/content/platform/deprecate/index.textile +++ b/src/pages/docs/platform/deprecate/index.mdx @@ -6,9 +6,9 @@ meta_keywords: "Ably, deprecation policy, deprecation, sunset" Ably's SDKs are regularly updated to add support for new features, bugfixes, and to accommodate version or API changes in dependencies. Whilst Ably ensures changes are backwards-compatible wherever possible, there are some instances where the previous API structure is no longer suitable. -In all cases, updates to SDKs conform to "semantic versioning":https://semver.org/ guidelines. It is recommended that you always update to the latest version of an SDK when it is available. +In all cases, updates to SDKs conform to [semantic versioning](https://semver.org/) guidelines. It is recommended that you always update to the latest version of an SDK when it is available. -h2(#applicability). Applicability +## Applicability This policy applies to the following: @@ -17,17 +17,17 @@ Ably SDKs and associated APIs, including; * HTTP APIs * Ably's realtime protocol -h2(#timelines). Deprecation timelines +## Deprecation timelines -Ably will support all releases for at least 12 months from the date of release of a version that supersedes it. For example, if version @1.1.0@ is released on 1st January 2025, version @1.0.X@ will be supported until at least 1st January 2026. +Ably will support all releases for at least 12 months from the date of release of a version that supersedes it. For example, if version `1.1.0` is released on 1st January 2025, version `1.0.X` will be supported until at least 1st January 2026. Releases will be always be deprecated within 24 months of being superseded. -h3(#sunset). Sunset date +### Sunset date The sunset date is the date on which a version of an SDK or API will no longer function, at the end of the deprecation period. Ably will usually sunset features by a process of rejecting just a (gradually increasing) proportion of requests to avoid large-scale disruption where possible. However, this won't always be the case, so you should assume that features or versions will stop working on the sunset date. -h2(#support). Supportability +## Supportability Ably will no longer provide the following when a version is deprecated: diff --git a/src/pages/docs/platform/deprecate/protocol-v1.mdx b/src/pages/docs/platform/deprecate/protocol-v1.mdx new file mode 100644 index 0000000000..f278392199 --- /dev/null +++ b/src/pages/docs/platform/deprecate/protocol-v1.mdx @@ -0,0 +1,34 @@ +--- +title: Deprecation of protocol version 1 - November 2025 +meta_description: "A policy detailing how Ably deprecates SDKs and APIs." +meta_keywords: "Ably, deprecation policy, deprecation, sunset" +--- + +SDKs using version 1 of Ably's realtime protocol will be sunset on 1st November 2025. + +This version was superseded by version 2 in January 2023. It introduced new functionality, with a more efficient and scalable backend implementation. New features are not available using version 1 of the protocol, nor in any SDKs implementing it. + +## Affected SDKs + +SDK versions earlier than those listed below are now considered deprecated. If you are using a version older than those listed, upgrade before the 1st November 2025. + +| Product | Language | Versions | +| ------- | -------- | -------- | +| Pub/Sub | JavaScript | < [1.2.36](https://github.com/ably/ably-js/releases/tag/1.2.36) | +| Pub/Sub | Java | < [1.2.35](https://github.com/ably/ably-java/releases/tag/v1.2.35) | +| Pub/Sub | Swift / Objective-C | < [1.2.24](https://github.com/ably/ably-cocoa/releases/tag/1.2.24) | +| Pub/Sub | .NET | < [1.2.12](https://github.com/ably/ably-dotnet/releases/tag/1.2.12) | +| Pub/Sub | Go | < [1.2.14](https://github.com/ably/ably-go/releases/tag/v1.2.14) | +| Pub/Sub | Python | < [2.0.0-beta.6](https://github.com/ably/ably-python/releases/tag/v2.0.0-beta.6) | +| Pub/Sub | Ruby | < [1.2.5](https://github.com/ably/ably-ruby/releases/tag/v1.2.5) | +| Pub/Sub | PHP | < [1.1.9](https://github.com/ably/ably-php/releases/tag/1.1.9) | +| Pub/Sub | Flutter | < [1.2.25](https://github.com/ably/ably-flutter/releases/tag/v1.2.25) | +| Kafka Connect | - | < [2.1.4](https://github.com/ably/kafka-connect-ably/releases/tag/v2.1.4) | + +Contact [support](https://ably.com/support) if you have any questions. + +## Request failures + +On the 1st November 2025 attempts to connect to Ably using an SDK that uses version 1 of the protocol will start to fail. Failures will be phased, with only a fraction of traffic being rejected at first, until 100% of requests are rejected after several weeks. + +Requests that are rejected will contain an error message and code referencing this deprecation notice and the associated [deprecation policy.](/docs/platform/deprecate) diff --git a/content/platform/deprecate/tls-v1-1.textile b/src/pages/docs/platform/deprecate/tls-v1-1.mdx similarity index 66% rename from content/platform/deprecate/tls-v1-1.textile rename to src/pages/docs/platform/deprecate/tls-v1-1.mdx index 978c2c53fc..5259a25dfa 100644 --- a/content/platform/deprecate/tls-v1-1.textile +++ b/src/pages/docs/platform/deprecate/tls-v1-1.mdx @@ -8,29 +8,29 @@ Support for TLS (Transport Layer Security) versions 1.0 and 1.1 will be sunset o As part of Ably's ongoing commitment to ensure the highest standards of security and performance, support for older TLS versions across the service will be deprecated. After this date, all connections to Ably must use TLS 1.2 or higher. -h2(#impact). Impact +## Impact -After 1st June 2025, requests using TLS 1.0 or 1.1 will be refused. This affects all connections to Ably's services, including: +After 1st June 2025, requests using TLS 1.0 or 1.1 may be refused. This affects all connections to Ably's services, including: * Realtime and WebSocket connections * REST API calls * Any other service that communicates with Ably -h2(#error). Error messages +## Error messages -When attempting to connect using TLS 1.0 or 1.1, you may receive a TLS protocol version error. The error message will reference @protocol_version@ to indicate that the TLS version is not supported. +When attempting to connect using TLS 1.0 or 1.1, you may receive a TLS protocol version error. The error message will reference `protocol_version` to indicate that the TLS version is not supported. -h2(#recommendations). Recommended actions +## Recommended actions * **Verify compatibility:** Ensure that your systems, applications, and integrations are configured to support TLS 1.2 or higher. * **Update legacy systems:** If you are using older platforms, consult with your IT team or integration partners to update any components that still rely on TLS 1.0 or 1.1. For customers who have a custom environment or active traffic management enabled, Ably can update your settings at any time. -h2(#requests). Request failures +## Request failures -From 1st June 2025, attempts to connect to Ably using TLS 1.0 or 1.1 will start to fail. Failures will be phased, with only a fraction of traffic being rejected at first, until 100% of requests are rejected after several weeks. +From 1st June 2025, attempts to connect to Ably using TLS 1.0 or 1.1 may start to fail. Failures will be phased, with only a fraction of traffic being rejected at first, until 100% of requests are rejected after several weeks. -Requests that are rejected will contain an error message and code referencing this deprecation notice and the associated "deprecation policy.":/docs/platform/deprecate +Requests that are rejected will contain an error message and code referencing this deprecation notice and the associated [deprecation policy.](/docs/platform/deprecate) -Contact "support":https://ably.com/support if you have any questions. +Contact [support](https://ably.com/support) if you have any questions. From c0258e5c584e91074cfb7333c10719a19c3079bb Mon Sep 17 00:00:00 2001 From: Mark Hulbert <39801222+m-hulbert@users.noreply.github.com> Date: Fri, 11 Jul 2025 10:54:37 +0200 Subject: [PATCH 04/14] Update Ably overview diagram to add LiveObjects --- src/images/content/diagrams/ably-overview.png | Bin 133551 -> 147226 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/images/content/diagrams/ably-overview.png b/src/images/content/diagrams/ably-overview.png index 46a23955283344a377a2ca5ec7bd9eba81c83c9a..4d1902e9d21acb802b1bfac25bf93c8207e78fb4 100644 GIT binary patch literal 147226 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 ~HD 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 z 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�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∋cA1? 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 DN3E}# literal 133551 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

6n?|G6;EY|^) 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 Q Date: Fri, 11 Jul 2025 10:55:36 +0200 Subject: [PATCH 05/14] Convert pricing section to MDX and move under /platform --- content/pricing/enterprise.textile | 35 ---- content/pricing/faqs.textile | 164 ----------------- content/pricing/free.textile | 66 ------- content/pricing/index.textile | 119 ------------- content/pricing/limits.textile | 124 ------------- .../pages/docs/platform/pricing/billing.mdx | 22 +-- .../docs/platform/pricing/enterprise.mdx | 37 ++++ src/pages/docs/platform/pricing/faqs.mdx | 166 ++++++++++++++++++ src/pages/docs/platform/pricing/free.mdx | 69 ++++++++ src/pages/docs/platform/pricing/index.mdx | 128 ++++++++++++++ src/pages/docs/platform/pricing/limits.mdx | 131 ++++++++++++++ .../pages/docs/platform/pricing/pro.mdx | 55 +++--- .../pages/docs/platform/pricing/standard.mdx | 55 +++--- 13 files changed, 601 insertions(+), 570 deletions(-) delete mode 100644 content/pricing/enterprise.textile delete mode 100644 content/pricing/faqs.textile delete mode 100644 content/pricing/free.textile delete mode 100644 content/pricing/index.textile delete mode 100644 content/pricing/limits.textile rename content/pricing/billing.textile => src/pages/docs/platform/pricing/billing.mdx (67%) create mode 100644 src/pages/docs/platform/pricing/enterprise.mdx create mode 100644 src/pages/docs/platform/pricing/faqs.mdx create mode 100644 src/pages/docs/platform/pricing/free.mdx create mode 100644 src/pages/docs/platform/pricing/index.mdx create mode 100644 src/pages/docs/platform/pricing/limits.mdx rename content/pricing/pro.textile => src/pages/docs/platform/pricing/pro.mdx (50%) rename content/pricing/standard.textile => src/pages/docs/platform/pricing/standard.mdx (51%) diff --git a/content/pricing/enterprise.textile b/content/pricing/enterprise.textile deleted file mode 100644 index cb9e0c3670..0000000000 --- a/content/pricing/enterprise.textile +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Enterprise package -meta_description: "Explore the features of Ably's Enterprise package." ---- - -Custom packages to meet all of your business needs. - -h2(#features). Features - -Enterprise packages can include features such as: - -- HIPAA BAA := Ably is "HIPAA compliant":https://faqs.ably.com/are-you-hipaa-compliant and can sign a Business Associate Agreement (BAA) in most cases. -- Regional data constraints := require that all traffic is routed and serviced only within specific regions, such as EU-only, or US-only. -- Custom CNAMEs := use your own custom domain, or a subdomain of Ably for your application or service. -- SAML and SCIM := authenticate with Ably using your own Identity Provider (IdP) and automatically provision users within your Ably account. -- Active traffic management := Ably can monitor the health of your own endpoints and proactively take steps to isolate, or move, traffic to ensure business continuity. -- DataDog := send metrics from Ably into your "DataDog":/docs/integrations/streaming/datadog account. -- PrivateLink := enable traffic from your users and servers into Ably without using the public internet via "AWS PrivateLink":https://aws.amazon.com/privatelink/. -- Private clusters := guaranteed capacity and isolation from all other Ably users. - -h2(#pricing). Pricing - -"Contact us":https://ably.com/contact?cta=enterprise_package to discuss setting up an Enterprise package that best suits your needs. - -

- -h2(#limits). Limits - -Enterprise packages are made for "limitless scale":/docs/pricing/limits. - -h2(#support). Support - -Enterprise packages include enhanced Service Level Agreements (SLAs) to ensure that Ably is ready to support you. diff --git a/content/pricing/faqs.textile b/content/pricing/faqs.textile deleted file mode 100644 index c99162220e..0000000000 --- a/content/pricing/faqs.textile +++ /dev/null @@ -1,164 +0,0 @@ ---- -title: Pricing FAQs -meta_description: "A list of the most commonly asked questions related to Ably pricing." ---- - -Answers to the most commonly asked questions related to Ably pricing. - -h2(#cost). Costs and billing - -FAQs related to package costs and package billing. - -h3(#billing-time). When and how often am I billed? - -Your consumption is calculated on the last day of the month. Invoices are issued in arrears on the 1st of the following month. - -If you upgraded in the middle of the month then the base package price will be charged pro-rata from the point in the month that you upgraded. - -Package downgrades take effect on the 1st of the following month. - -For Enterprise packages, consult your contract for billing information, or contact your Customer Success Manager. - -h3(#volume). Are there any volume discounts? - -Yes. Ably's pricing is consumption-based using the number of messages, and channel and connection minutes consumed. The cost of each unit decreases as you use more per month. - -h2(#concepts). Concepts and limits - -FAQs related to pricing concepts and package limits. - -h3(#concurrent-connections). How do you count concurrent connections? - -The "limit":/docs/pricing/limits#connection on concurrent connections is for the maximum number of realtime clients "connected":/docs/connect to Ably simultaneously at any point in time. HTTP requests such as those from REST clients do not count towards this number, as it is solely related to realtime connections. - -h3(#concurrent-channels). How do you count concurrent channels? - -The "limit":/docs/pricing/limits#channel on concurrent channels is for the maximum number of channels that are active simultaneously at any point in time. - -"Channels":/docs/channels are opened when either a message is published on the channel using a REST client, or a realtime client attaches to the channel. They are considered active until the channel is closed. - -A channel will automatically close when there are no more realtime clients attached, and approximately one minute has passed since the last realtime client detached or since a message was published to the channel. - -For example, if you have 10,000 users, and at your busiest time of the month there is a single spike where 500 customers establish a realtime connection to Ably and each attach to one unique channel, and one global shared channel. The concurrent number of channels would be the sum of the 500 unique channels per client and the one global shared channel, so 501 concurrent channels. - -h3(#message-size). How is maximum message size measured? - -The maximum message size is based on the "package type":/docs/pricing#packages. The size is calculated as the sum of the @name@, @clientId@ and @data@ "properties":/docs/api/realtime-sdk/messages#properties. This is before any compression or expansion occurs in the serialization process. - -* @name@ and @clientId@ are calculated as the size in bytes of their UTF-8 representation. -* @data@ is calculated as the size in bytes if it is in binary, or its UTF-8 byte length if it is a string. - -If the @data@ is binary and the message is sent on a text transport with base64 encoded data, and has an encoding attribute of base64, the size is calculated using the actual size of the binary data, not its base64 encoded string. - -If "publishing":/docs/api/realtime-sdk/channels#publish an array of messages, the message size limit applies to the sum of all messages in the array, as they are treated as a single unit by the Ably platform. This is even though the are published and broadcast atomically. - -h3(#limit). What happens if I exceed a limit? - -The effect of exceeding a "limit":/docs/pricing/limits differs depending on the limit. - -In most cases, if you exceed a limit then it means that your app is performing well. Ably won't penalize your success by blocking usage on your account for most limits. Normal service will continue to function, up to a point, beyond the limit. You would have received a notification of nearing a limit, and will receive another notification alerting you to the need to upgrade your package to accommodate your increased usage. - -Limits will come into force either because there isn't any buffer on them, or because you have exceeded the buffer. Exceeding the limit depends on the limit: - -- Count-based limits := only a set amount of resources can be in use simultaneously. This means that any usage in excess of that limit will be restricted until existing resources are removed, such as the number of concurrent connections, or concurrent channels. -- Rate-based limits := the rate at which resources can be used, expressed as their frequency per second. Usage in excess of a rate limit can be rejected locally, such as a publisher trying to publish at a rate in excess of the publish rate per channel. The publisher will have any publish attempts in excess of this rate rejected and have an error code returned. Other rate limits apply rate suppression across your account when exceeded. For example, if the limit for publishing messages into a queue is exceeded by twice the rate, then each message will have a 50% chance of being rejected. The suppression probability is continuously updated based on the publishing rate. - -h2(#data). Data and compliance - -FAQs related to data and compliance. - -h3(#data-protection). What is your Data Protection policy? - -Please read Ably's "Data Protection Policy":/docs/https://ably.com/data-protection for full details on how your data is handled. - -h3(#constrain). Can my data be constrained to the EU or US? - -Yes. "Enterprise packages":/docs/pricing/enterprise can include the ability to restrict traffic to only a specific region, such as EU-only, or US-only. - -h3(#gdpr). Does Ably have a GDPR (General Data Protection Regulation) DPA (Data Processing Agreement) to sign? - -No. This is not necessary as Ably's online Terms incorporate everything that is required within a DPA document. This means that all customers globally can rely on Ably's "standard terms":/docs/https://www.ably.io/terms which include the provisions for GDPR DPA, and which will apply automatically whenever they use AWS (Amazon Web Services) services to process personal data under the GDPR. By incorporating our GDPR DPA into the Ably Service Terms, we are simply extending the terms of our GDPR DPA to all customers globally who will require it under GDPR. Note that you can review the changes to our terms to incorporate GDPR requirements by reviewing our "legals audit trail":https://www.ably.io/legals from 29 March 2018. - -h3(#hipaa). Is Ably compliant with HIPAA (Health Insurance Portability and Accountability Act)? - -The following information outlines Ably's compliance with the US HIPAA Security Rule. If you require further information then "contact us":https://ably.com/contact to find out more. - -h4(). Is Ably a 'covered entity' which is required to comply with the HIPAA Security Rule? - -No. The HIPAA Security Rule operationalizes the protections contained in the HIPAA Privacy Rule by addressing the technical and non-technical safeguards that organizations called 'covered entities' must put in place to secure individuals' electronic protected health information (e-PHI). - -Covered entities include Health Plans, Health Care Providers and Healthcare Clearinghouses. - -Ably is not a Health Plan, nor a Health Care Provider, nor a Clearinghouse as defined by U.S. Department of Health & Human Services: - -_“Health care clearinghouses are entities that process nonstandard information they receive from another entity into a standard (i.e., standard format or data content), or vice versa._ - -_In most instances, health care clearinghouses will receive individually identifiable health information only when they are providing these processing services to a health plan or health care provider as a business associate._ - -_In such instances, only certain provisions of the Privacy Rule are applicable to the health care clearinghouse's uses and disclosures of protected health information._ - -_Health care clearinghouses include billing services, repricing companies, community health management information systems, and value-added networks and switches *if these entities perform clearinghouse functions*.”_ - -h4(). Is Ably a 'business associate' under the terms of the HIPAA Security Rule? - -No. A business associate is “a person or organization, other than a member of a covered entity's workforce, that performs certain functions or activities on behalf of, or provides certain services to, a covered entity that involve the use or disclosure of individually identifiable health information.” - -Ably could be a business associate under this definition, however, the security rule further defines business associates as “organizations are not considered business associates if their functions or services do not involve the use or disclosure of protected health information, and *where any access to protected health information by such persons would be incidental, if at all*.” - -Whilst Ably may be used by covered entities to transport individually identifiable health information, Ably does not inspect the data it transports. Ably never inspects payloads. We treat them as opaque. Ably is a conduit for data (a 'dumb pipe') like the postal service in the physical world. - -h4(). Does Ably transport individually identifiable health information? - -As a transport for information Ably does not know the nature of the data we are handling. It is possible for our customers, who may be covered entities under HIPAA, to transport individually identifiable health information. However, Ably cannot inspect that data so there is no access to protected health information and any such access would be incidental, if at all. - -Under HIPAA there are no restrictions on the use or disclosure of de-identified health information which neither identifies nor provides a reasonable basis to identify an individual. So where Ably customers, even covered entities, are using Ably only to transport de-identified health information, then HIPAA does not apply. - -h4(). What level of data encryption does Ably use? - -Ably uses TLS 2048 bit encryption for all data in transit. However, customers can elect not to transmit their data over TLS. All data within the same data centre in Ably is moved around unencrypted as it cannot be intercepted, but is always encrypted when moved between data centres. - -Ably also offers optional 256-bit AES symmetric encryption which makes it impossible for Ably to inspect any data payloads moving through the system at all, even if we wanted to. - -h4(). Where is data going through the Ably platform stored? - -Data in transit is stored ephemerally (i.e. not on disk) in all 16+ data centres "globally":https://www.ably.io/network. Each region can have two or more data centres. - -Messages are only persisted when history is "explicitly enabled":/docs/storage-history/storage, and that data is stored in US East Virginia, Europe Ireland, and Asia Singapore. - -"Enterprise packages":/docs/pricing/enterprise have the option to choose where the data is routed and stored geographically. - -h4(). Is Ably prepared to sign a 'Business Associate Agreement' (BAA)? - -Under HIPAA, any covered entity must impose specified written safeguards on the individually identifiable health information used or disclosed by its business associates. - -As per the points above Ably is neither a covered entity nor a business associate under the terms of the HIPAA Security Rule. - -However, some customers still like Ably to sign a business associate agreement which requires Ably to comply with specified safeguards. - -In most cases, Ably is happy to do this as we have such safeguards in place as a matter of course and most business associate agreements are standard. We also recognize that an Ably customer, if a covered entity, may not contractually authorize Ably to make any use or disclosure of protected health information that would violate the Security Rule. - -Ably is willing to sign Business Associate Agreements for our "Enterprise package":/docs/pricing/enterprise customers. "Contact us":https://ably.com/contact if you have a Business Associate Agreement you would like Ably to review. - -h2(#packages). Ably package management - -FAQs related to managing your Ably package. - -h3(#free). How does the Free package work? - -The "Free package":/docs/pricing/free is a zero friction way for you to explore Ably and its features without any commitment. No credit card is required to sign up and there's no time limit on how long you can try it for. - -Once you need production-level scale then there's a simple path to upgrade to a subscription-based plan such as a "Standard":/docs/pricing/standard or "Pro":/docs/pricing/pro package. - -h3(#change-package). Can I upgrade or downgrade my package at any time? - -Yes. - -1. Ensure you are the "account owner":/docs/account/users. -2. Log in to your "account":https://ably.com/login and select *Billing* from the *Account* menu. -3. Select the package that you would like to upgrade or downgrade to. - -Upgrades take effect immediately, whilst downgrades will take effect at the beginning of the following month. - -h3(#cancel). Can I close my account at any time? - -Yes. You can "close your account":/docs/account/users#close at any time by downgrading to the Free package. diff --git a/content/pricing/free.textile b/content/pricing/free.textile deleted file mode 100644 index bb1cbcd9c1..0000000000 --- a/content/pricing/free.textile +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: Free package -meta_description: "Explore the features of Ably's Free package." ---- - -The Free package is intended for developers to try out Ably. They can freely experiment with its features and build a proof of concept. No credit card is required to sign up and there's no time limit on how long you can try it for. - -h2(#features). Features - -The Free package includes the following units of consumption: - -|_. Limit |_. Free | -| Message rate (per second) | 500 | -| Messages (per month) | 6,000,000 | -| Concurrent channels | 200 | -| Concurrent connections | 200 | - -Free package users also have access to the following features: - -* Google and GitHub SSO - -h2(#pricing). Pricing - -There is no cost associated with the Free package, and you don't need to provide a credit card in order to use the service. - -h2(#limits). Limits - -"Compare the limits":/docs/pricing/limits associated with each package to see those available on the Free package. - -h2(#support). Support - -Free package support includes Ably's best effort Service Level Objective (SLO) and access to community support, including "Discord":https://discord.gg/g8yqePUVDn and "Stack Overflow":https://stackoverflow.com/questions/tagged/ably-realtime. - -h2(#upgrade). Upgrade from Free to Standard or Pro - -To upgrade your account from a Free package to a Standard or Pro package: - -1. Ensure you are the "account owner":/docs/account/users. -2. Log in to your "account":https://ably.com/login and select *Billing* from the *Account* menu. -3. Choose the plan you wish to upgrade to and follow the instructions. Upgrades take effect immediately. - -Note that your first invoice will be issued at the start of the following calendar month. It covers consumption from the point of upgrade up until the end of that month. All subsequent invoices will follow the same pattern of billing for the previous month's consumption. The base package price will be charged pro-rata from the point in the month that you upgraded. - -Once you upgrade to a "Standard":/docs/pricing/standard or "Pro":/docs/pricing/pro package, your consumption is counted from that point onwards. For example, if you upgrade in the middle of the month, you are charged for the first message you send after upgrading, not after the 6,000,000 messages allowed on the Free package. - -h2(#free-enterprise). Upgrade from Free to Enterprise - -To upgrade your account from a Free package to an "Enterprise package":/docs/pricing/enterprise, "contact us":https://ably.com/contact?cta=enterprise_package to discuss your options. - -h2(#downgrade). Downgrade - -To downgrade your account to a Free package: - -1. Ensure you are the "account owner":/docs/account/users. -2. Log in to your "account":https://ably.com/login and select *Billing* from the *Account* menu. -3. Click the *Downgrade* button. - -If you downgrade to the "Free package":/docs/pricing/free, you will remain on your previous package with its limits and benefits until the end of your billing cycle (on the 1st of the month). At the start of the following month, you will receive a final invoice that includes the full package fee for the previous month. - -h2(#close). Close your account - -If you're using the Free package, you can "close your account":/docs/account/users#close at any time. - - diff --git a/content/pricing/index.textile b/content/pricing/index.textile deleted file mode 100644 index 41b10f9786..0000000000 --- a/content/pricing/index.textile +++ /dev/null @@ -1,119 +0,0 @@ ---- -title: Pricing overview -meta_description: "Understand how Ably pricing works and the benefits of each package type." ---- - -Ably's pricing is consumption-based. This means that you pay for what you use. - -For full details of Ably's pricing model, refer to the "pricing":https://ably.com/pricing page. - -h2(#units). Pricing units - -Ably primarily charges based on three units of consumption: - -- Messages

_(per million)_

:=

The unit of data transfer throughout Ably.

For example, if a user sends (publishes) a message and 10 users receive it (subscribed) that counts as 11 messages. Other operations also count towards the total message count, such as retrieving messages from history, or sending them through an integration.

-- Active channels[^[*]^]

_(per million minutes)_

:=

"Channels":/docs/channels are used to logically separate message traffic into different topics, such as @account-debits@ and @account-credits@.

For example, if you have three chat rooms open with users communicating in all of them for 2 hours then that would be 6 hours of channel time. The number of users attached to each channel does not influence the channel minutes.

-- Connections

_(per million minutes)_

:=

A "connection":/docs/connect is established between your clients and Ably for realtime communication.

For example, if you have 5 users that are all connected to Ably for exactly 10 minutes each, this counts as 50 minutes worth of connection time. If you have 50,000 users that are connected to Ably for 3 hours each, then this counts as 9,000,000 minutes.

- -

[*] Channels are created on demand when clients attach to them. They remain active until there are no more realtime clients attached, approximately one minute has passed since the last client detached, and approximately one minute has passed since the last message was published to the channel.

- -The following table explains the limits related to the three primary units of consumption: - -|_. Limit |_. Free |_. Standard |_. Pro |_. Enterprise | -| *Message rate (per second)*

_the maximum rate at which messages can be published and received across your account each second_

| 500 | 2,500 | 10,000 | Unlimited | -| *Messages (per month)*

_the maximum number of messages that can be sent and received across your account each month_

| 6,000,000 | Unlimited | Unlimited | Unlimited | -| *Concurrent channels*

_the maximum number of channels that are active simultaneously at any point_

| 200 | 10,000 | 50,000 | Unlimited | -| *Concurrent connections*

_the maximum number of realtime clients connected to Ably simultaneously at any point_

| 200 | 10,000 | 50,000 | Unlimited | - -h3(#bandwidth). Bandwidth - -There is also a charge on additional bandwidth consumed. - -This is worked out based on the average message size of 5KiB multiplied by the number of messages consumed in the month. If your total bandwidth for the month is less than this value then there is no charge for bandwidth. Anything over this value is charged at $0.25 per GiB. - -h2(#packages). Packages - -Ably offers four different package types so that you can choose the one that best suits your needs: - -* "Free:":/docs/pricing/free for experimenting with Ably, or building a proof of concept. No credit card required. -* "Standard:":/docs/pricing/standard for when you're ready to roll out into production. -* "Pro:":/docs/pricing/pro higher limits than the standard package to accommodate a growing business. -* "Enterprise:":/docs/pricing/enterprise create a custom package to meet all of your business needs. - -h2(#pricing). Pricing - -Each package has a default base price. You are then charged for the amount of messages, and channel and connection time that you consume. The cost of each of these units decreases as you consume more. - -h3(#base). Base package price - -Packages have a monthly base package price: - -|_. Free |_. Standard |_. Pro |_. Enterprise | -| N/A | $39 | $399 | Custom | - -h3(#messages). Message cost - -Messages are charged per million messages consumed: - -|_. Number of messages |_. Cost (per million) | -| First 50 million | $2.50 | -| Next 450 million | $2.25 | -| Next 4.5 billion | $1.95 | -| Next 15 billion | $1.65 | -| Next 30 billion | $1.40 | -| Over 50 billion | $1.25 | - -For example: - -* if you use 49 million messages in a month, this would cost $122.50 (49 x 2.50). -* if you use 120 million messages in a month, this would cost $282.50 ((50 x 2.50) + (70 x 2.25)) - -h3(#channels). Channel minutes cost - -Channels are charged for every million minutes of activity: - -|_. Channel time (minutes) |_. Price (per million minutes) | -| First 10 million | $1.00 | -| Next 90 million | $0.95 | -| Next 900 million | $0.85 | -| Next 4 billion | $0.75 | -| Next 10 billion | $0.65 | -| Over 15 billion | $0.60 | - -For example: - -* if you use 8 million minutes of channel time, this would cost $8.00 (8 x 1.00). -* if you use 140 million minutes of channel time, this would cost $129.50 ((10 x 1.00) + (90 x 0.95) + (40 x 0.85)). - -h3(#connections). Connection minutes cost - -Connections are charged for every million minutes of activity: - -|_. Connection time (minutes) |_. Price (per million minutes) | -| First 10 million | $1.00 | -| Next 90 million | $0.95 | -| Next 900 million | $0.85 | -| Next 4 billion | $0.75 | -| Next 10 billion | $0.65 | -| Over 15 billion | $0.60 | - -For example: - -* if you use 7 million minutes of connection time, this would cost $8.00 (7 x 1.00). -* if you use 130 million minutes of connection time, this would cost $121 ((10 x 1.00) + (90 x 0.95) + (30 x 0.85)). - -h2(#limits). Limits - -There are limits on certain operations within Ably. This is to protect against deliberate or accidental abuse of your application, and to provide a level of protection on your consumption costs if abuse does occur. - -Whilst hitting a limit should be an infrequent occurrence if you're on the correct package, it's important to be aware of the different types of limits that exist. - -Find out more about "limits":/docs/pricing/limits. - -h2(#billing). Billing - -It's important to understand how, and when, you're billed. - -Invoices are issued in arrears on the first of each month. They include your base package price, plus your consumption of messages, and channel and connection minutes used in the previous month. - -Find out more about "billing":/docs/pricing/billing. diff --git a/content/pricing/limits.textile b/content/pricing/limits.textile deleted file mode 100644 index acae705134..0000000000 --- a/content/pricing/limits.textile +++ /dev/null @@ -1,124 +0,0 @@ ---- -title: Limits -meta_description: "The limits associated with each Ably package." -redirect_from: - - /docs/general/limits ---- - -Ably can scale effortlessly as your business grows. - -Limits exist in order to minimize the impact on service due to accidental or deliberate abuse of your applications. They also provide a level of protection to your consumption rates if abuse does occur. If you're on the correct package for your applications and use case, then hitting a limit should be an infrequent occurrence. - -h2(#types). Limit types - -Some limits are tied to a package type. For example, the length of time that you can store messages for is dictated by which package you are on, from 1 day on a Free package up to 1 year on an Enterprise package. - -Other limits are more technical in nature. For example, the number of channels that a single realtime connection can be attached to, or the rate at which a single connection can publish messages. - -Others still are precautions against high message consumption. For example, the number of clients that can be "present":/docs/presence-occupancy/presence on a single channel. This is because clients can change state very rapidly and the number of messages generated can be high. An example of this would be 200 clients subscribed to presence events on a channel and all of them join and leave the presence set within a few minutes. This would result in the following messages: - -* 200 presence messages published for the enter event. -* 200 x 200 (40,000) messages subscribed to for the enter events. -* 200 presence messages published for the leave event. -* 200 x 200 (40,000) presence messages subscribed to for the leave event. - -This highlights the potential for 80,400 messages to be sent in a very short space of time on a single channel. There are options for "mitigating":/docs/presence-occupancy/presence#present-no-subscribe this such as utilizing "server-side batching":/docs/channels#server-side-batching. Contact Ably to discuss increasing this limit if you think it's necessary for your use case. - -h3(#view). View limits - -1. Log in to your "account":https://ably.com/login. -2. Select *Limits* from the *Account* menu. - -To view any limits that you have previously hit, click *view recent limits notifications*. - -h2(#hitting). Exceeding a limit - -If you exceed the limits of your package then it likely means that your app is performing well, and Ably won't penalize your success by blocking usage for the majority of limits. Normal service will continue to function beyond the limit, up to a point, for certain limits. However, Ably will contact you to let you know that you need to upgrade your package to accommodate your increased usage. - -Limits will come into force either because there isn't any buffer on them, or because you have exceeded the buffer. Exceeding the limit depends on the limit: - -- Count-based limits := only a set amount of resources can be in use simultaneously. This means that any usage in excess of that limit will be restricted until existing resources are removed, such as the number of concurrent connections, or concurrent channels. -- Rate-based limits := the rate at which resources can be used, expressed as their frequency per second. Usage in excess of a rate limit can be rejected locally, such as a publisher trying to publish at a rate in excess of the publish rate per channel. The publisher will have any publish attempts in excess of this rate rejected and have an error code returned. Other rate limits apply rate suppression across your account when exceeded. For example, if the limit for publishing messages into a queue is exceeded by twice the rate, then each message will have a 50% chance of being rejected. The suppression probability is continuously updated based on the publishing rate. - - - -Email notifications are sent out when you are nearing a limit, as well as when you have exceeded it. You will also see these notifications in your "account dashboard":https://ably.com/accounts/any and can view any limits that you have previously exceeded. - -h2(#account). Application limits - -Application limits relate to the quantity of resources that can be created per account. - -|_. Application limit |_. Free |_. Standard |_. Pro |_. Enterprise | -| *Number of apps (per account)*

_the maximum number of applications that can be created per account_

| 100 | 100 | 100 | 100 | -| *Number of API keys (per account)*

_the maximum number of API keys that can be created per account_

| 100 | 100 | 100 | 100 | -| *Number of rules (per account)*

_the maximum number of channel rules that can be created per account_

| 100 | 100 | 100 | 100 | -| *Number of namespaces (per account)*

_the maximum number of namespaces that can be created per account_

| 100 | 100 | 100 | 100 | - -h2(#message). Message limits - -Message limits relate to the number, rate and bandwidth of messages consumed across you account. - -|_. Message limit |_. Free |_. Standard |_. Pro |_. Enterprise | -| *Message rate (per second)*

_the maximum rate at which messages can be published and received across your account each second_

| 500 | 2,500 | 10,000 | Unlimited | -| *Messages (per month)*

_the maximum number of messages that can be sent and received across your account each month_

| 6,000,000 | Unlimited | Unlimited | Unlimited | -| *Message count (per hour)*

_the total number of messages that can be sent across an account per hour_

| 250,000 | 5,208,000 | 20,833,000 | Unlimited | -| *Message bandwidth rate (per second, KiB)*

_the maximum rate at which data can be transferred through messages each second, in KiB_

| 2,384 | 11,921 | 47,684 | Unlimited | -| *Message bandwidth (hourly, GiB)*

_the maximum amount of data that can be transferred through messages each hour, in GiB_

| 1.2 | 24.8 | 99.3 | Unlimited | -| *Message bandwidth (monthly, GiB)*

_the maximum amount of data that can be transferred through messages each month, in GiB_

| 28.6 | 1,192 | 4,768 | Unlimited | -| *Max message size (KiB)*

_the maximum size of a single published message_

| 64 | 64 | 256 | 256 | -| *Default history TTL (hours)*

_the default time that a message or presence message can be retrieved from history_

| 24 | 72 | 72 | 72 | -| *Max history / storage TTL (days)*

_the maximum time that a message or presence message can be retrieved from history_

| 1 | 30 | 365 | 365 | - -h2(#channel). Channel limits - -Channel limits relate to the number, rate and membership of "channels":/docs/channels on your account. - -|_. Channel limit |_. Free |_. Standard |_. Pro |_. Enterprise | -| *Concurrent channels*

_the maximum number of channels that are active simultaneously at any point_

| 200 | 10,000 | 50,000 | Unlimited | -| *Default last message on channel TTL (days)*

_the default period that the last message on a channel is stored for, when enabled_

| 1 | 30 | 365 | 365 | -| *Channel creation rate (per second)*

_the maximum rate at which channels can be created across an account_

| 42 | 250 | 500 | Custom | -| *Message publish rate per channel (per second)*

_the maximum rate at which messages can be published for each channel_

| 50 | 50 | 50 | 50 | -| *Presence members per channel*

_the maximum number of clients that can be simultaneously present on a channel_

| 200 | 200 | 200 | 200 | -| *Presence members per channel with "server-side batching":/docs/messages/batch#server-side enabled*

_the maximum number of clients that can be simultaneously present on a channel when server-side batching is enabled_

| 200 | 5,000 | 10,000 | 20,000 | -| *Objects per channel*

_the maximum number of objects that can be stored on a channel_

| 100 | 100 | 100 | 100 | - -h2(#connection). Connection limits - -Connection limits relate to the realtime "connections":/docs/connect made to Ably from your account. - -|_. Connection limit |_. Free |_. Standard |_. Pro |_. Enterprise | -| *Concurrent connections*

_the maximum number of realtime clients connected to Ably simultaneously at any point_

| 200 | 10,000 | 50,000 | Unlimited | -| *New connection rate (per second)*

_the maximum rate at which new realtime connections can be made to Ably across an account_

| 42 | 250 | 500 | Custom | -| *Inbound message rate (per second)*

_the maximum rate at which messages can be published by a realtime connection_

| 50 | 50 | 50 | 50 | -| *Outbound message rate (per second)*

_the maximum rate at which messages can be received by a realtime connection_

| 50 | 50 | 50 | 50 | -| *Number of channels per connection*

_the maximum number of channels that each connection can be attached to_

| 200 | 200 | 200 | 200 | -| *Connection state TTL*

_the maximum duration that Ably will preserve the state of a dropped connection for_

| 2 mins | 2 mins | 2 mins | 2 mins | - -h2(#integration). Integration limits - -Integration limits relate to the rate and concurrency of "webhooks":/docs/integrations/webhooks, "queues":/docs/integrations/queues and "Firehose":/docs/integrations/streaming. - -|_. Integration limit |_. Free |_. Standard |_. Pro |_. Enterprise | -| *Integration rate (per second)*

_the maximum rate at which integrations can be executed, or streamed_

| 250 | 250 | 1,000 | Custom | -| *Integration concurrency (Google Functions and Azure)*

_the maximum number of integrations that can run at the same time_

| 25 | 25 | 100 | Custom | -| *Webhook batch size*

_the maximum number of webhook events that can be sent per batch_

| 50 | 100 | 100 | 100 | -| *Webhook batch concurrency*

_the maximum number of webhook batches that can be processed at the same time_

| 1 | 1 | 1 | 1 | -| *Max number of queues (per account)*

_the maximum number of queues that can be created per account_

| 5 | 10 | 50 | 100+ | -| *Max queue length*

_the maximum number of messages that can be stored in queues whilst waiting to be consumed. This value is shared between all queues in an account_

| 50,000 | 50,000 | 50,000 | 50,000 | -| *Queue publish rate (per second)*

_the maximum rate at which messages can be published to a queue_

| 250 | 250 | 1,000 | Custom | -| *Queue TTL (hours)*

_the maximum time that a message is stored in a queue for, before being transferred to the dead letter queue_

| 24 | 24 | 24 | 24 | - -h2(#api). API limits - -API request limits are the maximum number of "REST API":/docs/api/rest-api requests, "Control API":/docs/account/control-api requests and "token requests":/docs/auth/token that can be made to Ably. - -|_. API request limit |_. Free |_. Standard |_. Pro |_. Enterprise | -| *HTTP API requests (per hour)*

_the maximum number of HTTP API requests that can be made to Ably per hour, excluding token requests_

| 25,000 | 521,000 | 2,083,300 | Custom | -| *HTTP API request rate (per second)*

_the maximum rate at which HTTP API requests can be made to Ably_

| 50 | 362 | 1,447 | Custom | -| *Token requests (per hour)*

_the maximum number of token requests that can be made to Ably per hour_

| 60,000 | 360,000 | 720,000 | Custom | -| *Token request rate (per second)*

_the maximum rate at which token requests can be made_

| 50 | 250 | 500 | Custom | -| *Control API: authenticated account requests (per hour)*

_the maximum number of requests that can be made to the Control API, per hour, from authenticated users_

| 4000 | 4000 | 4000 | 4000 | -| *Control API: authenticated access token requests (per hour)*

_the maximum number of requests that can be made to the Control API, per hour, for each access token_

| 2000 | 2000 | 2000 | 2000 | -| *Control API: unauthenticated requests (per hour)*

_the maximum number of requests that can be made to the Control API, per hour, from unauthenticated users_

| 60 | 60 | 60 | 60 | diff --git a/content/pricing/billing.textile b/src/pages/docs/platform/pricing/billing.mdx similarity index 67% rename from content/pricing/billing.textile rename to src/pages/docs/platform/pricing/billing.mdx index 9ffb35b734..700e9fa816 100644 --- a/content/pricing/billing.textile +++ b/src/pages/docs/platform/pricing/billing.mdx @@ -1,23 +1,25 @@ --- title: Billing meta_description: "Understand how invoicing and billing works for Ably packages." +redirect_from: + - /docs/pricing/billing --- Your monthly bills are calculated based on the base package fee, plus the number of messages, and channel and connection minutes that you used for that month. Consumption is calculated on the last day of the month and invoices are issued in arrears on the 1st of the following month. Note that for consumption, minutes are the smallest units that we bill against, and they are rounded up. So if a connection was open for 10.01 minutes then this will be billed as 11 minutes of usage. -h2(#package-changes). Upgrades and downgrades +## Upgrades and downgrades
For package upgrades, the base package price will be charged pro-rata from the point in the month that you upgraded. This is true for both base package prices if you are upgrading from a paid package. Package downgrades take effect on the 1st of the following month. - + -h2(#billing). Billing details and invoices +## Billing details and invoices The following details will appear on your credit card or bank statement when payments are processed by Ably: @@ -27,21 +29,21 @@ The following details will appear on your credit card or bank statement when pay To update your billing details: -1. Ensure you are the account owner or have the billing "role":/docs/account/users. -2. Log in to your "account":https://ably.com/login and select *Billing* from the *Account* menu. +1. Ensure you are the account owner or have the billing [role](/docs/account/users). +2. Log in to your [account](https://ably.com/login) and select *Billing* from the *Account* menu. You can update your payment details and view your invoices in this screen. It's also possible to have your invoices sent to an accounts department by filling in the *Optional billing email address*. -h2(#alerts). Billing alerts +## Billing alerts Billing alerts notify you by email when your monthly spending exceeds a set amount if you're on a Standard or Pro package. This feature helps you monitor costs and avoid unexpected charges. The following steps guide you through setting up billing alerts: -* Log in to your Ably "account.":https://ably.com/login -* In the "Create new alert":https://ably.com/accounts/any/package#billing-alerts-section section, select the email address from the dropdown list where you want to receive the alert. The available choices depend on your "user role":/docs/account/users#roles. +* Log in to your Ably [account.](https://ably.com/login) +* In the [Create new alert](https://ably.com/accounts/any/package#billing-alerts-section) section, select the email address from the dropdown list where you want to receive the alert. The available choices depend on your [user role](/docs/account/users#roles). ** If you are an owner: Yourself and billing users associated with the account. ** If you are a user with a billing role: Yourself only. * Enter a value greater than your base package fee in the *Amount* field. This amount sets the threshold at which you will receive a notification. diff --git a/src/pages/docs/platform/pricing/enterprise.mdx b/src/pages/docs/platform/pricing/enterprise.mdx new file mode 100644 index 0000000000..be6f687ff0 --- /dev/null +++ b/src/pages/docs/platform/pricing/enterprise.mdx @@ -0,0 +1,37 @@ +--- +title: Enterprise package +meta_description: "Explore the features of Ably's Enterprise package." +redirect_from: + - /docs/pricing/enterprise +--- + +Custom packages to meet all of your business needs. + +## Features + +Enterprise packages can include features such as: + +* **HIPAA BAA**: Ably is [HIPAA compliant](https://faqs.ably.com/are-you-hipaa-compliant) and can sign a Business Associate Agreement (BAA) in most cases. +* **Regional data constraints**: require that all traffic is routed and serviced only within specific regions, such as EU-only, or US-only. +* **Custom CNAMEs**: use your own custom domain, or a subdomain of Ably for your application or service. +* **SAML and SCIM**: authenticate with Ably using your own Identity Provider (IdP) and automatically provision users within your Ably account. +* **Active traffic management**: Ably can monitor the health of your own endpoints and proactively take steps to isolate, or move, traffic to ensure business continuity. +* **DataDog**: send metrics from Ably into your [DataDog](/docs/integrations/streaming/datadog) account. +* **PrivateLink**: enable traffic from your users and servers into Ably without using the public internet via [AWS PrivateLink](https://aws.amazon.com/privatelink/). +* **Private clusters**: guaranteed capacity and isolation from all other Ably users. + +## Pricing + +[Contact us](https://ably.com/contact?cta=enterprise_package) to discuss setting up an Enterprise package that best suits your needs. + + + +## Limits + +Enterprise packages are made for [limitless scale](/docs/pricing/limits). + +## Support + +Enterprise packages include enhanced Service Level Agreements (SLAs) to ensure that Ably is ready to support you. diff --git a/src/pages/docs/platform/pricing/faqs.mdx b/src/pages/docs/platform/pricing/faqs.mdx new file mode 100644 index 0000000000..44ff77a9c7 --- /dev/null +++ b/src/pages/docs/platform/pricing/faqs.mdx @@ -0,0 +1,166 @@ +--- +title: Pricing FAQs +meta_description: "A list of the most commonly asked questions related to Ably pricing." +redirect_from: + - /docs/pricing/faqs +--- + +Answers to the most commonly asked questions related to Ably pricing. + +## Costs and billing + +FAQs related to package costs and package billing. + +### When and how often am I billed? + +Your consumption is calculated on the last day of the month. Invoices are issued in arrears on the 1st of the following month. + +If you upgraded in the middle of the month then the base package price will be charged pro-rata from the point in the month that you upgraded. + +Package downgrades take effect on the 1st of the following month. + +For Enterprise packages, consult your contract for billing information, or contact your Customer Success Manager. + +### Are there any volume discounts? + +Yes. Ably's pricing is consumption-based using the number of messages, and channel and connection minutes consumed. The cost of each unit decreases as you use more per month. + +## Concepts and limits + +FAQs related to pricing concepts and package limits. + +### How do you count concurrent connections? + +The [limit](/docs/pricing/limits#connection) on concurrent connections is for the maximum number of realtime clients [connected](/docs/connect) to Ably simultaneously at any point in time. HTTP requests such as those from REST clients do not count towards this number, as it is solely related to realtime connections. + +### How do you count concurrent channels? + +The [limit](/docs/pricing/limits#channel) on concurrent channels is for the maximum number of channels that are active simultaneously at any point in time. + +[Channels](/docs/channels) are opened when either a message is published on the channel using a REST client, or a realtime client attaches to the channel. They are considered active until the channel is closed. + +A channel will automatically close when there are no more realtime clients attached, and approximately one minute has passed since the last realtime client detached or since a message was published to the channel. + +For example, if you have 10,000 users, and at your busiest time of the month there is a single spike where 500 customers establish a realtime connection to Ably and each attach to one unique channel, and one global shared channel. The concurrent number of channels would be the sum of the 500 unique channels per client and the one global shared channel, so 501 concurrent channels. + +### How is maximum message size measured? + +The maximum message size is based on the [package type](/docs/pricing#packages). The size is calculated as the sum of the `name`, `clientId` and `data` [properties](/docs/api/realtime-sdk/messages#properties). This is before any compression or expansion occurs in the serialization process. + +* `name` and `clientId` are calculated as the size in bytes of their UTF-8 representation. +* `data` is calculated as the size in bytes if it is in binary, or its UTF-8 byte length if it is a string. + +If the `data` is binary and the message is sent on a text transport with base64 encoded data, and has an encoding attribute of base64, the size is calculated using the actual size of the binary data, not its base64 encoded string. + +If [publishing](/docs/api/realtime-sdk/channels#publish) an array of messages, the message size limit applies to the sum of all messages in the array, as they are treated as a single unit by the Ably platform. This is even though the are published and broadcast atomically. + +### What happens if I exceed a limit? + +The effect of exceeding a [limit](/docs/pricing/limits) differs depending on the limit. + +In most cases, if you exceed a limit then it means that your app is performing well. Ably won't penalize your success by blocking usage on your account for most limits. Normal service will continue to function, up to a point, beyond the limit. You would have received a notification of nearing a limit, and will receive another notification alerting you to the need to upgrade your package to accommodate your increased usage. + +Limits will come into force either because there isn't any buffer on them, or because you have exceeded the buffer. Exceeding the limit depends on the limit: + +* **Count-based limits**: only a set amount of resources can be in use simultaneously. This means that any usage in excess of that limit will be restricted until existing resources are removed, such as the number of concurrent connections, or concurrent channels. +* **Rate-based limits**: the rate at which resources can be used, expressed as their frequency per second. Usage in excess of a rate limit can be rejected locally, such as a publisher trying to publish at a rate in excess of the publish rate per channel. The publisher will have any publish attempts in excess of this rate rejected and have an error code returned. Other rate limits apply rate suppression across your account when exceeded. For example, if the limit for publishing messages into a queue is exceeded by twice the rate, then each message will have a 50% chance of being rejected. The suppression probability is continuously updated based on the publishing rate. + +## Data and compliance + +FAQs related to data and compliance. + +### What is your Data Protection policy? + +Please read Ably's [Data Protection Policy](https://ably.com/data-protection) for full details on how your data is handled. + +### Can my data be constrained to the EU or US? + +Yes. [Enterprise packages](/docs/pricing/enterprise) can include the ability to restrict traffic to only a specific region, such as EU-only, or US-only. + +### Does Ably have a GDPR (General Data Protection Regulation) DPA (Data Processing Agreement) to sign? + +No. This is not necessary as Ably's online Terms incorporate everything that is required within a DPA document. This means that all customers globally can rely on Ably's [standard terms](https://www.ably.io/terms) which include the provisions for GDPR DPA, and which will apply automatically whenever they use AWS (Amazon Web Services) services to process personal data under the GDPR. By incorporating our GDPR DPA into the Ably Service Terms, we are simply extending the terms of our GDPR DPA to all customers globally who will require it under GDPR. Note that you can review the changes to our terms to incorporate GDPR requirements by reviewing our [legals audit trail](https://www.ably.io/legals) from 29 March 2018. + +### Is Ably compliant with HIPAA (Health Insurance Portability and Accountability Act)? + +The following information outlines Ably's compliance with the US HIPAA Security Rule. If you require further information then [contact us](https://ably.com/contact) to find out more. + +#### Is Ably a 'covered entity' which is required to comply with the HIPAA Security Rule? + +No. The HIPAA Security Rule operationalizes the protections contained in the HIPAA Privacy Rule by addressing the technical and non-technical safeguards that organizations called 'covered entities' must put in place to secure individuals' electronic protected health information (e-PHI). + +Covered entities include Health Plans, Health Care Providers and Healthcare Clearinghouses. + +Ably is not a Health Plan, nor a Health Care Provider, nor a Clearinghouse as defined by U.S. Department of Health & Human Services: + +*“Health care clearinghouses are entities that process nonstandard information they receive from another entity into a standard (i.e., standard format or data content), or vice versa.* + +*In most instances, health care clearinghouses will receive individually identifiable health information only when they are providing these processing services to a health plan or health care provider as a business associate.* + +*In such instances, only certain provisions of the Privacy Rule are applicable to the health care clearinghouse's uses and disclosures of protected health information.* + +*Health care clearinghouses include billing services, repricing companies, community health management information systems, and value-added networks and switches **if these entities perform clearinghouse functions**.”* + +#### Is Ably a 'business associate' under the terms of the HIPAA Security Rule? + +No. A business associate is “a person or organization, other than a member of a covered entity's workforce, that performs certain functions or activities on behalf of, or provides certain services to, a covered entity that involve the use or disclosure of individually identifiable health information.” + +Ably could be a business associate under this definition, however, the security rule further defines business associates as “organizations are not considered business associates if their functions or services do not involve the use or disclosure of protected health information, and **where any access to protected health information by such persons would be incidental, if at all**.” + +Whilst Ably may be used by covered entities to transport individually identifiable health information, Ably does not inspect the data it transports. Ably never inspects payloads. We treat them as opaque. Ably is a conduit for data (a 'dumb pipe') like the postal service in the physical world. + +#### Does Ably transport individually identifiable health information? + +As a transport for information Ably does not know the nature of the data we are handling. It is possible for our customers, who may be covered entities under HIPAA, to transport individually identifiable health information. However, Ably cannot inspect that data so there is no access to protected health information and any such access would be incidental, if at all. + +Under HIPAA there are no restrictions on the use or disclosure of de-identified health information which neither identifies nor provides a reasonable basis to identify an individual. So where Ably customers, even covered entities, are using Ably only to transport de-identified health information, then HIPAA does not apply. + +#### What level of data encryption does Ably use? + +Ably uses TLS 2048 bit encryption for all data in transit. However, customers can elect not to transmit their data over TLS. All data within the same data centre in Ably is moved around unencrypted as it cannot be intercepted, but is always encrypted when moved between data centres. + +Ably also offers optional 256-bit AES symmetric encryption which makes it impossible for Ably to inspect any data payloads moving through the system at all, even if we wanted to. + +#### Where is data going through the Ably platform stored? + +Data in transit is stored ephemerally (i.e. not on disk) in all 16+ data centres [globally](https://www.ably.io/network). Each region can have two or more data centres. + +Messages are only persisted when history is [explicitly enabled](/docs/storage-history/storage), and that data is stored in US East Virginia, Europe Ireland, and Asia Singapore. + +[Enterprise packages](/docs/pricing/enterprise) have the option to choose where the data is routed and stored geographically. + +#### Is Ably prepared to sign a 'Business Associate Agreement' (BAA)? + +Under HIPAA, any covered entity must impose specified written safeguards on the individually identifiable health information used or disclosed by its business associates. + +As per the points above Ably is neither a covered entity nor a business associate under the terms of the HIPAA Security Rule. + +However, some customers still like Ably to sign a business associate agreement which requires Ably to comply with specified safeguards. + +In most cases, Ably is happy to do this as we have such safeguards in place as a matter of course and most business associate agreements are standard. We also recognize that an Ably customer, if a covered entity, may not contractually authorize Ably to make any use or disclosure of protected health information that would violate the Security Rule. + +Ably is willing to sign Business Associate Agreements for our [Enterprise package](/docs/pricing/enterprise) customers. [Contact us](https://ably.com/contact) if you have a Business Associate Agreement you would like Ably to review. + +## Ably package management + +FAQs related to managing your Ably package. + +### How does the Free package work? + +The [Free package](/docs/pricing/free) is a zero friction way for you to explore Ably and its features without any commitment. No credit card is required to sign up and there's no time limit on how long you can try it for. + +Once you need production-level scale then there's a simple path to upgrade to a subscription-based plan such as a [Standard](/docs/pricing/standard) or [Pro](/docs/pricing/pro) package. + +### Can I upgrade or downgrade my package at any time? + +Yes. + +1. Ensure you are the [account owner](/docs/account/users). +2. Log in to your [account](https://ably.com/login) and select **Billing** from the **Account** menu. +3. Select the package that you would like to upgrade or downgrade to. + +Upgrades take effect immediately, whilst downgrades will take effect at the beginning of the following month. + +### Can I close my account at any time? + +Yes. You can [close your account](/docs/account/users#close) at any time by downgrading to the Free package. diff --git a/src/pages/docs/platform/pricing/free.mdx b/src/pages/docs/platform/pricing/free.mdx new file mode 100644 index 0000000000..c61da1d83b --- /dev/null +++ b/src/pages/docs/platform/pricing/free.mdx @@ -0,0 +1,69 @@ +--- +title: Free package +meta_description: "Explore the features of Ably's Free package." +redirect_from: + - /docs/pricing/free +--- + +The Free package is intended for developers to try out Ably. They can freely experiment with its features and build a proof of concept. No credit card is required to sign up and there's no time limit on how long you can try it for. + +## Features + +The Free package includes the following units of consumption: + +| Limit | Free | +| ----- | ---- | +| Message rate (per second) | 500 | +| Messages (per month) | 6,000,000 | +| Concurrent channels | 200 | +| Concurrent connections | 200 | + +Free package users also have access to the following features: + +* Google and GitHub SSO + +## Pricing + +There is no cost associated with the Free package, and you don't need to provide a credit card in order to use the service. + +## Limits + +[Compare the limits](/docs/pricing/limits) associated with each package to see those available on the Free package. + +## Support + +Free package support includes Ably's best effort Service Level Objective (SLO) and access to community support, including [Discord](https://discord.gg/g8yqePUVDn) and [Stack Overflow](https://stackoverflow.com/questions/tagged/ably-realtime). + +## Upgrade from Free to Standard or Pro + +To upgrade your account from a Free package to a Standard or Pro package: + +1. Ensure you are the [account owner](/docs/account/users). +2. Log in to your [account](https://ably.com/login) and select **Billing** from the **Account** menu. +3. Choose the plan you wish to upgrade to and follow the instructions. Upgrades take effect immediately. + +Note that your first invoice will be issued at the start of the following calendar month. It covers consumption from the point of upgrade up until the end of that month. All subsequent invoices will follow the same pattern of billing for the previous month's consumption. The base package price will be charged pro-rata from the point in the month that you upgraded. + +Once you upgrade to a [Standard](/docs/pricing/standard) or [Pro](/docs/pricing/pro) package, your consumption is counted from that point onwards. For example, if you upgrade in the middle of the month, you are charged for the first message you send after upgrading, not after the 6,000,000 messages allowed on the Free package. + +## Upgrade from Free to Enterprise + +To upgrade your account from a Free package to an [Enterprise package](/docs/pricing/enterprise), [contact us](https://ably.com/contact?cta=enterprise_package) to discuss your options. + +## Downgrade + +To downgrade your account to a Free package: + +1. Ensure you are the [account owner](/docs/account/users). +2. Log in to your [account](https://ably.com/login) and select **Billing** from the **Account** menu. +3. Click the **Downgrade** button. + +If you downgrade to the [Free package](/docs/pricing/free), you will remain on your previous package with its limits and benefits until the end of your billing cycle (on the 1st of the month). At the start of the following month, you will receive a final invoice that includes the full package fee for the previous month. + +## Close your account + +If you're using the Free package, you can [close your account](/docs/account/users#close) at any time. + + diff --git a/src/pages/docs/platform/pricing/index.mdx b/src/pages/docs/platform/pricing/index.mdx new file mode 100644 index 0000000000..187ed9fbff --- /dev/null +++ b/src/pages/docs/platform/pricing/index.mdx @@ -0,0 +1,128 @@ +--- +title: Pricing overview +meta_description: "Understand how Ably pricing works and the benefits of each package type." +redirect_from: + - /docs/pricing +--- + +Ably's pricing is consumption-based. This means that you pay for what you use. + +For full details of Ably's pricing model, refer to the [pricing](https://ably.com/pricing) page. + +## Pricing units + +Ably primarily charges based on three units of consumption: + +| Unit | Description | +| ---- | ----------- | +| Messages *(per million)* | The unit of data transfer throughout Ably. For example, if a user sends (publishes) a message and 10 users receive it (subscribed) that counts as 11 messages. Other operations also count towards the total message count, such as retrieving messages from history, or sending them through an integration. | +| Active channels`[*]` *(per million minutes)* | [Channels](/docs/channels) are used to logically separate message traffic into different topics, such as `account-debits` and `account-credits`. For example, if you have three chat rooms open with users communicating in all of them for 2 hours then that would be 6 hours of channel time. The number of users attached to each channel does not influence the channel minutes. | +| Connections *(per million minutes)* | A [connection](/docs/connect) is established between your clients and Ably for realtime communication. For example, if you have 5 users that are all connected to Ably for exactly 10 minutes each, this counts as 50 minutes worth of connection time. If you have 50,000 users that are connected to Ably for 3 hours each, then this counts as 9,000,000 minutes. | + +`[*]` Channels are created on demand when clients attach to them. They remain active until there are no more realtime clients attached, approximately one minute has passed since the last client detached, and approximately one minute has passed since the last message was published to the channel. + +The following table explains the limits related to the three primary units of consumption: + +| Limit | Free | Standard | Pro | Enterprise | +| ----- | ---- | -------- | --- | ---------- | +| Message rate (per second)

*the maximum rate at which messages can be published and received across your account each second*

| 500 | 2,500 | 10,000 | Unlimited | +| Messages (per month)

*the maximum number of messages that can be sent and received across your account each month*

| 6,000,000 | Unlimited | Unlimited | Unlimited | +| Concurrent channels

*the maximum number of channels that are active simultaneously at any point*

| 200 | 10,000 | 50,000 | Unlimited | +| Concurrent connections

*the maximum number of realtime clients connected to Ably simultaneously at any point*

| 200 | 10,000 | 50,000 | Unlimited | + +### Bandwidth
+ +There is also a charge on additional bandwidth consumed. + +This is worked out based on the average message size of 5KiB multiplied by the number of messages consumed in the month. If your total bandwidth for the month is less than this value then there is no charge for bandwidth. Anything over this value is charged at $0.25 per GiB. + +## Packages + +Ably offers four different package types so that you can choose the one that best suits your needs: + +* [Free:](/docs/pricing/free) for experimenting with Ably, or building a proof of concept. No credit card required. +* [Standard:](/docs/pricing/standard) for when you're ready to roll out into production. +* [Pro:](/docs/pricing/pro) higher limits than the standard package to accommodate a growing business. +* [Enterprise:](/docs/pricing/enterprise) create a custom package to meet all of your business needs. + +## Pricing + +Each package has a default base price. You are then charged for the amount of messages, and channel and connection time that you consume. The cost of each of these units decreases as you consume more. + +### Base package price + +Packages have a monthly base package price: + +| Free | Standard | Pro | Enterprise | +| ---- | -------- | --- | ---------- | +| N/A | $39 | $399 | Custom | + +### Message cost + +Messages are charged per million messages consumed: + +| Number of messages | Cost (per million) | +| ------------------ | ------------------ | +| First 50 million | $2.50 | +| Next 450 million | $2.25 | +| Next 4.5 billion | $1.95 | +| Next 15 billion | $1.65 | +| Next 30 billion | $1.40 | +| Over 50 billion | $1.25 | + +For example: + +* if you use 49 million messages in a month, this would cost $122.50 (49 x 2.50). +* if you use 120 million messages in a month, this would cost $282.50 ((50 x 2.50) + (70 x 2.25)) + +### Channel minutes cost + +Channels are charged for every million minutes of activity: + +| Channel time (minutes) | Price (per million minutes) | +| ---------------------- | ---------------------------- | +| First 10 million | $1.00 | +| Next 90 million | $0.95 | +| Next 900 million | $0.85 | +| Next 4 billion | $0.75 | +| Next 10 billion | $0.65 | +| Over 15 billion | $0.60 | + +For example: + +* if you use 8 million minutes of channel time, this would cost $8.00 (8 x 1.00). +* if you use 140 million minutes of channel time, this would cost $129.50 ((10 x 1.00) + (90 x 0.95) + (40 x 0.85)). + +### Connection minutes cost + +Connections are charged for every million minutes of activity: + +| Connection time (minutes) | Price (per million minutes) | +| ------------------------- | ---------------------------- | +| First 10 million | $1.00 | +| Next 90 million | $0.95 | +| Next 900 million | $0.85 | +| Next 4 billion | $0.75 | +| Next 10 billion | $0.65 | +| Over 15 billion | $0.60 | + +For example: + +* if you use 7 million minutes of connection time, this would cost $8.00 (7 x 1.00). +* if you use 130 million minutes of connection time, this would cost $121 ((10 x 1.00) + (90 x 0.95) + (30 x 0.85)). + +## Limits + +There are limits on certain operations within Ably. This is to protect against deliberate or accidental abuse of your application, and to provide a level of protection on your consumption costs if abuse does occur. + +Whilst hitting a limit should be an infrequent occurrence if you're on the correct package, it's important to be aware of the different types of limits that exist. + +Find out more about [limits](/docs/pricing/limits). + +## Billing + +It's important to understand how, and when, you're billed. + +Invoices are issued in arrears on the first of each month. They include your base package price, plus your consumption of messages, and channel and connection minutes used in the previous month. + +Find out more about [billing](/docs/pricing/billing). diff --git a/src/pages/docs/platform/pricing/limits.mdx b/src/pages/docs/platform/pricing/limits.mdx new file mode 100644 index 0000000000..6964750e0d --- /dev/null +++ b/src/pages/docs/platform/pricing/limits.mdx @@ -0,0 +1,131 @@ +--- +title: Limits +meta_description: "The limits associated with each Ably package." +redirect_from: + - /docs/general/limits + - /docs/pricing/limits +--- + +Ably can scale effortlessly as your business grows. + +Limits exist in order to minimize the impact on service due to accidental or deliberate abuse of your applications. They also provide a level of protection to your consumption rates if abuse does occur. If you're on the correct package for your applications and use case, then hitting a limit should be an infrequent occurrence. + +## Limit types + +Some limits are tied to a package type. For example, the length of time that you can store messages for is dictated by which package you are on, from 1 day on a Free package up to 1 year on an Enterprise package. + +Other limits are more technical in nature. For example, the number of channels that a single realtime connection can be attached to, or the rate at which a single connection can publish messages. + +Others still are precautions against high message consumption. For example, the number of clients that can be [present](/docs/presence-occupancy/presence) on a single channel. This is because clients can change state very rapidly and the number of messages generated can be high. An example of this would be 200 clients subscribed to presence events on a channel and all of them join and leave the presence set within a few minutes. This would result in the following messages: + +* 200 presence messages published for the enter event. +* 200 x 200 (40,000) messages subscribed to for the enter events. +* 200 presence messages published for the leave event. +* 200 x 200 (40,000) presence messages subscribed to for the leave event. + +This highlights the potential for 80,400 messages to be sent in a very short space of time on a single channel. There are options for [mitigating](/docs/presence-occupancy/presence#present-no-subscribe) this such as utilizing [server-side batching](/docs/channels#server-side-batching). Contact Ably to discuss increasing this limit if you think it's necessary for your use case. + +### View limits + +1. Log in to your [account](https://ably.com/login). +2. Select **Limits** from the **Account** menu. + +To view any limits that you have previously hit, click **view recent limits notifications**. + +## Exceeding a limit + +If you exceed the limits of your package then it likely means that your app is performing well, and Ably won't penalize your success by blocking usage for the majority of limits. Normal service will continue to function beyond the limit, up to a point, for certain limits. However, Ably will contact you to let you know that you need to upgrade your package to accommodate your increased usage. + +Limits will come into force either because there isn't any buffer on them, or because you have exceeded the buffer. Exceeding the limit depends on the limit: + +* **Count-based limits**: only a set amount of resources can be in use simultaneously. This means that any usage in excess of that limit will be restricted until existing resources are removed, such as the number of concurrent connections, or concurrent channels. +* **Rate-based limits**: the rate at which resources can be used, expressed as their frequency per second. Usage in excess of a rate limit can be rejected locally, such as a publisher trying to publish at a rate in excess of the publish rate per channel. The publisher will have any publish attempts in excess of this rate rejected and have an error code returned. Other rate limits apply rate suppression across your account when exceeded. For example, if the limit for publishing messages into a queue is exceeded by twice the rate, then each message will have a 50% chance of being rejected. The suppression probability is continuously updated based on the publishing rate. + + + +Email notifications are sent out when you are nearing a limit, as well as when you have exceeded it. You will also see these notifications in your [account dashboard](https://ably.com/accounts/any) and can view any limits that you have previously exceeded. + +## Application limits + +Application limits relate to the quantity of resources that can be created per account. + +| Application limit | Free | Standard | Pro | Enterprise | +| ----------------- | ---- | -------- | --- | ---------- | +| **Number of apps (per account)**

*the maximum number of applications that can be created per account*

| 100 | 100 | 100 | 100 | +| **Number of API keys (per account)**

*the maximum number of API keys that can be created per account*

| 100 | 100 | 100 | 100 | +| **Number of rules (per account)**

*the maximum number of channel rules that can be created per account*

| 100 | 100 | 100 | 100 | +| **Number of namespaces (per account)**

*the maximum number of namespaces that can be created per account*

| 100 | 100 | 100 | 100 | + +## Message limits
+ +Message limits relate to the number, rate and bandwidth of messages consumed across you account. + +| Message limit | Free | Standard | Pro | Enterprise | +| ------------- | ---- | -------- | --- | ---------- | +| **Message rate (per second)**

*the maximum rate at which messages can be published and received across your account each second*

| 500 | 2,500 | 10,000 | Unlimited | +| **Messages (per month)**

*the maximum number of messages that can be sent and received across your account each month*

| 6,000,000 | Unlimited | Unlimited | Unlimited | +| **Message count (per hour)**

*the total number of messages that can be sent across an account per hour*

| 250,000 | 5,208,000 | 20,833,000 | Unlimited | +| **Message bandwidth rate (per second, KiB)**

*the maximum rate at which data can be transferred through messages each second, in KiB*

| 2,384 | 11,921 | 47,684 | Unlimited | +| **Message bandwidth (hourly, GiB)**

*the maximum amount of data that can be transferred through messages each hour, in GiB*

| 1.2 | 24.8 | 99.3 | Unlimited | +| **Message bandwidth (monthly, GiB)**

*the maximum amount of data that can be transferred through messages each month, in GiB*

| 28.6 | 1,192 | 4,768 | Unlimited | +| **Max message size (KiB)**

*the maximum size of a single published message*

| 64 | 64 | 256 | 256 | +| **Default history TTL (hours)**

*the default time that a message or presence message can be retrieved from history*

| 24 | 72 | 72 | 72 | +| **Max history / storage TTL (days)**

*the maximum time that a message or presence message can be retrieved from history*

| 1 | 30 | 365 | 365 | + +## Channel limits
+ +Channel limits relate to the number, rate and membership of [channels](/docs/channels) on your account. + +| Channel limit | Free | Standard | Pro | Enterprise | +| ------------- | ---- | -------- | --- | ---------- | +| **Concurrent channels**

*the maximum number of channels that are active simultaneously at any point*

| 200 | 10,000 | 50,000 | Unlimited | +| **Default last message on channel TTL (days)**

*the default period that the last message on a channel is stored for, when enabled*

| 1 | 30 | 365 | 365 | +| **Channel creation rate (per second)**

*the maximum rate at which channels can be created across an account*

| 42 | 250 | 500 | Custom | +| **Message publish rate per channel (per second)**

*the maximum rate at which messages can be published for each channel*

| 50 | 50 | 50 | 50 | +| **Presence members per channel**

*the maximum number of clients that can be simultaneously present on a channel*

| 200 | 200 | 200 | 200 | +| **Presence members per channel with [server-side batching](/docs/messages/batch#server-side) enabled**

*the maximum number of clients that can be simultaneously present on a channel when server-side batching is enabled*

| 200 | 5,000 | 10,000 | 20,000 | +| **Objects per channel**

*the maximum number of objects that can be stored on a channel*

| 100 | 100 | 100 | 100 | + +## Connection limits
+ +Connection limits relate to the realtime [connections](/docs/connect) made to Ably from your account. + +| Connection limit | Free | Standard | Pro | Enterprise | +| ---------------- | ---- | -------- | --- | ---------- | +| **Concurrent connections**

*the maximum number of realtime clients connected to Ably simultaneously at any point*

| 200 | 10,000 | 50,000 | Unlimited | +| **New connection rate (per second)**

*the maximum rate at which new realtime connections can be made to Ably across an account*

| 42 | 250 | 500 | Custom | +| **Inbound message rate (per second)**

*the maximum rate at which messages can be published by a realtime connection*

| 50 | 50 | 50 | 50 | +| **Outbound message rate (per second)**

*the maximum rate at which messages can be received by a realtime connection*

| 50 | 50 | 50 | 50 | +| **Number of channels per connection**

*the maximum number of channels that each connection can be attached to*

| 200 | 200 | 200 | 200 | +| **Connection state TTL**

*the maximum duration that Ably will preserve the state of a dropped connection for*

| 2 mins | 2 mins | 2 mins | 2 mins | + +## Integration limits
+ +Integration limits relate to the rate and concurrency of [webhooks](/docs/integrations/webhooks), [queues](/docs/integrations/queues) and [Firehose](/docs/integrations/streaming). + +| Integration limit | Free | Standard | Pro | Enterprise | +| ----------------- | ---- | -------- | --- | ---------- | +| **Integration rate (per second)**

*the maximum rate at which integrations can be executed, or streamed*

| 250 | 250 | 1,000 | Custom | +| **Integration concurrency (Google Functions and Azure)**

*the maximum number of integrations that can run at the same time*

| 25 | 25 | 100 | Custom | +| **Webhook batch size**

*the maximum number of webhook events that can be sent per batch*

| 50 | 100 | 100 | 100 | +| **Webhook batch concurrency**

*the maximum number of webhook batches that can be processed at the same time*

| 1 | 1 | 1 | 1 | +| **Max number of queues (per account)**

*the maximum number of queues that can be created per account*

| 5 | 10 | 50 | 100+ | +| **Max queue length**

*the maximum number of messages that can be stored in queues whilst waiting to be consumed. This value is shared between all queues in an account*

| 50,000 | 50,000 | 50,000 | 50,000 | +| **Queue publish rate (per second)**

*the maximum rate at which messages can be published to a queue*

| 250 | 250 | 1,000 | Custom | +| **Queue TTL (hours)**

*the maximum time that a message is stored in a queue for, before being transferred to the dead letter queue*

| 24 | 24 | 24 | 24 | + +## API limits
+ +API request limits are the maximum number of [REST API](/docs/api/rest-api) requests, [Control API](/docs/account/control-api) requests and [token requests](/docs/auth/token) that can be made to Ably. + +| API request limit | Free | Standard | Pro | Enterprise | +| ----------------- | ---- | -------- | --- | ---------- | +| **HTTP API requests (per hour)**

*the maximum number of HTTP API requests that can be made to Ably per hour, excluding token requests*

| 25,000 | 521,000 | 2,083,300 | Custom | +| **HTTP API request rate (per second)**

*the maximum rate at which HTTP API requests can be made to Ably*

| 50 | 362 | 1,447 | Custom | +| **Token requests (per hour)**

*the maximum number of token requests that can be made to Ably per hour*

| 60,000 | 360,000 | 720,000 | Custom | +| **Token request rate (per second)**

*the maximum rate at which token requests can be made*

| 50 | 250 | 500 | Custom | +| **Control API: authenticated account requests (per hour)**

*the maximum number of requests that can be made to the Control API, per hour, from authenticated users*

| 4000 | 4000 | 4000 | 4000 | +| **Control API: authenticated access token requests (per hour)**

*the maximum number of requests that can be made to the Control API, per hour, for each access token*

| 2000 | 2000 | 2000 | 2000 | +| **Control API: unauthenticated requests (per hour)**

*the maximum number of requests that can be made to the Control API, per hour, from unauthenticated users*

| 60 | 60 | 60 | 60 | diff --git a/content/pricing/pro.textile b/src/pages/docs/platform/pricing/pro.mdx similarity index 50% rename from content/pricing/pro.textile rename to src/pages/docs/platform/pricing/pro.mdx index c60669edb4..f4ced80352 100644 --- a/content/pricing/pro.textile +++ b/src/pages/docs/platform/pricing/pro.mdx @@ -1,15 +1,18 @@ --- title: Pro package meta_description: "Explore the features and cost of Ably's Pro package." +redirect_from: + - /docs/pricing/pro --- The Pro package is for when your business is growing and you need higher limits to accommodate this. -h2(#features). Features +## Features
The Pro package includes the following limits on the key units of consumption: -|_. Limit |_. Pro | +| Limit | Pro | +| ----- | --- | | Message rate (per second) | 10,000 | | Messages (per month) | Unlimited | | Concurrent channels | 50,000 | @@ -18,64 +21,64 @@ The Pro package includes the following limits on the key units of consumption: Pro package users also have access to the following features: * Google and GitHub SSO -* "DataDog Lite":/docs/integrations/streaming/datadog#lite +* [DataDog Lite](/docs/integrations/streaming/datadog#lite) -h2(#pricing). Pricing and billing +## Pricing and billing The Pro package has a monthly fee of $399 plus the number of messages, and channel and connection minutes that you use on top of that. You will be billed for the previous month's consumption. Note that volume discounts reset every month. -h2(#limits ). Limits +## Limits -"Compare the limits":/docs/pricing/limits associated with each package to see those available on the Pro package. +[Compare the limits](/docs/pricing/limits) associated with each package to see those available on the Pro package. -h2(#support). Support +## Support Standard package support includes access to Ably support via email with a Service Level Agreement (SLA) of less than 1 business day for general guidance and less than 2 business hours for system impediments or system down. -h2(#free-pro). Upgrade from Free to Pro +## Upgrade from Free to Pro To upgrade your account from a Free package to a Pro package: -1. Ensure you are the "account owner":/docs/account/users. -2. Log in to your "account":https://ably.com/login and select *Billing* from the *Account* menu. +1. Ensure you are the [account owner](/docs/account/users). +2. Log in to your [account](https://ably.com/login) and select **Billing** from the **Account** menu. 3. Choose the plan you wish to upgrade to and follow the instructions. Upgrades take effect immediately. Note that your first invoice will be issued at the start of the following calendar month. It covers consumption from the point of upgrade up until the end of that month. All subsequent invoices will follow the same pattern of billing for the previous month's consumption. The base package price will be charged pro-rata from the point in the month that you upgraded. Once you upgrade to a Pro, your consumption is counted from that point onwards. For example, if you upgrade in the middle of the month, you are charged for the first message you send after upgrading, not after the 6,000,000 messages allowed on the Free package. -h2(#standard-pro). Upgrade from Standard to Pro +## Upgrade from Standard to Pro To upgrade your account from a Standard package to a Pro package: -1. Ensure you are the "account owner":/docs/account/users. -2. Log in to your "account":https://ably.com/login and select *Billing* from the *Account* menu. +1. Ensure you are the [account owner](/docs/account/users). +2. Log in to your [account](https://ably.com/login) and select **Billing** from the **Account** menu. 3. Choose the plan you wish to upgrade to and follow the instructions. Upgrades take effect immediately. The base package price will be charged pro-rata from the point in the month that you upgraded. This is true for the current Standard package base price, as well as the upgraded Pro package base price. -h2(#pro-enterprise). Upgrade from Pro to Enterprise +## Upgrade from Pro to Enterprise -To upgrade your account from a Pro package, "contact us":https://ably.com/contact?cta=enterprise_package to discuss "Enterprise package":/docs/pricing/enterprise options. +To upgrade your account from a Pro package, [contact us](https://ably.com/contact?cta=enterprise_package) to discuss [Enterprise package](/docs/pricing/enterprise options). -h2(#downgrade). Downgrade +## Downgrade To downgrade your account from a Pro package: -1. Ensure you are the "account owner":/docs/account/users. -2. Log in to your "account":https://ably.com/login and select *Billing* from the *Account* menu. -3. Click the *Downgrade* button. +1. Ensure you are the [account owner](/docs/account/users). +2. Log in to your [account](https://ably.com/login) and select **Billing** from the **Account** menu. +3. Click the **Downgrade** button. -If you downgrade to the "Free package":/docs/pricing/free, you will remain on the Pro package with its limits and benefits until the end of your billing cycle (on the 1st of the month). At the start of the following month, you will receive a final invoice that includes the full package fee for the previous month. +If you downgrade to the [Free package](/docs/pricing/free), you will remain on the Pro package with its limits and benefits until the end of your billing cycle (on the 1st of the month). At the start of the following month, you will receive a final invoice that includes the full package fee for the previous month. -If you downgrade to the "Standard package":/docs/pricing/standard, you will remain on the Pro package with its limits and benefits until the end of your billing cycle (on the 1st of the month). At the start of the following month, you will receive a final invoice that includes the full package fee for the previous month. +If you downgrade to the [Standard package](/docs/pricing/standard), you will remain on the Pro package with its limits and benefits until the end of your billing cycle (on the 1st of the month). At the start of the following month, you will receive a final invoice that includes the full package fee for the previous month. -h2(#close). Close your account +## Close your account -You can "close your account":/docs/account/users#close at any time by first downgrading to the Free package. +You can [close your account](/docs/account/users#close) at any time by first downgrading to the Free package. - + diff --git a/content/pricing/standard.textile b/src/pages/docs/platform/pricing/standard.mdx similarity index 51% rename from content/pricing/standard.textile rename to src/pages/docs/platform/pricing/standard.mdx index 1162da3f37..61b581be30 100644 --- a/content/pricing/standard.textile +++ b/src/pages/docs/platform/pricing/standard.mdx @@ -1,15 +1,18 @@ --- title: Standard package meta_description: "Explore the features and cost of Ably's Standard package." +redirect_from: + - /docs/pricing/standard --- The Standard package is for when you're ready to start rolling out your application into production. -h2(#features). Features +## Features The Standard package includes the following limits on the key units of consumption: -|_. Limit |_. Standard | +| Limit | Standard | +| ----- | -------- | | Message rate (per second) | 2,500 | | Messages (per month) | Unlimited | | Concurrent channels | 10,000 | @@ -18,62 +21,62 @@ The Standard package includes the following limits on the key units of consumpti Standard package users also have access to the following features: * Google and GitHub SSO -* "DataDog Lite":/docs/integrations/streaming/datadog#lite (30 day trial) +* [DataDog Lite](/docs/integrations/streaming/datadog#lite) (30 day trial) -h2(#pricing). Pricing and billing +## Pricing and billing The Standard package has a monthly fee of $29 plus the number of messages, and channel and connection minutes that you use on top of that. You will be billed for the previous month's consumption. Note that volume discounts reset every month. -h2(#limits). Limits +## Limits -"Compare the limits":/docs/pricing/limits associated with each package to see those available on the Standard package. +[Compare the limits](/docs/pricing/limits) associated with each package to see those available on the Standard package. -h2(#support). Support +## Support Standard package support includes access to Ably support via email with a Service Level Agreement (SLA) of less than 1 business day for general guidance and for system impediments or system down. -h2(#free-standard). Upgrade from Free to Standard +## Upgrade from Free to Standard To upgrade your account from a Free package to a Standard package: -1. Ensure you are the "account owner":/docs/account/users. -2. Log in to your "account":https://ably.com/login and select *Billing* from the *Account* menu. +1. Ensure you are the [account owner](/docs/account/users). +2. Log in to your [account](https://ably.com/login) and select **Billing** from the **Account** menu. 3. Choose the plan you wish to upgrade to and follow the instructions. Upgrades take effect immediately. Note that your first invoice will be issued at the start of the following calendar month. It covers consumption from the point of upgrade up until the end of that month. All subsequent invoices will follow the same pattern of billing for the previous month's consumption. The base package price will be charged pro-rata from the point in the month that you upgraded. Once you upgrade to a Standard, your consumption is counted from that point onwards. For example, if you upgrade in the middle of the month, you are charged for the first message you send after upgrading, not after the 6,000,000 messages allowed on the Free package. -h2(#standard-pro). Upgrade from Standard to Pro +## Upgrade from Standard to Pro To upgrade your account from a Standard package to a Pro package: -1. Ensure you are the "account owner":/docs/account/users. -2. Log in to your "account":https://ably.com/login and select *Billing* from the *Account* menu. +1. Ensure you are the [account owner](/docs/account/users). +2. Log in to your [account](https://ably.com/login) and select **Billing** from the **Account** menu. 3. Choose the plan you wish to upgrade to and follow the instructions. Upgrades take effect immediately. -The base package price will be charged pro-rata from the point in the month that you upgraded. This is true for the current Standard package base price, as well as the upgraded "Pro package":/docs/pricing/pro base price. +The base package price will be charged pro-rata from the point in the month that you upgraded. This is true for the current Standard package base price, as well as the upgraded [Pro package](/docs/pricing/pro) base price. -h2(#standard-enterprise). Upgrade from Standard to Enterprise +## Upgrade from Standard to Enterprise -To upgrade your account from a Standard package to an "Enterprise package":/docs/pricing/enterprise, "contact us":https://ably.com/contact?cta=enterprise_package to discuss your options. +To upgrade your account from a Standard package to an [Enterprise package](/docs/pricing/enterprise), [contact us](https://ably.com/contact?cta=enterprise_package) to discuss your options. -h2(#downgrade). Downgrade +## Downgrade To downgrade your account from a Standard package to Free: -1. Ensure you are the "account owner":/docs/account/users. -2. Log in to your "account":https://ably.com/login and select *Billing* from the *Account* menu. -3. Click the *Downgrade* button. +1. Ensure you are the [account owner](/docs/account/users). +2. Log in to your [account](https://ably.com/login) and select **Billing** from the **Account** menu. +3. Click the **Downgrade** button. -If you downgrade to the "Free package":/docs/pricing/free, you will remain on the Standard package with its limits and benefits until the end of your billing cycle (on the 1st of the month). At the start of the following month, you will receive a final invoice that includes the full package fee for the previous month. +If you downgrade to the [Free package](/docs/pricing/free), you will remain on the Standard package with its limits and benefits until the end of your billing cycle (on the 1st of the month). At the start of the following month, you will receive a final invoice that includes the full package fee for the previous month. -h2(#close). Close your account +## Close your account -You can "close your account":/docs/account/users#close at any time by first downgrading to the Free package. +You can [close your account](/docs/account/users#close) at any time by first downgrading to the Free package. - + From c45b43fd5422ad743aa08f74692352c46e6d63c2 Mon Sep 17 00:00:00 2001 From: Mark Hulbert <39801222+m-hulbert@users.noreply.github.com> Date: Fri, 11 Jul 2025 10:57:34 +0200 Subject: [PATCH 06/14] Update link references to new pricing section location --- content/account/control-api.textile | 2 +- content/account/index.textile | 6 +- content/account/organizations.textile | 2 +- content/account/users.textile | 4 +- content/api/realtime-sdk/channels.textile | 4 +- content/api/rest-api.textile | 2 +- content/api/rest-sdk/channels.textile | 4 +- content/channels/options/deltas.textile | 2 +- content/connect/index.textile | 4 +- content/errors/codes.textile | 38 +++++----- content/messages/batch.textile | 4 +- content/metadata-stats/stats.textile | 76 +++++++++---------- content/presence-occupancy/presence.textile | 4 +- content/protocols/pubnub.textile | 2 +- content/pub-sub/advanced.textile | 2 +- src/data/nav/platform.ts | 16 ++-- src/pages/docs/liveobjects/storage.mdx | 8 +- .../docs/platform/architecture/index.mdx | 2 +- src/pages/docs/platform/pricing/billing.mdx | 2 +- .../docs/platform/pricing/enterprise.mdx | 2 +- src/pages/docs/platform/pricing/faqs.mdx | 16 ++-- src/pages/docs/platform/pricing/free.mdx | 8 +- src/pages/docs/platform/pricing/index.mdx | 12 +-- src/pages/docs/platform/pricing/pro.mdx | 8 +- src/pages/docs/platform/pricing/standard.mdx | 8 +- 25 files changed, 119 insertions(+), 119 deletions(-) diff --git a/content/account/control-api.textile b/content/account/control-api.textile index c07e6c3d84..646e1387f1 100644 --- a/content/account/control-api.textile +++ b/content/account/control-api.textile @@ -33,7 +33,7 @@ In this use case, Control API is used to provision a sample app for review and t In order to use the Control API you must first create an access token in the "Ably dashboard":https://ably.com/accounts/any. You can then use the Control API to manage many account functions without having to interact with the dashboard. -Note that the Control API has certain "limits":/docs/pricing/limits#api on the number of API calls that can be made per hour. +Note that the Control API has certain "limits":/docs/platform/pricing/limits#api on the number of API calls that can be made per hour. h2(#open-api). OpenAPI document diff --git a/content/account/index.textile b/content/account/index.textile index e34cea5803..b92ee3f6d0 100644 --- a/content/account/index.textile +++ b/content/account/index.textile @@ -14,7 +14,7 @@ Begin by "logging":https://ably.com/login in to Ably through your browser. Once h3. Settings -Manage your Ably account settings, including authentication, "billing":/docs/pricing/billing, and account ownership: +Manage your Ably account settings, including authentication, "billing":/docs/platform/pricing/billing, and account ownership: * Use your account's unique identifier (Account ID) when contacting support. * Account owners can require all users to set up two-factor authentication (2FA) for added security. @@ -23,7 +23,7 @@ Manage your Ably account settings, including authentication, "billing":/docs/pri h3. Billing -Manage your "billing":/docs/pricing/billing and package settings to scale your services: +Manage your "billing":/docs/platform/pricing/billing and package settings to scale your services: * Review your current package to assess if it fits your needs, whether free, pay-as-you-go, or committed use. * Ensure your billing information is up to date, including company name, billing email (optional), address, international phone number, and timezone. @@ -31,7 +31,7 @@ Manage your "billing":/docs/pricing/billing and package settings to scale your s h3. Limits -Understand and manage your package "limits":/docs/pricing/limits by tracking usage across messages, data, connections, and channels: +Understand and manage your package "limits":/docs/platform/pricing/limits by tracking usage across messages, data, connections, and channels: * Limits are applied to prevent service disruption and vary by package. * Limits can be time-based, quantity-based, or rate-based, and they may apply either per connection/channel or across the entire account. diff --git a/content/account/organizations.textile b/content/account/organizations.textile index e34d89cecd..09592bb4d4 100644 --- a/content/account/organizations.textile +++ b/content/account/organizations.textile @@ -11,7 +11,7 @@ Organizations enable the "primary":#primary account to assign and adjust the rol You can separate accounts within an organization to create isolated environments, such as production, staging, and development. Assign each environment a "package":/docs/pricing#packages that meets its specific needs. For example, production may need high capacity with an *Enterprise* package, staging might use a *Standard* package, and development a *Free* package. h2(#primary). Primary account diff --git a/content/account/users.textile b/content/account/users.textile index 37c20916b4..b24f916a1b 100644 --- a/content/account/users.textile +++ b/content/account/users.textile @@ -30,7 +30,7 @@ User roles have the following permissions: | Manage app configuration | - | - | ✓ | ✓ | | Manage app settings | - | - | ✓ | ✓ | | Create apps | - | - | ✓ | ✓ | -| Receive "limit notifications":/docs/pricing/limits | - | - | ✓ | ✓ | +| Receive "limit notifications":/docs/platform/pricing/limits | - | - | ✓ | ✓ | | Configure "single sign-on":/docs/account/sso | - | - | - | ✓ | | Enforce "2FA":/docs/account/2fa#enforce | - | - | - | ✓ | | View invoices | - | ✓ | - | ✓ | @@ -74,7 +74,7 @@ To remove a user from your account: h2(#close). Close your account -You can close your account at any time by downgrading to the "Free package":/docs/pricing/free. Use the following steps to close your account: +You can close your account at any time by downgrading to the "Free package":/docs/platform/pricing/free. Use the following steps to close your account: * Log in to your "account":https://ably.com/accounts/any. * Ensure you are the account "owner":/docs/account/users#roles. diff --git a/content/api/realtime-sdk/channels.textile b/content/api/realtime-sdk/channels.textile index e60eb851da..58ff0933fe 100644 --- a/content/api/realtime-sdk/channels.textile +++ b/content/api/realtime-sdk/channels.textile @@ -179,8 +179,8 @@ blang[jsall]. The entire @messages@ array is published atomically. This means that: * Either they will all be successfully published or none of them will -* The "max message size":/docs/pricing/limits#message limit applies to the total size of all messages in the array -* The publish will only count as a single message for the purpose of "per-channel rate limit":/docs/pricing/limits#message +* The "max message size":/docs/platform/pricing/limits#message limit applies to the total size of all messages in the array +* The publish will only count as a single message for the purpose of "per-channel rate limit":/docs/platform/pricing/limits#message * If you are using client-specified message IDs, "they must conform to certain restrictions":https://faqs.ably.com/client-specified-message-id-restrictions-for-multiple-messages-published-atomically h4. Parameters diff --git a/content/api/rest-api.textile b/content/api/rest-api.textile index 4c9e2f2318..454a774b4b 100644 --- a/content/api/rest-api.textile +++ b/content/api/rest-api.textile @@ -1358,7 +1358,7 @@ bc[text]. { * @@ is a single channel name, or an array of up to 100 channel names, expressed as strings. * @@ is a single message, or an array of messages. -The maximum size of each request body must be less than 2MiB and the total size of all messages in a @messages@ array must be less than the "message size limit":/docs/pricing/limits#message (64kiB by default for paid accounts, 16kiB for free accounts). +The maximum size of each request body must be less than 2MiB and the total size of all messages in a @messages@ array must be less than the "message size limit":/docs/platform/pricing/limits#message (64kiB by default for paid accounts, 16kiB for free accounts). Sample request, containing multiple @BatchSpec@ objects in an array: diff --git a/content/api/rest-sdk/channels.textile b/content/api/rest-sdk/channels.textile index f0038c19ce..18bbcfaa98 100644 --- a/content/api/rest-sdk/channels.textile +++ b/content/api/rest-sdk/channels.textile @@ -128,8 +128,8 @@ Publish several messages on this channel. A callback may The entire @messages@ array is published atomically. This means that: * Either they will all be successfully published or none of them will -* The "max message size":/docs/pricing/limits#message limit applies to the total size of all messages in the array -* The publish will only count as a single message for the purpose of "per-channel rate limit":/docs/pricing/limits#message +* The "max message size":/docs/platform/pricing/limits#message limit applies to the total size of all messages in the array +* The publish will only count as a single message for the purpose of "per-channel rate limit":/docs/platform/pricing/limits#message * If you are using client-specified message IDs for publish idempotency, "they must conform to certain restrictions":https://faqs.ably.com/client-specified-message-id-restrictions-for-multiple-messages-published-atomically h4. Parameters diff --git a/content/channels/options/deltas.textile b/content/channels/options/deltas.textile index 1421a0881d..abd2ed78ef 100644 --- a/content/channels/options/deltas.textile +++ b/content/channels/options/deltas.textile @@ -138,7 +138,7 @@ If a subscriber has a delta subscription and the channel in question experiences Note that a channel subscriber can experience a discontinuity in the sequence of messages it receives on a given channel for the following reasons: * The connection can drop, and there will be a discontinuity if the client is unable to reconnect within a two-minute window that preserves "connection continuity":/docs/connect/states. -* The outbound connection may become "rate limited":/docs/pricing/limits, which causes some messages to be dropped. +* The outbound connection may become "rate limited":/docs/platform/pricing/limits, which causes some messages to be dropped. * There may have been an internal error in the Ably system leading to the server being unable to preserve continuity on the channel. In these cases, the service indicates the discontinuity to the client, together with the reason, and this is usually visible to the subscriber in a channel @UPDATE@ event. diff --git a/content/connect/index.textile b/content/connect/index.textile index 08bd297adf..9ef679326c 100644 --- a/content/connect/index.textile +++ b/content/connect/index.textile @@ -166,7 +166,7 @@ The 15 second interval between heartbeats is used to strike a balance between op The interval between heartbeats can be customized if your app requires increased battery preservation or to identify dropped connections more quickly. Set a value between 5000 and 1800000 milliseconds (5 seconds and 30 minutes) using the @heartbeatInterval@ parameter within the @transportParams@ property of the "@clientOptions@":/docs/api/realtime-sdk#client-options object. -Using a higher @heartbeatInterval@ can increase the time taken for the Ably service and the client itself to identify a connection has dropped when an abrupt disconnect occurs. The number of "concurrent connections":/docs/pricing/limits#connection may also appear higher as it can take longer to terminate dropped connections. Although @heartbeatInterval@ can be set as high as 30 minutes, Ably does not recommend setting it this high. +Using a higher @heartbeatInterval@ can increase the time taken for the Ably service and the client itself to identify a connection has dropped when an abrupt disconnect occurs. The number of "concurrent connections":/docs/platform/pricing/limits#connection may also appear higher as it can take longer to terminate dropped connections. Although @heartbeatInterval@ can be set as high as 30 minutes, Ably does not recommend setting it this high. You can also call "@ping()@":/docs/api/realtime-sdk/connection#ping to send a heartbeat ping to Ably, which can be useful for measuring the true round-trip latency to the Ably server. @@ -209,7 +209,7 @@ AblyRealtime ably = new AblyRealtime(options); h2(#close). Close a connection -A connection to Ably should be closed once it is no longer needed. Note that there is a 2 minute delay before a connection is closed, if the "@close()@":/docs/api/realtime-sdk/connection#close method hasn't been explicitly called. This is important to consider in relation to the number of "concurrent connections":/docs/pricing/limits#connection to your account. +A connection to Ably should be closed once it is no longer needed. Note that there is a 2 minute delay before a connection is closed, if the "@close()@":/docs/api/realtime-sdk/connection#close method hasn't been explicitly called. This is important to consider in relation to the number of "concurrent connections":/docs/platform/pricing/limits#connection to your account. The following code sample explicitly closes the connection to Ably by calling the @close()@ method and prints the message @Closed the connection to Ably@: diff --git a/content/errors/codes.textile b/content/errors/codes.textile index 660b324146..7e138168c8 100644 --- a/content/errors/codes.textile +++ b/content/errors/codes.textile @@ -73,7 +73,7 @@ Examples of this error are when: h2(#40009). 40009: Maximum message length exceeded -This error occurs when the message being published exceeds the maximum size allowed set by the "limits":/docs/pricing/limits#app-limits for your current "package":/docs/pricing#packages. +This error occurs when the message being published exceeds the maximum size allowed set by the "limits":/docs/platform/pricing/limits#app-limits for your current "package":/docs/pricing#packages. h2(#40010). 40010: Invalid channel name @@ -262,15 +262,15 @@ An example of this error is when no "API key":/docs/auth#api-keys or "token":/do h2(#40111). 40111: Connection limits exceeded -This error occurs when the peak "connection limit":/docs/pricing/limits#connection for your account has been exceeded, preventing new connections from being established until existing ones disconnect. +This error occurs when the peak "connection limit":/docs/platform/pricing/limits#connection for your account has been exceeded, preventing new connections from being established until existing ones disconnect. h2(#40112). 40112: Account blocked (message limits exceeded) -This error occurs when your account has exceeded the allocated "message limit":/docs/pricing/limits#message based on your "package":/docs/pricing#packages. Once this limit is reached, further message publishing is blocked. +This error occurs when your account has exceeded the allocated "message limit":/docs/platform/pricing/limits#message based on your "package":/docs/pricing#packages. Once this limit is reached, further message publishing is blocked. h2(#40114). 40114: Account-wide peak channel limit exceeded -This error occurs when your account has exceeded the concurrent "channel limit":/docs/pricing/limits#channel, preventing additional channels from being created. +This error occurs when your account has exceeded the concurrent "channel limit":/docs/platform/pricing/limits#channel, preventing additional channels from being created. Examples of this error are when the application attempts to open more channels than the account allows, causing new channel creation to be blocked. Also, during development, an implementation error or bug causes unintended channel creation, leading to the limit being reached. @@ -278,15 +278,15 @@ Examples of this error are when the application attempts to open more channels t h2(#40115). 40115: Account restricted (request limit exceeded) -This error occurs when your account has exceeded the allocated "limits":/docs/pricing/limits based on your "package":/docs/pricing#packages. +This error occurs when your account has exceeded the allocated "limits":/docs/platform/pricing/limits based on your "package":/docs/pricing#packages. h2(#40125). 40125: Maximum number of rules per application exceeded -This error occurs when the application has reached the maximum number of "integration rules":/docs/integrations set by the "limits":/docs/pricing/limits#app-limits for your current package. +This error occurs when the application has reached the maximum number of "integration rules":/docs/integrations set by the "limits":/docs/platform/pricing/limits#app-limits for your current package. h2(#40127). 40127: Maximum number of keys per application exceeded -This error occurs when the application has reached the maximum number of "API keys":/docs/account/app/api set by the "limits":/docs/pricing/limits#app-limits for your current package. +This error occurs when the application has reached the maximum number of "API keys":/docs/account/app/api set by the "limits":/docs/platform/pricing/limits#app-limits for your current package. h2(#40131). 40131: Key revoked @@ -394,7 +394,7 @@ By default, Ably apps require "TLS":/docs/account/app/settings#channel-rule-conf h2(#40330). 40330: Unable to activate account due to placement constraint (unspecified) -This error occurs when an app belonging to a dedicated (private) "cluster":/docs/platform-customization#dedicated-and-isolated-clusters is accessed using an incorrect endpoint. "Enterprise":/docs/pricing/enterprise customers with private clusters receive "custom":/docs/platform-customization#setting-up-a-custom-environment environment endpoints specific to their deployment. +This error occurs when an app belonging to a dedicated (private) "cluster":/docs/platform-customization#dedicated-and-isolated-clusters is accessed using an incorrect endpoint. "Enterprise":/docs/platform/pricing/enterprise customers with private clusters receive "custom":/docs/platform-customization#setting-up-a-custom-environment environment endpoints specific to their deployment. An example of this error is when an app configured for a private cluster tries to connect via the default global endpoint. @@ -402,7 +402,7 @@ An example of this error is when an app configured for a private cluster tries t h2(#40331). 40331: Unable to activate account due to placement constraint (incompatible environment) -This error occurs when an app that belongs to a dedicated (private) "cluster":/docs/platform-customization#dedicated-and-isolated-clusters is accessed using an incorrect URL. This often happens when the correct environment is not specified when initializing a client library. "Enterprise":/docs/pricing/enterprise customers with private clusters receive "custom":/docs/platform-customization#setting-up-a-custom-environment environment endpoints specific to their deployment. +This error occurs when an app that belongs to a dedicated (private) "cluster":/docs/platform-customization#dedicated-and-isolated-clusters is accessed using an incorrect URL. This often happens when the correct environment is not specified when initializing a client library. "Enterprise":/docs/platform/pricing/enterprise customers with private clusters receive "custom":/docs/platform-customization#setting-up-a-custom-environment environment endpoints specific to their deployment. If a request arrives at an unexpected dedicated cluster or incorrect region, the account in that scope may be disabled, triggering this error. @@ -436,7 +436,7 @@ Examples of this error include: h2(#42910). 42910: Rate limit exceeded; request rejected -This error occurs when a "limit":/docs/pricing/limits on your account has been reached, preventing further requests until the limit resets. The duration of the limit depends on the type of rate limit: +This error occurs when a "limit":/docs/platform/pricing/limits on your account has been reached, preventing further requests until the limit resets. The duration of the limit depends on the type of rate limit: * Instantaneous rate limits typically last up to six seconds before allowing message publishing to resume. * Other limits may apply on an hourly or monthly basis. @@ -459,7 +459,7 @@ scope = channel:[YOUR APP ID]:[YOUR CHANNEL] h2(#42911). 42911: Maximum account-wide instantaneous messages rate exceeded -This error occurs when the number of "messages":/docs/pricing/limits#message sent per second exceeds the limit imposed on an account. To maintain service reliability for all users, Ably enforces usage limits at different levels, including monthly, hourly, and per-second thresholds. +This error occurs when the number of "messages":/docs/platform/pricing/limits#message sent per second exceeds the limit imposed on an account. To maintain service reliability for all users, Ably enforces usage limits at different levels, including monthly, hourly, and per-second thresholds. h2(#42912). 42912: Channel iteration call already in progress @@ -472,7 +472,7 @@ This error occurs when multiple concurrent "metadata REST requests":/docs/metada h2(#42922). 42922: Rate limit exceeded; too many requests -This error occurs when a client has made too many requests within a 5-minute time window, causing the request to be rejected. The "limit":/docs/pricing/limits#hitting remains in effect for up to 30 seconds but may persist longer if request volume remains above the threshold from the same IP address. +This error occurs when a client has made too many requests within a 5-minute time window, causing the request to be rejected. The "limit":/docs/platform/pricing/limits#hitting remains in effect for up to 30 seconds but may persist longer if request volume remains above the threshold from the same IP address. This rate limit is in place to protect the Ably platform and is not expected during normal use. @@ -619,13 +619,13 @@ This error occurs when the client library fails to obtain a token using the clie h2(#80020). 80020: Continuity loss due to maximum subscribe message rate exceeded -This error occurs when a client exceeds the "outbound":/docs/pricing/limits#connection subscribe message rate on a realtime connection. +This error occurs when a client exceeds the "outbound":/docs/platform/pricing/limits#connection subscribe message rate on a realtime connection. *Resolution*: The subscriber will receive an @UPDATE@ "channel state change":/docs/api/realtime-sdk/channels#channel-state-change event, indicating that continuity is lost. Use the "@resume@":/docs/connect/states#resume flag to determine whether to recover missing messages or handle the failure accordingly. h2(#80021). 80021: Max new connections rate exceeded -This error occurs when the maximum allowed rate of new connections for an account has been "exceeded":/docs/pricing/limits#hitting. +This error occurs when the maximum allowed rate of new connections for an account has been "exceeded":/docs/platform/pricing/limits#hitting. h2(#80022). 80022: Unable to find connection @@ -666,11 +666,11 @@ h2(#90010). 90010: Maximum number of channels per connection exceeded This error occurs when a Realtime client "attaches":/docs/channels/states#attach to more channels than the account allows on a single connection. This happens when channels are attached but never explicitly detached, causing the limit to be reached. -*Resolution*: Review your channel "limits":/docs/pricing/limits#channel and ensure that channels are explicitly detached when no longer needed. +*Resolution*: Review your channel "limits":/docs/platform/pricing/limits#channel and ensure that channels are explicitly detached when no longer needed. h2(#90021). 90021: Max channel creation rate exceeded -This error occurs when the "maximum":/docs/pricing/limits#channel rate of channel creation has been exceeded, across an account. Until the rate returns below the limit, new channels may not be created immediately. The Ably SDK will automatically retry every 10 seconds until the request succeeds. +This error occurs when the "maximum":/docs/platform/pricing/limits#channel rate of channel creation has been exceeded, across an account. Until the rate returns below the limit, new channels may not be created immediately. The Ably SDK will automatically retry every 10 seconds until the request succeeds. h2(#91000). 91000: Unable to enter presence channel (no clientId) @@ -683,7 +683,7 @@ A client can be identified in several ways: h2(#91003). 91003: Maximum member limit exceeded -This error occurs when the "maximum":/docs/pricing/limits#hitting number of clients in the "presence":/docs/presence-occupancy/presence set for a channel has been reached, preventing additional clients from joining. +This error occurs when the "maximum":/docs/platform/pricing/limits#hitting number of clients in the "presence":/docs/presence-occupancy/presence set for a channel has been reached, preventing additional clients from joining. h2(#91005). 91005: Presence state is out of sync @@ -702,11 +702,11 @@ This error occurs when an object message used to represent "operations":/docs/li h2(#92001). 92001: Objects limit exceeded -This error occurs when the maximum number of "objects":/docs/liveobjects on the channel has exceeded the allowed "limit":/docs/pricing/limits#channel for the account or application. +This error occurs when the maximum number of "objects":/docs/liveobjects on the channel has exceeded the allowed "limit":/docs/platform/pricing/limits#channel for the account or application. *Resolution*: * Remove any unnecessary objects from the channel to free up space, for example by "removing":/docs/liveobjects/map#remove any references to them. -* "Upgrade":/docs/pricing your package to increase the "limit":/docs/pricing/limits#channel on the allowed number of objects on the channel. +* "Upgrade":/docs/pricing your package to increase the "limit":/docs/platform/pricing/limits#channel on the allowed number of objects on the channel. h2(#92002). 92002: Unable to submit operation on tombstone object diff --git a/content/messages/batch.textile b/content/messages/batch.textile index ade6b08026..c282581168 100644 --- a/content/messages/batch.textile +++ b/content/messages/batch.textile @@ -156,8 +156,8 @@ Each batch publish request can contain a single @BatchSpec@ object, or an array For each channel, the messages grouped into a single @BatchSpec@ are published atomically. This means that: * Either they will all be successfully published or none of them will -* The "max message size":/docs/pricing/limits#message limit applies to the total size of all messages in in a @BatchSpec@ -* Each @BatchSpec@ will only count as a single message for the purpose of the "per-channel rate limit":/docs/pricing/limits#message +* The "max message size":/docs/platform/pricing/limits#message limit applies to the total size of all messages in in a @BatchSpec@ +* Each @BatchSpec@ will only count as a single message for the purpose of the "per-channel rate limit":/docs/platform/pricing/limits#message So if you do not need the atomicity guarantee and might be in danger of exceeding the max message size limit, you can put each message into its own @BatchSpec@ (relative ordering will still be preserved). Conversely, if you are publishing many hundreds of small messages and are in danger of exceeding the max per-channel message rate, you group them into a fewer @BatchSpecs@. diff --git a/content/metadata-stats/stats.textile b/content/metadata-stats/stats.textile index a5d2d97f83..e0c0af0cad 100644 --- a/content/metadata-stats/stats.textile +++ b/content/metadata-stats/stats.textile @@ -380,13 +380,13 @@ All messages metrics include all messages types, such as those sent and received | messages.all.all.data | Total message size of all messages that were successfully sent, summed over all message types and transports. | | messages.all.all.uncompressedData | Total uncompressed message size, excluding delta compression. | | messages.all.all.failed | Total number of messages that failed. These are messages which did not succeed for some reason other than Ably explicitly refusing them, such as they were rejected by an external integration target, or a service issue on Ably's side. | -| messages.all.all.refused | Total number of messages that were refused by Ably. For example, due to "rate limiting":/docs/pricing/limits, malformed messages, or incorrect client permissions.| +| messages.all.all.refused | Total number of messages that were refused by Ably. For example, due to "rate limiting":/docs/platform/pricing/limits, malformed messages, or incorrect client permissions.| | messages.all.messages.count | Total message count, excluding presence and object messages. | | messages.all.messages.billableCount | Total billable message count, excluding presence and object messages. | | messages.all.messages.data | Total message size, excluding presence and object messages. | | messages.all.messages.uncompressedData | Total number of messages that failed. These are messages which did not succeed for some reason other than Ably explicitly refusing them, such as they were rejected by an external integration target, or a service issue on Ably's side. | | messages.all.messages.failed | Total number of messages excluding presence and object messages that failed. These are messages which did not succeed for some reason other than Ably explicitly refusing them, such as they were rejected by an external integration target, or a service issue on Ably's side. | -| messages.all.messages.refused | Total number of messages excluding presence and object messages that were refused by Ably. For example, due to "rate limiting":/docs/pricing/limits, malformed messages, or incorrect client permissions. | +| messages.all.messages.refused | Total number of messages excluding presence and object messages that were refused by Ably. For example, due to "rate limiting":/docs/platform/pricing/limits, malformed messages, or incorrect client permissions. | | messages.all.presence.count | Total presence message count. | | messages.all.presence.billableCount | Total billable presence message count. | | messages.all.presence.data | Total presence message size. | @@ -396,7 +396,7 @@ All messages metrics include all messages types, such as those sent and received | messages.all.objects.data | Total objects message size. | | messages.all.objects.uncompressedData | Total uncompressed objects message size, excluding delta compression. | | messages.all.messages.failed | Total number of presence messages excluding presence and object messages that failed. These are messages which did not succeed for some reason other than Ably explicitly refusing them, such as they were rejected by an external integration target, or a service issue on Ably's side. | -| messages.all.messages.refused | Total number of presence messages excluding presence and object messages that were refused by Ably. For example, due to "rate limiting":/docs/pricing/limits, malformed messages, or incorrect client permissions. | +| messages.all.messages.refused | Total number of presence messages excluding presence and object messages that were refused by Ably. For example, due to "rate limiting":/docs/platform/pricing/limits, malformed messages, or incorrect client permissions. | h3(#inbound). Inbound messages @@ -407,47 +407,47 @@ Inbound messages metrics include those messages that are sent by clients and rec | messages.inbound.realtime.all.data | Total inbound realtime message size, received by Ably from clients. | | messages.inbound.realtime.all.uncompressedData | Total uncompressed inbound realtime message size, excluding delta compression, received by Ably from clients. | | messages.inbound.realtime.all.failed | Total number of inbound realtime messages that failed. These are messages which did not succeed for some reason other than Ably explicitly refusing them, such as a service issue on Ably's side. | -| messages.inbound.realtime.all.refused | Total number of inbound realtime messages that were refused by Ably. For example, due to "rate limiting":/docs/pricing/limits, malformed messages, or incorrect client permissions. | +| messages.inbound.realtime.all.refused | Total number of inbound realtime messages that were refused by Ably. For example, due to "rate limiting":/docs/platform/pricing/limits, malformed messages, or incorrect client permissions. | | messages.inbound.realtime.messages.count | Total inbound realtime message count, excluding presence and object messages, received by Ably from clients. | | messages.inbound.realtime.messages.data | Total inbound realtime message size, excluding presence and object messages, received by Ably from clients. | | messages.inbound.realtime.messages.uncompressedData | Total uncompressed inbound realtime message size, received by Ably from clients. This excludes delta compression, and presence and object messages. | | messages.inbound.realtime.messages.failed | Total number of inbound realtime messages excluding presence and object messages that failed These are messages which did not succeed for some reason other than Ably explicitly refusing them, such as they were rejected by an external integration target, or a service issue on Ably's side. | -| messages.inbound.realtime.messages.refused | Total number of inbound realtime messages excluding presence and object messages that were refused by Ably. For example, due to "rate limiting":/docs/pricing/limits, malformed messages, or incorrect client permissions.| +| messages.inbound.realtime.messages.refused | Total number of inbound realtime messages excluding presence and object messages that were refused by Ably. For example, due to "rate limiting":/docs/platform/pricing/limits, malformed messages, or incorrect client permissions.| | messages.inbound.realtime.presence.count | Total inbound realtime presence message count, received by Ably from clients. | | messages.inbound.realtime.presence.data | Total inbound realtime presence message size, received by Ably from clients. | | messages.inbound.realtime.presence.uncompressedData | Total uncompressed inbound realtime presence message size, excluding delta compression, received by Ably from clients. | | messages.inbound.realtime.presence.failed | Total number of inbound realtime presence messages that failed. These are messages which did not succeed for some reason other than Ably explicitly refusing them, such as a service issue on Ably's side. | -| messages.inbound.realtime.presence.refused | Total number of inbound realtime presence messages that were refused by Ably. For example, due to "rate limiting":/docs/pricing/limits, malformed messages, or incorrect client permissions. | +| messages.inbound.realtime.presence.refused | Total number of inbound realtime presence messages that were refused by Ably. For example, due to "rate limiting":/docs/platform/pricing/limits, malformed messages, or incorrect client permissions. | | messages.inbound.realtime.objects.count | Total inbound realtime object message count, received by Ably from clients. | | messages.inbound.realtime.objects.data | Total inbound realtime object message size, received by Ably from clients. | | messages.inbound.realtime.objects.uncompressedData | Total uncompressed inbound realtime object message size received by Ably from clients. | | messages.inbound.realtime.objects.failed | Total number of inbound realtime object messages that failed. These are messages which did not succeed for some reason other than Ably explicitly refusing them, such as a service issue on Ably's side. | -| messages.inbound.realtime.objects.refused | Total number of inbound realtime object messages that were refused by Ably. For example, due to "rate limiting":/docs/pricing/limits, malformed messages, or incorrect client permissions. | +| messages.inbound.realtime.objects.refused | Total number of inbound realtime object messages that were refused by Ably. For example, due to "rate limiting":/docs/platform/pricing/limits, malformed messages, or incorrect client permissions. | | messages.inbound.rest.all.count | Total inbound REST message count, received by Ably from clients. | | messages.inbound.rest.all.data | Total inbound REST message size, received by Ably from clients. | | messages.inbound.rest.all.uncompressedData | Total uncompressed inbound REST message size, excluding delta compression, received by Ably from clients. | | messages.inbound.rest.all.failed | Total number of inbound REST messages that failed. These are messages which did not succeed for some reason other than Ably explicitly refusing them, such as a service issue on Ably's side. | -| messages.inbound.rest.all.refused | Total number of inbound REST messages that were refused by Ably. For example, due to "rate limiting":/docs/pricing/limits, malformed messages, or incorrect client permissions. | +| messages.inbound.rest.all.refused | Total number of inbound REST messages that were refused by Ably. For example, due to "rate limiting":/docs/platform/pricing/limits, malformed messages, or incorrect client permissions. | | messages.inbound.rest.messages.count | Total inbound REST message count, excluding presence and object messages, received by Ably from clients. | | messages.inbound.rest.messages.data | Total inbound REST message size, excluding presence and object messages, received by Ably from clients. | | messages.inbound.rest.messages.uncompressedData | Total uncompressed inbound REST message size, received by Ably from clients. This excludes delta compression, and presence and object messages. | | messages.inbound.rest.messages.failed | Total number of inbound REST messages that failed. These are messages which did not succeed for some reason other than Ably explicitly refusing them, such as a service issue on Ably's side. This excludes presence and object messages. | -| messages.inbound.rest.messages.refused | Total number of inbound REST messages that were refused by Ably. For example, due to "rate limiting":/docs/pricing/limits, malformed messages, or incorrect client permissions. This excludes presence and object messages. | +| messages.inbound.rest.messages.refused | Total number of inbound REST messages that were refused by Ably. For example, due to "rate limiting":/docs/platform/pricing/limits, malformed messages, or incorrect client permissions. This excludes presence and object messages. | | messages.inbound.rest.presence.count | Total inbound REST presence message count, received by Ably from clients. | | messages.inbound.rest.presence.data | Total inbound REST presence message size, received by Ably from clients. | | messages.inbound.rest.presence.uncompressedData | Total uncompressed inbound REST presence message size, excluding delta compression, received by Ably from clients. | | messages.inbound.rest.presence.failed | Total number of inbound REST presence messages that failed. These are messages which did not succeed for some reason other than Ably explicitly refusing them, such as a service issue on Ably's side. | -| messages.inbound.rest.presence.refused | Total number of inbound REST presence messages that were refused by Ably. For example, due to "rate limiting":/docs/pricing/limits, malformed messages, or incorrect client permissions.| +| messages.inbound.rest.presence.refused | Total number of inbound REST presence messages that were refused by Ably. For example, due to "rate limiting":/docs/platform/pricing/limits, malformed messages, or incorrect client permissions.| | messages.inbound.rest.objects.count | Total inbound REST object message count, received by Ably from clients. | | messages.inbound.rest.objects.data | Total inbound REST object message size, received by Ably from clients. | | messages.inbound.rest.objects.uncompressedData | Total uncompressed inbound REST object message size, excluding delta compression received by Ably from clients. | | messages.inbound.rest.objects.failed | Total number of inbound REST object messages that failed. These are messages which did not succeed for some reason other than Ably explicitly refusing them, such as a service issue on Ably's side. | -| messages.inbound.rest.objects.refused | Total number of inbound REST object messages that were refused by Ably. For example, due to "rate limiting":/docs/pricing/limits, malformed messages, or incorrect client permissions.| +| messages.inbound.rest.objects.refused | Total number of inbound REST object messages that were refused by Ably. For example, due to "rate limiting":/docs/platform/pricing/limits, malformed messages, or incorrect client permissions.| | messages.inbound.all.all.count | Total inbound message count, received by Ably from clients. | | messages.inbound.all.all.data | Total inbound message size, received by Ably from clients. | | messages.inbound.all.all.uncompressedData | Total uncompressed inbound message size, excluding delta compression, received by Ably from clients. | | messages.inbound.all.all.failed | Total number of inbound messages that failed. These are messages which did not succeed for some reason other than Ably explicitly refusing them, such as a service issue on Ably's side. | -| messages.inbound.all.all.refused | Total number of inbound messages that were refused by Ably. For example, due to "rate limiting":/docs/pricing/limits, malformed messages, or incorrect client permissions. | +| messages.inbound.all.all.refused | Total number of inbound messages that were refused by Ably. For example, due to "rate limiting":/docs/platform/pricing/limits, malformed messages, or incorrect client permissions. | | messages.inbound.all.messages.count | Total inbound message count, excluding presence and object messages, received by Ably from clients. | | messages.inbound.all.messages.data | Total inbound message size, excluding presence and object messages, received by Ably from clients. | | messages.inbound.all.messages.uncompressedData | Total uncompressed inbound message size, received by Ably from clients. This excludes delta compression, and presence and object messages. | @@ -456,7 +456,7 @@ Inbound messages metrics include those messages that are sent by clients and rec | messages.inbound.all.presence.data | Total inbound presence message size, received by Ably from clients. | | messages.inbound.all.presence.uncompressedData | Total uncompressed inbound presence message size, excluding delta compression, received by Ably from clients. | | messages.inbound.all.presence.failed | Total number of inbound presence messages that failed. These are messages which did not succeed for some reason other than Ably explicitly refusing them, such as a service issue on Ably's side. | -| messages.inbound.all.presence.refused | Total number of inbound presence messages that were refused by Ably. For example, due to "rate limiting":/docs/pricing/limits, malformed messages, or incorrect client permissions. | +| messages.inbound.all.presence.refused | Total number of inbound presence messages that were refused by Ably. For example, due to "rate limiting":/docs/platform/pricing/limits, malformed messages, or incorrect client permissions. | h3(#outbound). Outbound messages @@ -468,19 +468,19 @@ Outbound message metrics include those messages that are sent outbound from Ably | messages.outbound.realtime.all.data | Total outbound realtime message size, sent from Ably to clients. | | messages.outbound.realtime.all.uncompressedData | Total uncompressed outbound realtime message size, excluding delta compression, sent from Ably to clients. | | messages.outbound.realtime.all.failed | Total number of outbound realtime messages that failed. These are messages which did not succeed for some reason other than Ably rejecting them, such as rejection by an external integration target. | -| messages.outbound.realtime.all.refused | Total number of outbound realtime messages that were refused by Ably. This is generally due to "rate limiting":/docs/pricing/limits. | +| messages.outbound.realtime.all.refused | Total number of outbound realtime messages that were refused by Ably. This is generally due to "rate limiting":/docs/platform/pricing/limits. | | messages.outbound.realtime.messages.count | Total outbound realtime message count, excluding presence and object messages, sent from Ably to clients. | | messages.outbound.realtime.messages.billableCount | Total billable outbound realtime message count, excluding presence and object messages, sent from Ably to clients. | | messages.outbound.realtime.messages.data | Total outbound realtime message size, excluding presence and object messages, sent from Ably to clients. | | messages.outbound.realtime.messages.uncompressedData | Total uncompressed outbound realtime message size, sent from Ably to clients. This excludes delta compression, and presence and object messages. | | messages.outbound.realtime.messages.failed | Total number of outbound realtime messages excluding presence and object messages that failed. These are messages which did not succeed for some reason other than Ably explicitly refusing them, such as a service issue on Ably's side. | -| messages.outbound.realtime.messages.refused | Total number of outbound realtime messages excluding presence and object messages that were refused by Ably. This is generally due to "rate limiting":/docs/pricing/limits. | +| messages.outbound.realtime.messages.refused | Total number of outbound realtime messages excluding presence and object messages that were refused by Ably. This is generally due to "rate limiting":/docs/platform/pricing/limits. | | messages.outbound.realtime.presence.count | Total outbound realtime presence message count, sent from Ably to clients. | | messages.outbound.realtime.presence.billableCount | Total billable outbound realtime presence message count, sent from Ably to clients. | | messages.outbound.realtime.presence.data | Total outbound realtime presence message size, sent from Ably to clients. | | messages.outbound.realtime.presence.uncompressedData | Total uncompressed outbound realtime presence message size, excluding delta compression, sent from Ably to clients. | | messages.outbound.realtime.presence.failed | Total number of outbound realtime presence messages that failed. These are messages which did not succeed for some reason other than Ably explicitly refusing them, such as a service issue on Ably's side. | -| messages.outbound.realtime.presence.refused | Total number of outbound realtime presence messages that were refused by Ably. This is generally due to "rate limiting":/docs/pricing/limits. | +| messages.outbound.realtime.presence.refused | Total number of outbound realtime presence messages that were refused by Ably. This is generally due to "rate limiting":/docs/platform/pricing/limits. | | messages.outbound.realtime.objects.count | Total outbound realtime object message count, sent from Ably to clients. | | messages.outbound.realtime.objects.billableCount | Total billable outbound realtime object message count, sent from Ably to clients. | | messages.outbound.realtime.objects.data | Total outbound realtime object message size, sent from Ably to clients. | @@ -488,38 +488,38 @@ Outbound message metrics include those messages that are sent outbound from Ably | messages.outbound.rest.all.count | Total outbound REST message count, sent from Ably to clients. | | messages.outbound.rest.all.data | Total outbound REST message size, sent from Ably to clients. | | messages.outbound.rest.all.uncompressedData | Total uncompressed outbound REST message size, excluding delta compression, sent from Ably to clients. | -| messages.outbound.rest.all.refused | Total number of messages that would have been broadcast to realtime subscribers as a result of a REST publish attempt that was refused for breaching account-wide "message rate limits":/docs/pricing/limits. | +| messages.outbound.rest.all.refused | Total number of messages that would have been broadcast to realtime subscribers as a result of a REST publish attempt that was refused for breaching account-wide "message rate limits":/docs/platform/pricing/limits. | | messages.outbound.rest.messages.count | Total outbound REST message count, excluding presence and object messages, sent from Ably to clients. | | messages.outbound.rest.messages.data | Total outbound REST message size, excluding presence and object messages, sent from Ably to clients. | | messages.outbound.rest.messages.uncompressedData | Total uncompressed outbound REST message size, sent from Ably to clients. This excludes delta compression, and presence and object messages. | -| messages.outbound.rest.messages.refused | Total number of messages that would have been broadcast to realtime subscribers as a result of a REST publish attempt that was refused for breaching account-wide "message rate limit":/docs/pricing/limits. This excludes presence and object messages. | +| messages.outbound.rest.messages.refused | Total number of messages that would have been broadcast to realtime subscribers as a result of a REST publish attempt that was refused for breaching account-wide "message rate limit":/docs/platform/pricing/limits. This excludes presence and object messages. | | messages.outbound.rest.presence.count | Total outbound REST presence message count, sent from Ably to clients. | | messages.outbound.rest.presence.data | Total outbound REST presence message size, sent from Ably to clients. | | messages.outbound.rest.presence.uncompressedData | Total uncompressed outbound REST presence message size, excluding delta compression, sent from Ably to clients. | | messages.outbound.rest.objects.count | Total outbound REST object message count, sent from Ably to clients. | | messages.outbound.rest.objects.data | Total outbound REST object message size, sent from Ably to clients. | | messages.outbound.rest.objects.uncompressedData | Total uncompressed outbound REST object message size, excluding delta compression, sent from Ably to clients. | -| messages.outbound.rest.objects.refused | Total number of object messages that would have been broadcast to realtime subscribers as a result of a REST publish attempt that was refused for breaching account-wide "message rate limit":/docs/pricing/limits. | +| messages.outbound.rest.objects.refused | Total number of object messages that would have been broadcast to realtime subscribers as a result of a REST publish attempt that was refused for breaching account-wide "message rate limit":/docs/platform/pricing/limits. | | messages.outbound.webhook.all.count | Total outbound webhook message count, sent from Ably to clients using webhooks. | | messages.outbound.webhook.all.data | Total outbound webhook message size, sent from Ably to clients using webhooks. | | messages.outbound.webhook.all.uncompressedData | Total uncompressed outbound webhook message size, excluding delta compression, sent from Ably to clients using webhooks. | | messages.outbound.webhook.all.failed | Total number of outbound webhook messages that failed. These are messages which did not succeed for some reason other than Ably explicitly refusing them, such as rejection by an external integration target. | -| messages.outbound.webhook.all.refused | Total number of outbound webhook messages that were refused by Ably. This is generally due to "rate limiting":/docs/pricing/limits. | +| messages.outbound.webhook.all.refused | Total number of outbound webhook messages that were refused by Ably. This is generally due to "rate limiting":/docs/platform/pricing/limits. | | messages.outbound.webhook.messages.count | Total outbound webhook message count, sent from Ably to clients using webhooks. This excludes presence and object messages.| | messages.outbound.webhook.messages.data | Total outbound webhook message size, sent from Ably to clients using webhooks. This excludes presence and object messages. | | messages.outbound.webhook.messages.uncompressedData | Total uncompressed outbound webhook message size, sent from Ably to clients using webhooks. This excludes delta compression, and presence and object messages. | | messages.outbound.webhook.messages.failed | Total number of outbound webhook messages excluding presence and object messages that failed. These are messages which did not succeed for some reason other than Ably explicitly refusing them such as rejection by an external integration target. | -| messages.outbound.webhook.messages.refused | Total number of outbound webhook messages excluding presence and object messages that were refused by Ably. This is generally due to "rate limiting":/docs/pricing/limits. | +| messages.outbound.webhook.messages.refused | Total number of outbound webhook messages excluding presence and object messages that were refused by Ably. This is generally due to "rate limiting":/docs/platform/pricing/limits. | | messages.outbound.webhook.presence.count | Total outbound webhook presence message count, sent from Ably to clients using webhooks. | | messages.outbound.webhook.presence.data | Total outbound webhook presence message size, sent from Ably to clients using webhooks. | | messages.outbound.webhook.presence.uncompressedData | Total uncompressed outbound webhook presence message size, excluding delta compression, sent from Ably to clients using webhooks. | | messages.outbound.webhook.presence.failed | Total number of outbound webhook presence messages that failed. These are messages which did not succeed for some reason other than Ably explicitly refusing them, such as rejection by an external integration target. | -| messages.outbound.webhook.presence.refused | Total number of outbound webhook presence messages that were refused by Ably. This is generally due to "rate limiting":/docs/pricing/limits. | +| messages.outbound.webhook.presence.refused | Total number of outbound webhook presence messages that were refused by Ably. This is generally due to "rate limiting":/docs/platform/pricing/limits. | | messages.outbound.sharedQueue.all.count | Total Ably Queue message count, sent from Ably to an Ably Queue using an integration rule. | | messages.outbound.sharedQueue.all.data | Total Ably Queue message size, sent from Ably to an Ably Queue using an integration rule. | | messages.outbound.sharedQueue.all.uncompressedData | Total uncompressed Ably Queue message size, excluding delta compression, sent from Ably to an Ably Queue using an integration rule. | | messages.outbound.sharedQueue.all.failed | Total number of Ably Queue messages that failed because they were rejected by RabbitMQ for some reason. | -| messages.outbound.sharedQueue.all.refused | Total number of Ably Queue messages that Ably refused to send. This is generally due to "rate limiting":/docs/pricing/limits. | +| messages.outbound.sharedQueue.all.refused | Total number of Ably Queue messages that Ably refused to send. This is generally due to "rate limiting":/docs/platform/pricing/limits. | | messages.outbound.sharedQueue.messages.count | Total Ably Queue message count, sent from Ably to an Ably Queue using an integration rule. This excludes presence and object messages. | | messages.outbound.sharedQueue.messages.data | Total Ably Queue message size, sent from Ably to an Ably Queue using an integration rule. This excludes presence and object messages. | | messages.outbound.sharedQueue.messages.uncompressedData | Total uncompressed Ably Queue message size, sent from Ably to an Ably Queue using an integration rule. This excludes delta compression, and presence and object messages. | @@ -529,70 +529,70 @@ Outbound message metrics include those messages that are sent outbound from Ably | messages.outbound.sharedQueue.presence.data | Total Ably Queue presence message size, sent from Ably to an Ably Queue using an integration rule. | | messages.outbound.sharedQueue.presence.uncompressedData | Total uncompressed Ably Queue presence message size, excluding delta compression, sent from Ably to an Ably Queue using an integration rule. | | messages.outbound.sharedQueue.presence.failed | Total number of Ably Queue presence messages that failed because they were rejected by RabbitMQ for some reason. | -| messages.outbound.sharedQueue.presence.refused | Total number of Ably Queue presence messages that Ably refused to send. This is generally due to "rate limiting":/docs/pricing/limits. | +| messages.outbound.sharedQueue.presence.refused | Total number of Ably Queue presence messages that Ably refused to send. This is generally due to "rate limiting":/docs/platform/pricing/limits. | | messages.outbound.externalQueue.all.count | Total Firehose message count, sent from Ably to an external target using a Firehose integration rule. | | messages.outbound.externalQueue.all.data | Total Firehose message size, sent from Ably to an external target using a Firehose integration rule. | | messages.outbound.externalQueue.all.uncompressedData | Total uncompressed Firehose message size, excluding delta compression, sent from Ably to an external target using a Firehose integration rule. | | messages.outbound.externalQueue.all.failed | Total number of Firehose messages that failed because they were rejected by the external integration target for some reason. | -| messages.outbound.externalQueue.all.refused | Total number of Firehose messages that Ably refused to send. This is generally due to "rate limiting":/docs/pricing/limits. | +| messages.outbound.externalQueue.all.refused | Total number of Firehose messages that Ably refused to send. This is generally due to "rate limiting":/docs/platform/pricing/limits. | | messages.outbound.externalQueue.messages.count | Total Firehose message count, sent from Ably to an external target using a Firehose integration rule. This excludes presence and object messages. | | messages.outbound.externalQueue.messages.data | Total Firehose message size, sent from Ably to an external target using a Firehose integration rule. This excludes presence and object messages. | | messages.outbound.externalQueue.messages.uncompressedData | Total uncompressed Firehose message size, sent from Ably to an external target using a Firehose integration rule. This excludes delta compression, and presence and object messages. | | messages.outbound.externalQueue.messages.failed | Total number of Firehose messages, excluding presence and object messages, that failed because they were rejected by the external integration target for some reason. | -| messages.outbound.externalQueue.messages.refused | Total number of Firehose messages, excluding presence and object messages, that Ably refused to send. This is generally due to "rate limiting":/docs/pricing/limits. | +| messages.outbound.externalQueue.messages.refused | Total number of Firehose messages, excluding presence and object messages, that Ably refused to send. This is generally due to "rate limiting":/docs/platform/pricing/limits. | | messages.outbound.externalQueue.presence.count | Total Firehose presence message count, sent from Ably to an external target using a Firehose integration rule. | | messages.outbound.externalQueue.presence.data | Total Firehose presence message size, sent from Ably to an external target using a Firehose integration rule. | | messages.outbound.externalQueue.presence.uncompressedData | Total uncompressed Firehose presence message size, sent from Ably to an external target using a Firehose integration rule. This excludes delta compression. | | messages.outbound.externalQueue.presence.failed | Total number of Firehose presence messages that failed, because they were rejected by the external integration target for some reason. | -| messages.outbound.externalQueue.presence.refused | Total number of Firehose presence messages that Ably refused to send. This is generally due to "rate limiting":/docs/pricing/limits. | +| messages.outbound.externalQueue.presence.refused | Total number of Firehose presence messages that Ably refused to send. This is generally due to "rate limiting":/docs/platform/pricing/limits. | | messages.outbound.httpEvent.all.count | Total messages sent by a HTTP trigger. Typically a serverless function on a service such as AWS Lambda, Google Cloud Functions, or Azure Functions. | | messages.outbound.httpEvent.all.data | Total size of messages sent by a HTTP trigger. Typically a serverless function on a service such as AWS Lambda, Google Cloud Functions, or Azure Functions. | | messages.outbound.httpEvent.all.uncompressedData | Total uncompressed size of messages sent by a HTTP trigger. Typically a serverless function on a service such as AWS Lambda, Google Cloud Functions, or Azure Functions. This excludes delta compression. | | messages.outbound.httpEvent.all.failed | Total number of messages sent by a HTTP trigger that failed, because they were rejected by the external endpoint for some reason. | -| messages.outbound.httpEvent.all.refused | Total number of messages sent by a HTTP trigger that Ably refused to send. This is generally due to "rate limiting":/docs/pricing/limits. | +| messages.outbound.httpEvent.all.refused | Total number of messages sent by a HTTP trigger that Ably refused to send. This is generally due to "rate limiting":/docs/platform/pricing/limits. | | messages.outbound.httpEvent.messages.count | Total messages sent by a HTTP trigger. Typically a serverless function on a service such as AWS Lambda, Google Cloud Functions, or Azure Functions. This excludes presence and object messages. | | messages.outbound.httpEvent.messages.data | Total size of messages sent by a HTTP trigger. Typically a serverless function on a service such as AWS Lambda, Google Cloud Functions, or Azure Functions. This excludes presence and object messages. | | messages.outbound.httpEvent.messages.uncompressedData | Total uncompressed size of messages sent by a HTTP trigger. Typically a serverless function on a service such as AWS Lambda, Google Cloud Functions, or Azure Functions. This excludes delta compression, and presence and object messages. | | messages.outbound.httpEvent.messages.failed | Total number of messages sent by a HTTP trigger, excluding presence and object messages, that failed because they were rejected by the external endpoint for some reason. | -| messages.outbound.httpEvent.messages.refused | Total number of messages sent by a HTTP trigger, excluding presence and object messages, that Ably refused to send. This is generally due to "rate limiting":/docs/pricing/limits. | +| messages.outbound.httpEvent.messages.refused | Total number of messages sent by a HTTP trigger, excluding presence and object messages, that Ably refused to send. This is generally due to "rate limiting":/docs/platform/pricing/limits. | | messages.outbound.httpEvent.presence.count | Total presence messages sent by a HTTP trigger. Typically a serverless function on a service such as AWS Lambda, Google Cloud Functions, or Azure Functions. | | messages.outbound.httpEvent.presence.data | Total size of presence messages sent by a HTTP trigger. Typically a serverless function on a service such as AWS Lambda, Google Cloud Functions, or Azure Functions. | | messages.outbound.httpEvent.presence.uncompressedData | Total uncompressed size of presence messages sent by a HTTP trigger. Typically serverless functions on a service such as AWS Lambda, Google Cloud Functions, or Azure Functions. This excludes delta compression. | | messages.outbound.httpEvent.presence.failed | Total number of presence messages sent by a HTTP trigger that failed because they were rejected by the external endpoint for some reason. | -| messages.outbound.httpEvent.presence.refused | Total number of presence messages sent by a HTTP trigger that Ably refused to send. This is generally due to "rate limiting":/docs/pricing/limits. | +| messages.outbound.httpEvent.presence.refused | Total number of presence messages sent by a HTTP trigger that Ably refused to send. This is generally due to "rate limiting":/docs/platform/pricing/limits. | | messages.outbound.push.all.count | Total count of push messages, sent to devices via a push notifications transport such as FCM or APNS. | | messages.outbound.push.all.data | Total size of push messages, sent to devices via a push notifications transport such as FCM or APNS. | | messages.outbound.push.all.uncompressedData | Total uncompressed push message size, excluding delta compression, pushed to devices via a push notifications transport such as FCM or APNS. | | messages.outbound.push.all.failed | Total number of push messages that failed. These are messages which did not succeed for some reason other than Ably explicitly refusing them, such as rejection by APNS or FCM, or a service issue on Ably's side. | -| messages.outbound.push.all.refused | Total number of push messages that were refused by Ably. For example, due to "rate limiting":/docs/pricing/limits. | +| messages.outbound.push.all.refused | Total number of push messages that were refused by Ably. For example, due to "rate limiting":/docs/platform/pricing/limits. | | messages.outbound.push.messages.count | Total push message count, excluding delta compression, and presence and object messages, pushed to devices via a push notifications transport such as FCM or APNS.| | messages.outbound.push.messages.data | Total push message size, excluding delta compression, and presence and object messages, pushed to devices via a push notifications transport such as FCM or APNS. | | messages.outbound.push.messages.uncompressedData | Total uncompressed push message size, excluding delta compression, and presence and object messages, pushed to devices via a push notifications transport such as FCM or APNS. | | messages.outbound.push.messages.failed | Total number of push messages, excluding presence and object messages, that failed. These are messages which did not succeed for some reason other than Ably explicitly refusing them, such as rejection by APNS or FCM, or a service issue on Ably's side. | -| messages.outbound.push.messages.refused | Total number of push messages, excluding presence and object messages, that were refused by Ably. For example due to "rate limiting":/docs/pricing/limits. | +| messages.outbound.push.messages.refused | Total number of push messages, excluding presence and object messages, that were refused by Ably. For example due to "rate limiting":/docs/platform/pricing/limits. | | messages.outbound.push.presence.count | Total push presence message count, sent to devices via a push notifications transport such as FCM or APNS. | | messages.outbound.push.presence.data | Total push presence message size, sent to devices via a push notifications transport such as FCM or APNS. | | messages.outbound.push.presence.uncompressedData | Total uncompressed push presence message size, excluding delta compression, sent to devices via a push notifications transport such as FCM or APNS. | | messages.outbound.push.presence.failed | Total number of push presence messages that failed. These are messages which did not succeed for some reason other than Ably explicitly refusing them, such as rejection by APNS or FCM, or a service issue on Ably's side. | -| messages.outbound.push.presence.refused | Total number of push presence messages that were refused by Ably. For example due to "rate limiting":/docs/pricing/limits. | +| messages.outbound.push.presence.refused | Total number of push presence messages that were refused by Ably. For example due to "rate limiting":/docs/platform/pricing/limits. | | messages.outbound.all.all.count | Total outbound message count, sent from Ably to clients. | | messages.outbound.all.all.billableCount | Total billable outbound message count, sent from Ably to clients. | | messages.outbound.all.all.data | Total outbound message size, sent from Ably to clients. | | messages.outbound.all.all.uncompressedData | Total uncompressed outbound message size, excluding delta compression, sent from Ably to clients. | | messages.outbound.all.all.failed | Total number of outbound messages that failed. These are messages which not succeed for some reason other than Ably explicitly refusing them, such as rejection by an external integration target, or a service issue on Ably's side. | -| messages.outbound.all.all.refused | Total number of outbound messages that were refused by Ably. This is generally due to "rate limiting":/docs/pricing/limits. | +| messages.outbound.all.all.refused | Total number of outbound messages that were refused by Ably. This is generally due to "rate limiting":/docs/platform/pricing/limits. | | messages.outbound.all.messages.count | Total outbound message count, excluding presence and object messages, sent from Ably to clients. | | messages.outbound.all.messages.billableCount | Total billable outbound message count, excluding presence and object messages, sent from Ably to clients. | | messages.outbound.all.messages.data | Total outbound message size, excluding presence and object messages, sent from Ably to clients. | | messages.outbound.all.messages.uncompressedData | Total uncompressed outbound message size, excluding delta compression, and presence and object messages, sent from Ably to clients. | | messages.outbound.all.messages.failed | Total number of outbound messages excluding presence and object messages that failed. These are messages which did not succeed for some reason other than Ably explicitly refusing them, such as rejection by an external integration target, or a service issue on Ably's side. | -| messages.outbound.all.messages.refused | Total number of outbound messages excluding presence and object messages that were refused by Ably. This is generally due to "rate limiting":/docs/pricing/limits. | +| messages.outbound.all.messages.refused | Total number of outbound messages excluding presence and object messages that were refused by Ably. This is generally due to "rate limiting":/docs/platform/pricing/limits. | | messages.outbound.all.presence.count | Total outbound presence message count, sent from Ably to clients. | | messages.outbound.all.presence.billableCount | Total billable outbound presence message count, sent from Ably to clients. | | messages.outbound.all.presence.data | Total outbound presence message size, sent from Ably to clients. | | messages.outbound.all.presence.uncompressedData | Total uncompressed outbound presence message size, excluding delta compression, sent from Ably to clients. | | messages.outbound.all.presence.failed | Total number of outbound presence messages that failed. These are messages which not succeed for some reason other than Ably explicitly refusing them, such as rejection by an external integration target, or a service issue on Ably's side. | -| messages.outbound.all.presence.refused | Total number of outbound presence messages that were refused by Ably. This is generally due to "rate limiting":/docs/pricing/limits. | +| messages.outbound.all.presence.refused | Total number of outbound presence messages that were refused by Ably. This is generally due to "rate limiting":/docs/platform/pricing/limits. | h3(#persisted). Persisted messages @@ -627,7 +627,7 @@ Connection metrics include all realtime "connections":/docs/connect made to Ably | connections.all.min | Minimum connection count. | | connections.all.mean | Mean connection count. | | connections.all.opened | Total number of connections opened. | -| connections.all.refused | Total number of connections refused, for example for exceeding the "connection creation rate":/docs/pricing/limits/connection. | +| connections.all.refused | Total number of connections refused, for example for exceeding the "connection creation rate":/docs/platform/pricing/limits/connection. | h3(#channels). Channels @@ -638,7 +638,7 @@ Channel metrics include all active "channels":/docs/channels that are used to se | channels.min | Minimum active channel count. | | channels.mean | Mean active channel count. | | channels.opened | Total number of channels opened. | -| channels.refused | Total number of channel creations rejected for exceeding the "channel creation rate":/docs/pricing/limits#channel. | +| channels.refused | Total number of channel creations rejected for exceeding the "channel creation rate":/docs/platform/pricing/limits#channel. | h3(#api). API requests diff --git a/content/presence-occupancy/presence.textile b/content/presence-occupancy/presence.textile index a0c81d1da5..ee58216901 100644 --- a/content/presence-occupancy/presence.textile +++ b/content/presence-occupancy/presence.textile @@ -598,7 +598,7 @@ await channel.presence.enter(); h2(#large-presence). Large-scale presence sets -The number of clients that can be simultaneously present on a channel is "limited":/docs/pricing/limits#channel. This ensures the rate of presence messages remains supportable, as it is common for all members on a channel to change state at a similar time. +The number of clients that can be simultaneously present on a channel is "limited":/docs/platform/pricing/limits#channel. This ensures the rate of presence messages remains supportable, as it is common for all members on a channel to change state at a similar time. As an example, consider 200 clients subscribed to presence events on a channel and all of them join and leave the presence set within a few minutes. This would result in the following messages: @@ -621,7 +621,7 @@ Enabling "server-side batching":/docs/messages/batch#server-side for a channel m The interval over which this batching occurs is configurable. This is to ensure the trade-off between cost efficiency and user experience is appropriate, as a higher interval will increase the latency between message deliveries. This is usually less impactful to user experience for presence events than for regular messages. -Using server-side batching for presence events can reduce message costs when the membership of a channel is constantly changing. It also allows for a higher number of presence members per channel to be supported. By default, the number of presence members per channel is "limited":/docs/pricing/limits#channel to 200. With server-side batching enabled, this increases up to 20,000 clients depending on your "package type":/docs/pricing. +Using server-side batching for presence events can reduce message costs when the membership of a channel is constantly changing. It also allows for a higher number of presence members per channel to be supported. By default, the number of presence members per channel is "limited":/docs/platform/pricing/limits#channel to 200. With server-side batching enabled, this increases up to 20,000 clients depending on your "package type":/docs/pricing. h3(#present-no-subscribe). Be present without subscribing to presence events diff --git a/content/protocols/pubnub.textile b/content/protocols/pubnub.textile index 9d17f07f6d..0cbb9bf989 100644 --- a/content/protocols/pubnub.textile +++ b/content/protocols/pubnub.textile @@ -103,7 +103,7 @@ PubNub's member state is mapped to Ably's "presence data":/docs/presence-occupan h3(#rest). REST requests -Some PubNub API requests are mapped to multiple Ably requests and will count as such for "rate limiting":/docs/pricing/limits and quota purposes. For example: +Some PubNub API requests are mapped to multiple Ably requests and will count as such for "rate limiting":/docs/platform/pricing/limits and quota purposes. For example: * A global hereNow request is mapped to a request for a list of active channels, followed by a presence request for each channel. This is a total of *n+1* requests for *n* channels. * A mismatch exists between how Ably and PubNub paginate history requests. For example, any PubNub history requests that would result in Ably providing a paginated result will involve two Ably API requests. diff --git a/content/pub-sub/advanced.textile b/content/pub-sub/advanced.textile index 7ef747d22b..35c8d90258 100644 --- a/content/pub-sub/advanced.textile +++ b/content/pub-sub/advanced.textile @@ -401,7 +401,7 @@ Messages are streamed to clients as soon as they "attach":/docs/channels/states# Subscription filters are currently in preview status. h4(#filter-create). Create a filter expression diff --git a/src/data/nav/platform.ts b/src/data/nav/platform.ts index f57c2abf50..e61ac6ba7a 100644 --- a/src/data/nav/platform.ts +++ b/src/data/nav/platform.ts @@ -92,7 +92,7 @@ export default { name: 'Pricing', pages: [ { - link: '/docs/pricing', + link: '/docs/platform/pricing', name: 'Overview', index: true, }, @@ -100,33 +100,33 @@ export default { name: 'Package types', pages: [ { - link: '/docs/pricing/free', + link: '/docs/platform/pricing/free', name: 'Free', }, { - link: '/docs/pricing/standard', + link: '/docs/platform/pricing/standard', name: 'Standard', }, { - link: '/docs/pricing/pro', + link: '/docs/platform/pricing/pro', name: 'Pro', }, { - link: '/docs/pricing/enterprise', + link: '/docs/platform/pricing/enterprise', name: 'Enterprise', }, ], }, { - link: '/docs/pricing/billing', + link: '/docs/platform/pricing/billing', name: 'Billing', }, { - link: '/docs/pricing/limits', + link: '/docs/platform/pricing/limits', name: 'Limits', }, { - link: '/docs/pricing/faqs', + link: '/docs/platform/pricing/faqs', name: 'Pricing FAQs', }, ], diff --git a/src/pages/docs/liveobjects/storage.mdx b/src/pages/docs/liveobjects/storage.mdx index 5207a4b19a..4ddeb8b916 100644 --- a/src/pages/docs/liveobjects/storage.mdx +++ b/src/pages/docs/liveobjects/storage.mdx @@ -37,7 +37,7 @@ Operations themselves are not included in the [history](/docs/storage-history/hi ## Object count and size limits -There is a maximum number of objects that can be stored on a [channel](/docs/pricing/limits#channel), which is configured to 100 objects by default. +There is a maximum number of objects that can be stored on a [channel](/docs/platform/pricing/limits#channel), which is configured to 100 objects by default. -[Sign up](https://ably.com/sign-up) for a free account and create your own API key in the [dashboard](https://ably.com/dashboard) or use the [Control API](/docs/account/control-api) to create an API key programmatically. +[Sign up](https://ably.com/sign-up) for a free account and create your own API key in the [dashboard](https://ably.com/dashboard) or use the [Control API](/docs/platform/account/control-api) to create an API key programmatically. API keys and tokens have a set of [capabilities](/docs/auth/capabilities) assigned to them that specify which operations can be performed on which resources. The following capabilities are available for LiveObjects: diff --git a/src/pages/docs/livesync/mongodb/index.mdx b/src/pages/docs/livesync/mongodb/index.mdx index 2d47f691d5..2939fb868a 100644 --- a/src/pages/docs/livesync/mongodb/index.mdx +++ b/src/pages/docs/livesync/mongodb/index.mdx @@ -27,7 +27,7 @@ You first need to create an integration rule in order to sync your MongoDB insta There are two ways to create a MongoDB database connector rule: 1. Using the [Ably Dashboard](https://ably.com/dashboard). -2. Using the [Control API](/docs/account/control-api). +2. Using the [Control API](/docs/platform/account/control-api). To create a rule in your [dashboard](https://ably.com/dashboard): diff --git a/src/pages/docs/livesync/postgres/index.mdx b/src/pages/docs/livesync/postgres/index.mdx index 8096ff9ebf..ed68b8079c 100644 --- a/src/pages/docs/livesync/postgres/index.mdx +++ b/src/pages/docs/livesync/postgres/index.mdx @@ -34,7 +34,7 @@ The Postgres database connector is currently in alpha status. Your [feedback](ht There are two ways to create a Postgres integration rule: 1. Using the [Ably Dashboard](https://ably.com/dashboard). -2. Using the [Control API](/docs/account/control-api). +2. Using the [Control API](/docs/platform/account/control-api). To create a rule in your [dashboard](https://ably.com/dashboard): 1. Login and select the application you wish to use. diff --git a/src/pages/docs/platform/account/2fa.mdx b/src/pages/docs/platform/account/2fa.mdx index 5e038200c2..57ee9560f6 100644 --- a/src/pages/docs/platform/account/2fa.mdx +++ b/src/pages/docs/platform/account/2fa.mdx @@ -42,7 +42,7 @@ Disable and re-enable 2FA in order to switch between SMS 2FA and TOTP (time-base ## Enforce 2FA for all users -[Account owners](/docs/account/users) can require 2FA to be utilized by all users. Any user that hasn't already enabled 2FA will be prompted to do so the next time they attempt to access the account. +[Account owners](/docs/platform/account/users) can require 2FA to be utilized by all users. Any user that hasn't already enabled 2FA will be prompted to do so the next time they attempt to access the account. -Manage access to multiple Ably accounts through a single identity provider. To enable this, configure both [SSO](/docs/account/sso) with your chosen identity provider and [SCIM](#SCIM). Once configured, Ably automatically provisions and deprovisions users with access to the Ably app in your identity provider, either individually or through assigned groups. New users are added to Ably's default provisioning account with the role of **Developer**. +Manage access to multiple Ably accounts through a single identity provider. To enable this, configure both [SSO](/docs/platform/account/sso) with your chosen identity provider and [SCIM](#SCIM). Once configured, Ably automatically provisions and deprovisions users with access to the Ably app in your identity provider, either individually or through assigned groups. New users are added to Ably's default provisioning account with the role of **Developer**. Ably only recognizes one registered email domain per organization, unrecognized email domains will result in rejected provisioning attempts. @@ -47,7 +47,7 @@ Users provisioned through SCIM cannot modify their name or email address within The following steps outline the process for provisioning users through SCIM: -* Configure [SSO](/docs/account/sso) by enabling and setting up SSO between Ably and your identity provider. +* Configure [SSO](/docs/platform/account/sso) by enabling and setting up SSO between Ably and your identity provider. * Copy Ably SCIM configuration values: * Open the **Account** navigation dropdown in the Ably dashboard. @@ -65,7 +65,7 @@ The following steps outline the process for provisioning users through SCIM: ## Manage roles -Manage user and group [roles](/docs/account/users#roles) across accounts within your organization. User and group roles include those assigned directly to the user and through the groups the user belongs to. Use the **Organization Users** page as a central point of control, rather than managing access individually within each account. +Manage user and group [roles](/docs/platform/account/users#roles) across accounts within your organization. User and group roles include those assigned directly to the user and through the groups the user belongs to. Use the **Organization Users** page as a central point of control, rather than managing access individually within each account. ### Group roles diff --git a/src/pages/docs/platform/account/sso.mdx b/src/pages/docs/platform/account/sso.mdx index e5b51323b4..32aac9346b 100644 --- a/src/pages/docs/platform/account/sso.mdx +++ b/src/pages/docs/platform/account/sso.mdx @@ -10,7 +10,7 @@ Single sign-on (SSO) enables your users to authenticate via any SAML-compatible ## Configure -Single sign-on is restricted to Enterprise customers only and must be enabled on a per-account basis by [contacting Ably](https://ably.com/contact). Only [account owners](/docs/account/users) can configure SSO for an account. +Single sign-on is restricted to Enterprise customers only and must be enabled on a per-account basis by [contacting Ably](https://ably.com/contact). Only [account owners](/docs/platform/account/users) can configure SSO for an account. Any SAML-compatible identity provider can be used to enable SSO. diff --git a/src/pages/docs/platform/account/users.mdx b/src/pages/docs/platform/account/users.mdx index 58e33f5f2c..945a3b410c 100644 --- a/src/pages/docs/platform/account/users.mdx +++ b/src/pages/docs/platform/account/users.mdx @@ -26,7 +26,7 @@ User roles have the following permissions: | View app settings | ✓ | - | ✓ | ✓ | | View [app statistics](/docs/metadata-stats/stats#app) | ✓ | ✓ | ✓ | ✓ | | View [account statistics](/docs/metadata-stats/stats#account) | ✓ | ✓ | ✓ | ✓ | -| Configure own [2FA](/docs/account/2fa) | ✓ | - | ✓ | ✓ | +| Configure own [2FA](/docs/platform/account/2fa) | ✓ | - | ✓ | ✓ | | [Invite new users](#invite) | - | - | ✓ | ✓ | | [Remove existing users](#remove) | - | - | ✓ | ✓ | | Manage [API keys](/docs/auth) | - | - | ✓ | ✓ | @@ -34,8 +34,8 @@ User roles have the following permissions: | Manage app settings | - | - | ✓ | ✓ | | Create apps | - | - | ✓ | ✓ | | Receive [limit notifications](/docs/platform/pricing/limits) | - | - | ✓ | ✓ | -| Configure [single sign-on](/docs/account/sso) | - | - | - | ✓ | -| Enforce [2FA](/docs/account/2fa#enforce) | - | - | - | ✓ | +| Configure [single sign-on](/docs/platform/account/sso) | - | - | - | ✓ | +| Enforce [2FA](/docs/platform/account/2fa#enforce) | - | - | - | ✓ | | View invoices | - | ✓ | - | ✓ | | Update billing information | - | ✓ | - | ✓ | | Manage [account package](https://ably.com/pricing) | - | - | - | ✓ | @@ -80,7 +80,7 @@ To remove a user from your account: You can close your account at any time by downgrading to the [Free package](/docs/platform/pricing/free). Use the following steps to close your account: * Log in to your [account](https://ably.com/accounts/any). -* Ensure you are the account [owner](/docs/account/users#roles). +* Ensure you are the account [owner](/docs/platform/account/users#roles). * Downgrade your paid [package](/docs/pricing#packages) to Free: ** Navigate to **Account** then [Billing](https://ably.com/accounts/any/package). ** Click **Save billing details** to save your changes. diff --git a/src/pages/docs/platform/pricing/billing.mdx b/src/pages/docs/platform/pricing/billing.mdx index e969341b83..979f972124 100644 --- a/src/pages/docs/platform/pricing/billing.mdx +++ b/src/pages/docs/platform/pricing/billing.mdx @@ -29,7 +29,7 @@ The following details will appear on your credit card or bank statement when pay To update your billing details: -1. Ensure you are the account owner or have the billing [role](/docs/account/users). +1. Ensure you are the account owner or have the billing [role](/docs/platform/account/users). 2. Log in to your [account](https://ably.com/login) and select *Billing* from the *Account* menu. You can update your payment details and view your invoices in this screen. @@ -43,7 +43,7 @@ Billing alerts notify you by email when your monthly spending exceeds a set amou The following steps guide you through setting up billing alerts: * Log in to your Ably [account.](https://ably.com/login) -* In the [Create new alert](https://ably.com/accounts/any/package#billing-alerts-section) section, select the email address from the dropdown list where you want to receive the alert. The available choices depend on your [user role](/docs/account/users#roles). +* In the [Create new alert](https://ably.com/accounts/any/package#billing-alerts-section) section, select the email address from the dropdown list where you want to receive the alert. The available choices depend on your [user role](/docs/platform/account/users#roles). ** If you are an owner: Yourself and billing users associated with the account. ** If you are a user with a billing role: Yourself only. * Enter a value greater than your base package fee in the *Amount* field. This amount sets the threshold at which you will receive a notification. diff --git a/src/pages/docs/platform/pricing/faqs.mdx b/src/pages/docs/platform/pricing/faqs.mdx index 7d3d92b40b..502524a045 100644 --- a/src/pages/docs/platform/pricing/faqs.mdx +++ b/src/pages/docs/platform/pricing/faqs.mdx @@ -155,7 +155,7 @@ Once you need production-level scale then there's a simple path to upgrade to a Yes. -1. Ensure you are the [account owner](/docs/account/users). +1. Ensure you are the [account owner](/docs/platform/account/users). 2. Log in to your [account](https://ably.com/login) and select **Billing** from the **Account** menu. 3. Select the package that you would like to upgrade or downgrade to. @@ -163,4 +163,4 @@ Upgrades take effect immediately, whilst downgrades will take effect at the begi ### Can I close my account at any time? -Yes. You can [close your account](/docs/account/users#close) at any time by downgrading to the Free package. +Yes. You can [close your account](/docs/platform/account/users#close) at any time by downgrading to the Free package. diff --git a/src/pages/docs/platform/pricing/free.mdx b/src/pages/docs/platform/pricing/free.mdx index ef8e22d705..7b291bae61 100644 --- a/src/pages/docs/platform/pricing/free.mdx +++ b/src/pages/docs/platform/pricing/free.mdx @@ -38,7 +38,7 @@ Free package support includes Ably's best effort Service Level Objective (SLO) a To upgrade your account from a Free package to a Standard or Pro package: -1. Ensure you are the [account owner](/docs/account/users). +1. Ensure you are the [account owner](/docs/platform/account/users). 2. Log in to your [account](https://ably.com/login) and select **Billing** from the **Account** menu. 3. Choose the plan you wish to upgrade to and follow the instructions. Upgrades take effect immediately. @@ -54,7 +54,7 @@ To upgrade your account from a Free package to an [Enterprise package](/docs/pla To downgrade your account to a Free package: -1. Ensure you are the [account owner](/docs/account/users). +1. Ensure you are the [account owner](/docs/platform/account/users). 2. Log in to your [account](https://ably.com/login) and select **Billing** from the **Account** menu. 3. Click the **Downgrade** button. @@ -62,7 +62,7 @@ If you downgrade to the [Free package](/docs/platform/pricing/free), you will re ## Close your account -If you're using the Free package, you can [close your account](/docs/account/users#close) at any time. +If you're using the Free package, you can [close your account](/docs/platform/account/users#close) at any time.

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