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.  Note that we rate limit how many limit notification emails to prevent flooding your inbox with emails; currently there is no way to view historical account limit notifications in your dashboard, however this feature is coming soon. You can however view every  configured account limit you have in your account dashboard.


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, 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. 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 the soft limit
  • soft: when the soft limit has been exceeded
  • hard: when the hard limit 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
  • apiRequests.hourly.soft
  • apiRequests.hourly.hard
  • tokenRequests.hourly.warning
  • tokenRequests.hourly.soft
  • tokenRequests.hourly.hard


These have three levels of severity:

  • warning: when you reach 80% of the soft limit
  • soft: when the soft limit has been exceeded
  • hard: when the hard limit 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: covers both inbound or outbound messages over REST or realtime. It does not include messages published to the Ably Reactor, e.g. to queues.
  • apiRequests.maxRate
  • tokenRequests.maxRate
  • reactor.httpEvent.maxRate: this includes all Reactor Events such as AWS Lambda, Google Functions, Azure Functions and custom HTTP endpoints.
  • reactor.amqp.maxRate


In this event type, there is only a single severity level: getting the notification means you have breached the limit and messages have been suppressed.


What can I do to resolve a limits issue?


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: