When the usage of your account exceeds a limit, you will receive an email notification to alert you of the limit you have exceeded or reached (we rate limit how many limit notification emails to prevent flooding your inbox with emails).


Before you get started, you may want to:


Limit & Quota types


There are three broad types of limit that you can hit.


Account blocks

Account blocks occur if you exceed your messages hard limit, either on an hourly or monthly basis. Note that your pre-paid package quota is equivalent to your soft limit, not your hard limit; your hard limit is typically 2.5x your pre-paid quota amount, 5x if you are a business customer, and configurable for Enterprise packages. Usage above your soft and below your hard limits will result in overage charges, but no account block. An account block prevents any further usage of your account for the block period (the remainder of the current hour for an hourly block; the remainder of the current month for a monthly block).


Account restrictions

Account restrictions occur if you exceed your connections, channels, REST API requests, or token requests hard limits. Similarly to messages, hard limits are typically set at 2.5x the pre-paid quota you have purchased in your package, or 5x for business customers. Each of those will result in a different type of restriction: a restriction prevents you creating any more of the thing that was restricted until you bring it low enough again. For example, for connections, if you're on an account with max 1,000 peak connections, then when you go over your hard limit (2,500 connections), new connections will be prevented until some existing ones disconnect. For connection and channel limits, this is not a time-based restriction; it will stay in place indefinitely until your current active connection count drops below 2,500 again. For REST API requests and token request restrictions, it is time-based; similar to messages, it will last the remainder of the current hour.


Instantaneous rate limits

An instantaneous rate limit is calculated based on the current rate of the operation per second.  For example, a self-service packages can publish at most 100 messages per second to their Ably Reactor queues; if you exceed this, messages above that point will be suppressed. This is done on a rolling probabilistic basis; for example, if you have a queue rule that attempts to publish 200 messages per second to a queue, each one will have a 50% chance of being rejected, with the suppression probability being continuously updated based on the current attempted publish rate.


Limit identifiers

When you reach or exceed a limit, a limit notification is triggered to notify you of the problem, and is also recorded against your account.  The limit identifiers you receive in your emails and visible in your dashboard are described below.


Limit identifiers for account blocks and pre-warnings:

  • messages.hourly.warning.count
  • messages.hourly.warning.data
  • messages.hourly.soft.count
  • messages.hourly.soft.data
  • messages.hourly.hard.count
  • messages.hourly.hard.data
  • messages.monthly.warning.count
  • messages.monthly.warning.data
  • messages.monthly.soft.count
  • messages.monthly.soft.data
  • messages.monthly.hard.count
  • messages.monthly.hard.data


These have three levels of severity:

  • warning: when you reach 80% of your pre-paid quota
  • soft: when your pre-paid quota has been exceeded
  • hard: when the hard limit on the account has been exceeded


Only the hard severity results in an account being blocked.  See below for details on what you can do to unlock your account.


Limit identifiers for account restrictions:

  • connections.warning
  • connections.soft
  • connections.hard
  • channels.warning
  • channels.soft
  • channels.hard
  • apiRequests.hourly.warning: API requests are all REST API requests excluding token requests
  • apiRequests.hourly.soft
  • apiRequests.hourly.hard
  • tokenRequests.hourly.warning: Token requests are made by clients requesting tokens using signed token requests
  • tokenRequests.hourly.soft
  • tokenRequests.hourly.hard


These have three levels of severity:

  • warning: when you reach 80% of your pre-paid quota
  • soft: when the pre-paid quota has been exceeded
  • hard: when the hard limit on the account has been exceeded


Only the hard severity results in an account being restricted.  See below for details on what you can do to remove restrictions your account.


Limit identifiers for instantaneous rate limits:

  • messages.maxRate.hard: covers both inbound or outbound messages over REST or realtime. It does not include messages published to the Ably Reactor, e.g. to queues.
  • messages.maxRate.warning
  • apiRequests.maxRate.hard: API requests are all REST API requests excluding token requests
  • apiRequests.maxRate.warning
  • tokenRequests.maxRate.hard: Token requests are made by clients requesting tokens using signed token requests
  • tokenRequests.maxRate.warning
  • reactor.httpEvent.maxRate.hardthis includes all Reactor Events such as AWS Lambda, Google Functions, Azure Functions and custom HTTP endpoints.
  • reactor.httpEvent.maxRate.warning
  • reactor.amqp.maxRate.hardthis includes all Reactor Queue and Firehose streaming 
  • reactor.amqp.maxRate.warning


Note: you can view the peak max rates you have reached for all of the above types in your detailed account stats within the Peak Rates columns.


These have two levels of severity:

  • warning: when you reach 50% of the hard limit
  • hard: when you have breached the limit and messages have been suppressed


What can I do to resolve a limits issue?


Firstly, we recommend you review any recent limits you have neared or reached in your account dashboard to understand what limits you are hitting.  Then you should review your detailed account stats to understand the usage of your account in detail.  Then read the following below to understand the impact of the limits you have hit, and then consider upgrading or talking to someone in our sales team.


Account blocks

For account blocks / warnings that you're near to an account block due to your message usage, you can upgrade your package to one with more messages. Once you upgrade, the block will be lifted automatically. Similarly for account restrictions due to apiRequest or tokenRequest limits.


You could also review your usage to make sure you're not using more messages than you need to. For example, by default, any client attached to a channel will receive all messages and presence messages on that channel; if only some clients actually need to receive those and others only need to publish, you could assign the latter type a token with only capabilities to publish to the channel, not to subscribe; those clients will then not be sent any messages, saving you money.


Account restrictions

For account restrictions based on connections or channels, or warnings that you're near to those, disconnect any connections or detach from any channels (respectively) that you're no longer using; once you're below the hard limit again, the restriction will be lifted automatically. Alternatively, you can upgrade your package to one with more connections/channels.


For channels you can also check you're not keeping channels alive when you don't need them any more. For example, with the exception of recent versions of ably-js (see the 'publish patterns' section of this article), publishing a message on a realtime channel will implicitly attach to that channel and you need to detach explicitly. See our channels & messages documentation for more information.


Instantaneous rate limits

For an instantaneous rate limit breach, you don't need to take any action -- there is no persistent block, as soon as the instantaneous rate drops below the threshold, the suppression probability will drop to zero. For messages.maxRate, the instantaneous rate is based on your package message limits, so you can upgrade the number of messages in your package to raise the rate. Reactor limits are independent of package size for self-service packages, and are only configurable for Enterprise packages.


See also: