{ "$schema": "../json-schemas/src/errors.json", "_comment": "Generated from errors/codes/*.md by errors/scripts/generate-errors-json.js. Do not edit by hand; create and update files in errors/codes/*.md and run `npm run generate:errors`.", "codes": { "10000": { "identifier": "no_error", "title": "No error", "summary": "A placeholder code indicating success, used where an error code is expected but the operation completed normally. It does not represent a failure." }, "20000": { "identifier": "general_error", "title": "General error", "summary": "A generic error that does not correspond to a more specific code. It is used as a catch-all when the condition could not be classified more precisely." }, "40000": { "identifier": "bad_request", "title": "Bad request", "summary": "The request was rejected because it was invalid and could not be processed." }, "40001": { "identifier": "invalid_request_body", "title": "Invalid request body", "summary": "The body of the request could not be processed because it was invalid, missing required fields, or not in the expected format." }, "40002": { "identifier": "invalid_request_parameter_name", "title": "Invalid request parameter name", "summary": "The request included a parameter that is not recognized or not permitted for the operation being performed." }, "40003": { "identifier": "invalid_parameter_value", "title": "Invalid request parameter value", "summary": "A parameter in the request was invalid, such as a value of the wrong type, outside the allowed range, or otherwise unacceptable for that parameter." }, "40004": { "identifier": "invalid_request_header", "title": "Invalid request header", "summary": "A header supplied with the request was missing, invalid, or held a value that was not accepted for the operation." }, "40005": { "identifier": "invalid_credential", "title": "Invalid API key or token", "summary": "An API key or token supplied with the request could not be read because it was not in the expected form. This is distinct from a key or token that is well-formed but unauthorized." }, "40006": { "identifier": "message_contains_invalid_connection_id", "title": "Message contains invalid connection ID", "summary": "A published message referenced a connection by an ID or key that was invalid or did not match, so the message was rejected." }, "40007": { "identifier": "invalid_connection_serial", "title": "Invalid connection serial", "summary": "An older Ably SDK attempted to resume a connection using an invalid connection serial." }, "40008": { "identifier": "invalid_content_length", "title": "Invalid content length", "summary": "More data arrived in the request body than its Content-Length header declared, so the request was rejected." }, "40009": { "identifier": "max_message_size_exceeded", "title": "Message too large", "summary": "A message was rejected because it exceeded the maximum permitted size. When several messages are published in a single call, the limit applies to their combined size rather than to each one individually." }, "40010": { "identifier": "invalid_channel_name", "title": "Invalid channel name", "summary": "The channel name in the request was not valid, for example because it was empty, contained characters that are not permitted, or used an unknown square-bracketed prefix." }, "40011": { "identifier": "pagination_sequence_no_longer_valid", "title": "Pagination sequence no longer valid", "summary": "An enumeration query could not continue because the underlying set of results shifted between pages, so the pagination sequence was no longer valid." }, "40012": { "identifier": "invalid_client_id", "title": "Invalid client ID", "summary": "The client ID supplied was not acceptable, for example because it was empty, a wildcard, not a string, or did not match the client ID permitted by the credentials in use." }, "40013": { "identifier": "invalid_data_or_encoding", "title": "Invalid message data or encoding", "summary": "A message was rejected because its data was of an unsupported type, or because the encoding declared for the data could not be applied or reversed." }, "40014": { "identifier": "resource_disposed", "title": "Resource disposed", "summary": "The operation could not complete because an internal Ably resource it targeted was temporarily unavailable, typically during routine changes on Ably's side such as failover or rebalancing." }, "40015": { "identifier": "invalid_device_id", "title": "Invalid device ID", "summary": "The device ID supplied for a push notification operation was missing or not in an acceptable form, so the request was rejected." }, "40016": { "identifier": "invalid_message_name", "title": "Invalid message name", "summary": "A message supplied a name that was invalid, so the message was rejected." }, "40017": { "identifier": "unsupported_protocol_version", "title": "Unsupported protocol version", "summary": "The request specified a protocol version that Ably does not support, or omitted a version where one is required. The connection or request was rejected before processing." }, "40018": { "identifier": "delta_decoding_failed", "title": "Message delta could not be applied", "summary": "On a channel using delta compression, the Ably SDK could not apply a message's delta against the preceding message, for example because that message was missed or arrived out of order. The SDK recovers automatically by reattaching the channel to receive a full message." }, "40019": { "identifier": "missing_plugin", "title": "Required SDK plugin not present", "summary": "The operation needed an optional Ably SDK plugin that was not installed or registered, so it could not be carried out. Some features are provided by plugins that must be added alongside the core SDK." }, "40020": { "identifier": "batch_request_error", "title": "Batch request error", "summary": "A batch request completed with one or more of its items failing. Each failing item carries its own error, reported alongside this one." }, "40021": { "identifier": "feature_requires_a_newer_platform_version", "title": "Feature requires a newer platform version", "summary": "The requested feature is not available on the platform version in use. It relies on capabilities added in a later version than the one handling the request." }, "40022": { "identifier": "api_streamer_no_longer_offered", "title": "API Streamer no longer offered", "summary": "The request targeted API Streamer, which has been shut down and is no longer available. Requests that depend on it can no longer be served." }, "40023": { "identifier": "operation_requires_a_newer_sdk_version", "title": "Operation requires a newer SDK version", "summary": "The requested operation is not supported by the Ably SDK version in use, because it relies on a capability available only in a more recent version." }, "40024": { "identifier": "incompatible_site_for_history", "title": "untilAttach history request not served by attach region", "summary": "A history request using untilAttach was handled by a different Ably region from the one the channel attached in. The attach point is specific to that region, so the request could not be served and no messages were returned." }, "40025": { "identifier": "api_no_longer_supported", "title": "API no longer supported", "summary": "A method or feature that Ably no longer supports was called. It has been removed or replaced by a newer API, so the call is rejected instead of being performed." }, "40030": { "identifier": "invalid_publish_request", "title": "Invalid publish request", "summary": "A publish request was rejected because it was invalid." }, "40031": { "identifier": "invalid_client_specified_message_id", "title": "Invalid client-specified message id", "summary": "A publish was rejected because a client-supplied message id was missing, empty, or not in the required format. When several messages are published together, every message must carry a valid id following the expected pattern." }, "40032": { "identifier": "invalid_message_extras_field", "title": "Invalid message extras field", "summary": "A publish was rejected because a message included an extras field that is not permitted, or one whose value was the wrong type. Only recognized extras keys with values of the expected shape are accepted." }, "40033": { "identifier": "operation_canceled", "title": "Operation canceled", "summary": "An operation was stopped before completing, so its result was discarded. This usually happens when the connection or request that triggered the operation ends first." }, "40034": { "identifier": "too_many_messages_in_one_publish", "title": "Too many messages in one publish", "summary": "A publish was rejected because it contained more messages than the maximum permitted count. This is about the number of messages, not their combined size, which is limited separately." }, "40035": { "identifier": "integration_message_filter_regex_not_re2_compatible", "title": "Integration message filter regex not RE2-compatible", "summary": "An integration's message filter could not be applied because its regular expression is not compatible with the RE2 syntax. Backreferences and lookaround are not supported." }, "40099": { "identifier": "reserved_for_testing", "title": "Reserved for testing", "summary": "This code is reserved for artificial errors produced during testing and does not indicate a genuine fault. It is not expected to appear during normal operation." }, "40100": { "identifier": "unauthorized", "title": "Unauthorized", "summary": "A connection or request was rejected because it was not authorized." }, "40101": { "identifier": "invalid_credentials", "title": "Authentication failed", "summary": "The credentials presented were not accepted, for example an API key secret that did not match, an invalid token, or no credentials supplied at all." }, "40102": { "identifier": "incompatible_credentials", "title": "Incompatible credentials", "summary": "The credentials presented were valid but did not match the request, for example the client ID they permit differed from the one in use, or they belonged to a different application than the connection being resumed." }, "40103": { "identifier": "invalid_use_of_basic_auth_over_non_tls_transport", "title": "Basic authentication used over an insecure connection", "summary": "Basic authentication was attempted over a connection that was not secured with TLS. Basic authentication sends the API key directly, so it is only permitted over an encrypted transport." }, "40104": { "identifier": "token_request_timestamp_outside_permitted_window", "title": "Token request timestamp outside permitted window", "summary": "The timestamp in a token request fell outside the window Ably accepts, so the request was rejected. This usually happens when the clock of the system that generated the token request differs significantly from real time." }, "40105": { "identifier": "nonce_value_replayed", "title": "Nonce value replayed", "summary": "A token request was rejected because its nonce had already been used. Each nonce may be presented only once, so a repeated value is treated as a replayed request." }, "40106": { "identifier": "no_valid_authentication_method_provided", "title": "No valid authentication method provided", "summary": "The Ably SDK was given no usable way to authenticate: no API key, token, or token-request mechanism such as authCallback or authUrl was provided." }, "40110": { "identifier": "account_disabled", "title": "Account disabled", "summary": "The request was rejected because the Ably account it belongs to is disabled. While an account is disabled, its applications cannot authenticate or carry traffic." }, "40111": { "identifier": "account_connection_limit_exceeded", "title": "Account connection limit exceeded", "summary": "A new connection was refused because the account had reached the maximum number of concurrent connections permitted by its limits." }, "40112": { "identifier": "account_message_limit_exceeded", "title": "Account message limit exceeded", "summary": "The request was rejected because the account had reached the maximum message volume permitted by its limits." }, "40113": { "identifier": "account_blocked", "title": "Account blocked", "summary": "The request was rejected because the Ably account it belongs to is blocked." }, "40114": { "identifier": "account_channel_limit_exceeded", "title": "Account channel limit exceeded", "summary": "The request was refused because the account had reached the maximum number of concurrent channels permitted by its limits." }, "40115": { "identifier": "account_request_limit_exceeded", "title": "Account request limit exceeded", "summary": "The request was refused because the account had reached its permitted limit on API and token requests." }, "40120": { "identifier": "application_disabled", "title": "Application disabled", "summary": "The request was rejected because the application it targets is disabled. While an application is disabled, it cannot authenticate or carry traffic." }, "40121": { "identifier": "token_revocation_not_enabled", "title": "Token revocation not enabled", "summary": "A token revocation request was rejected because the revocation capability it requires is not enabled, either token revocation for the application or revocation by channel for the account." }, "40125": { "identifier": "application_integration_limit_exceeded", "title": "Application integration limit exceeded", "summary": "An integration could not be created because the application had reached the maximum number of integrations permitted by its limits." }, "40126": { "identifier": "application_channel_rule_limit_exceeded", "title": "Application channel rule limit exceeded", "summary": "A channel rule could not be created because the application had reached the maximum number of channel rules permitted by its limits." }, "40127": { "identifier": "application_api_key_limit_exceeded", "title": "Application API key limit exceeded", "summary": "A new API key could not be created because the application had reached the maximum number of keys permitted by its limits." }, "40128": { "identifier": "account_application_limit_exceeded", "title": "Account application limit exceeded", "summary": "A new application could not be created because the account had reached the maximum number of applications it is permitted." }, "40130": { "identifier": "key_error", "title": "API key not recognized", "summary": "Authentication failed because the API key presented was not recognized. This usually means the key does not exist or has been removed." }, "40131": { "identifier": "key_revoked", "title": "API key revoked", "summary": "A connection or request was rejected because the API key it used has been revoked by an account admin and can no longer authenticate." }, "40132": { "identifier": "key_expired", "title": "API key expired", "summary": "A connection or request was rejected because the API key it used has expired. Keys can be given an expiry time, after which they can no longer authenticate." }, "40133": { "identifier": "wrong_api_key_for_token_revocation", "title": "Wrong API key for token revocation", "summary": "A token revocation request was rejected because it was made with a different API key from the one that issued the tokens. Tokens can only be revoked using the key that issued them." }, "40140": { "identifier": "token_error_unspecified", "title": "Token not accepted", "summary": "The authentication token was rejected, so the connection or request could not be authenticated. This error prompts the client to obtain a new token and retry." }, "40141": { "identifier": "token_revoked", "title": "Token revoked", "summary": "A connection or request was rejected because the authentication token it used has been revoked. A revoked token is invalidated before its normal expiry and can no longer authenticate." }, "40142": { "identifier": "token_expired", "title": "Token expired", "summary": "The client's connection or request was rejected because the authentication token had expired. Each token has an expiry time that is set when it is issued." }, "40143": { "identifier": "token_unrecognized", "title": "Token not recognized", "summary": "A connection or request was rejected because Ably could not find a record of the token presented. Ably stores a record of certain tokens only while they remain valid, so this often means the token had already expired." }, "40144": { "identifier": "invalid_jwt", "title": "Invalid JWT token", "summary": "A JWT presented for authentication could not be parsed. The token was not well-formed, so it could not be read as a valid JSON Web Token." }, "40145": { "identifier": "invalid_ably_token", "title": "Invalid Ably token", "summary": "An Ably token presented for authentication could not be parsed, so its contents could not be read." }, "40150": { "identifier": "application_connection_limit_exceeded", "title": "Application connection limit exceeded", "summary": "A new connection was refused because the application had reached the maximum number of concurrent connections permitted for it." }, "40151": { "identifier": "token_connection_limit_exceeded", "title": "Token connection limit exceeded", "summary": "A connection was refused because the number of concurrent connections using the same token had reached the maximum permitted for a single token." }, "40160": { "identifier": "capability_denied", "title": "Client lacks the required capability", "summary": "The API key or token used by the client isn't assigned the capability required for the operation, for example publishing, subscribing, or reading history on a channel, or listing channels and connections." }, "40161": { "identifier": "identified_client_required", "title": "Operation requires an identified client", "summary": "The client had no established client ID, so an operation that requires one was refused." }, "40162": { "identifier": "operation_requires_basic_authentication", "title": "Operation requires Basic authentication", "summary": "The operation was refused because it can only be performed with Basic authentication using an API key, but the client authenticated with a token. Token revocation is one such operation, which must use the key that issued the tokens." }, "40163": { "identifier": "token_revocation_not_enabled_for_api_key", "title": "Token revocation not enabled for API key", "summary": "The operation was refused because the API key used does not have revocable tokens enabled. Revocation applies only to tokens issued by a key with that setting turned on." }, "40164": { "identifier": "token_revocation_not_enabled_for_api_key_40164", "title": "Token revocation not enabled for API key", "summary": "The operation was refused because the API key used does not have revocable tokens enabled. Revocation applies only to tokens issued by a key with that setting turned on." }, "40165": { "identifier": "channel_mode_not_requested_when_attaching", "title": "Channel mode not requested when attaching", "summary": "Publishing a message, object, or annotation, or entering presence, was rejected because the client did not request the matching channel mode when it attached. The credentials permit the operation; the mode that enables it was not requested." }, "40166": { "identifier": "unidentified_client_cannot_modify_own_messages", "title": "Unidentified client cannot modify own messages", "summary": "A message update or delete was rejected because the client is unidentified (it has no clientId) but holds only the \"own\" form of the relevant capability, message-update-own or message-delete-own, which can never apply to a client that has no messages of its own." }, "40167": { "identifier": "untrusted_client_type_declaration", "title": "Client type declaration not signed by token", "summary": "A connection or request declared itself as a server, but the token it authenticated with carries no matching client type claim. Only the key holder can make that declaration, so it must be signed into the token." }, "40170": { "identifier": "error_from_client_token_callback", "title": "Token callback failed", "summary": "Authentication could not complete because the client's own token-request mechanism, its authCallback or authUrl, returned an error instead of a token or token request. The failure originates in the application's auth logic or endpoint, not within Ably." }, "40171": { "identifier": "token_renewal_not_configured", "title": "Token renewal not configured", "summary": "The auth token expired and could not be renewed because no renewal mechanism was configured. Without an authCallback, authUrl, or API key, the Ably SDK has no way to obtain a replacement token." }, "40172": { "identifier": "operation_requires_token_authentication", "title": "Operation requires Token authentication", "summary": "The operation was refused because it can only be performed with Token authentication, but the client authenticated using Basic authentication. Some operations are available only to clients using a token." }, "40180": { "identifier": "apns_token_authentication_required_for_location", "title": "APNs token authentication required for location notification", "summary": "A location notification was not sent because location notifications require the app's APNs credentials to use token-based authentication, but the app is not configured that way." }, "40181": { "identifier": "no_location_token_for_device", "title": "No location token for device", "summary": "A location push notification was not sent to a device because the device has no location token registered. Location notifications can only be delivered to devices that have supplied one." }, "40182": { "identifier": "apns_token_authentication_required_for_push_to_start", "title": "APNs token authentication required for push-to-start Live Activities notification", "summary": "A live-activity push-to-start notification was not sent because push-to-start requires the app's APNs credentials to use token-based authentication, but the app is not configured that way." }, "40300": { "identifier": "forbidden", "title": "Forbidden", "summary": "The request was refused because it is not permitted. This covers a range of forbidden conditions, such as a disabled account or application, or a caller that lacks permission for the operation." }, "40310": { "identifier": "account_does_not_permit_tls_connections", "title": "Account does not permit TLS connections", "summary": "The connection was rejected because it used TLS, but the account is configured not to allow TLS connections." }, "40311": { "identifier": "application_requires_a_tls_connection", "title": "Application requires a TLS connection", "summary": "The connection was rejected because it did not use TLS, but the application requires TLS connections." }, "40320": { "identifier": "authentication_required", "title": "Authentication required", "summary": "The request was rejected because it carried no authentication credentials." }, "40330": { "identifier": "account_not_permitted_in_cluster_or_region", "title": "Account not permitted in this cluster or region", "summary": "The request reached a cluster or region the account is not permitted to use; the accompanying error message gives the specific reason." }, "40331": { "identifier": "account_not_permitted_in_cluster", "title": "Account not permitted in this cluster", "summary": "The request reached an Ably cluster the account is not permitted to use." }, "40332": { "identifier": "account_not_permitted_in_region", "title": "Account not permitted in this region", "summary": "The request reached a region the account is not permitted to use." }, "40400": { "identifier": "not_found", "title": "Resource not found", "summary": "The requested resource does not exist, often because it has been deleted or the path or identifier used to reference it is incorrect." }, "40500": { "identifier": "method_not_allowed", "title": "HTTP method not allowed", "summary": "The request used an HTTP method that the endpoint does not support." }, "40900": { "identifier": "conflict", "title": "Conflict", "summary": "The request conflicted with the current state of the target, so it could not be completed." }, "41001": { "identifier": "push_device_registration_expired", "title": "Push device registration expired", "summary": "The push notification could not be delivered because the target device's registration is no longer valid. Registrations expire over time, and the device must register again before it can receive notifications." }, "42200": { "identifier": "unprocessable_content", "title": "Message content could not be processed", "summary": "A message was rejected because a content check (for example validation or moderation) did not accept it, rather than for a syntax or size problem." }, "42210": { "identifier": "content_rejected", "title": "Message content rejected", "summary": "A message was rejected by a content check (such as validation, moderation, or an integration), but the error does not identify which one." }, "42211": { "identifier": "content_rejected_by_before_publish_integration", "title": "Message rejected by integration", "summary": "A message was rejected by an integration configured to check messages before they are accepted." }, "42212": { "identifier": "content_rejected_by_validation", "title": "Message rejected by content validation", "summary": "A message was rejected because it failed a content-validation check." }, "42213": { "identifier": "content_rejected_by_moderation", "title": "Message rejected by moderation", "summary": "A message was rejected by a content-moderation check configured on the channel. The moderation check inspected the content and flagged it as not permitted." }, "42910": { "identifier": "rate_limit_exceeded_generic", "title": "System rate limit exceeded", "summary": "An operation was rejected because a system rate limit was exceeded. The limit protects Ably against overload; the operation can be retried." }, "42911": { "identifier": "rate_limit_exceeded_per_connection_inbound", "title": "Per-connection publish rate exceeded", "summary": "A message was rejected because the connection published messages faster than the per-connection publish rate limit allows. Publishing far above the limit can escalate to the connection being closed." }, "42912": { "identifier": "rate_limit_channel_iteration_in_progress", "title": "Channel enumeration already in progress", "summary": "A request to enumerate the channels active in an app was rejected because another enumeration was already running. Only one channel enumeration can run at a time for an app." }, "42913": { "identifier": "rate_limit_exceeded_per_channel_inbound", "title": "Per-channel publish rate exceeded", "summary": "A message was rejected because the rate of messages published to the channel exceeded its configured limit. The limit applies to all publishers to the channel combined, so it can be reached even when no single publisher is publishing quickly." }, "42914": { "identifier": "rate_limit_exceeded_per_channel_bandwidth", "title": "Per-channel publish bandwidth exceeded", "summary": "A message was rejected because the rate of data published to the channel exceeded its configured bandwidth limit. The limit applies to all publishers to the channel combined, so large messages can reach it even at a low message rate." }, "42915": { "identifier": "rate_limit_exceeded_per_connection_outbound", "title": "Per-connection outbound message rate exceeded", "summary": "Messages were not delivered to a connection because the rate of messages being sent to it exceeded its per-connection outbound limit. The client is notified of the gap by a channel continuity loss, which it receives as error 80020." }, "42916": { "identifier": "rate_limit_exceeded_per_connection_backlog", "title": "Per-connection outbound resume rate exceeded", "summary": "Backlog messages were not delivered to a connection because the rate of delivering them exceeded its per-connection outbound limit. The client is notified of the gap by a channel continuity loss, which it receives as error 80020." }, "42917": { "identifier": "rate_limit_exceeded_account_messages", "title": "Account-wide message publish rate exceeded", "summary": "A message was rejected because the rate of messages published across the account exceeded the configured account-wide limit. A proportion of messages are rejected to bring the account back within its limit." }, "42918": { "identifier": "rate_limit_exceeded_account_api_requests", "title": "Account-wide API request rate exceeded", "summary": "A REST API request was rejected because the request rate across the account exceeded the configured account-wide limit. A proportion of requests are rejected to bring the account back within its limit." }, "42920": { "identifier": "rate_limit_exceeded_connection_fatal", "title": "Connection terminated by a fatal rate limit", "summary": "The connection was closed because a rate limit was exceeded severely enough to be treated as fatal, rather than rejecting individual operations. This is the general form of a fatal rate-limit close; common cases have their own codes." }, "42921": { "identifier": "rate_limit_exceeded_per_connection_inbound_fatal", "title": "Connection terminated for far exceeding the per-connection publish rate", "summary": "The connection was closed because it published far above the per-connection publish rate limit, around 20 times the permitted rate. Breaches below that reject individual messages without closing the connection." }, "42922": { "identifier": "rate_limit_exceeded_too_many_requests", "title": "Too many requests", "summary": "A request was blocked because too many requests were received in a short period, triggering Ably's flood protection. This protects the service against excessive or abusive traffic, separately from your account's own rate limits." }, "42923": { "identifier": "integration_target_rate_limit_response", "title": "Integration target responded with rate limit error", "summary": "An integration target such as an HTTP endpoint, serverless function, or message queue returned a rate-limit response when Ably invoked it. The limit is the target's own, not one of Ably's." }, "42924": { "identifier": "rate_limit_exceeded_protocol_message_rate_fatal", "title": "Per-connection protocol message rate exceeded", "summary": "A connection was terminated because the rate of inbound protocol messages from the connection exceeded its configured per-connection limit. Protocol messages include message publishes, presence updates, attach/detach requests, and other client-initiated actions on the connection." }, "42925": { "identifier": "rate_limit_exceeded_account_integrations", "title": "Account-wide integration invocation rate exceeded", "summary": "An integration invocation was dropped because the invocation rate across the account exceeded the configured account-wide limit. A proportion of invocations are dropped to bring the account back within its limit." }, "42926": { "identifier": "rate_limit_exceeded_account_push_notifications", "title": "Account-wide push notification rate exceeded", "summary": "A push notification was dropped because the publish rate of push notifications across the account exceeded the configured account-wide limit. A proportion of push notifications are dropped to bring the account back within its limit." }, "50000": { "identifier": "internal_error", "title": "Internal server error", "summary": "The request could not be completed because of an unexpected error inside the Ably platform." }, "50001": { "identifier": "internal_channel_error", "title": "Internal channel error", "summary": "An operation on a channel failed because of an unexpected error inside the Ably platform." }, "50002": { "identifier": "internal_connection_error", "title": "Internal connection error", "summary": "An operation on a connection failed because of an unexpected error inside the Ably platform." }, "50003": { "identifier": "timeout_error", "title": "Request timed out server-side", "summary": "The Ably platform did not finish handling the request within the time allowed, so the request was abandoned. This usually reflects a transient server-side delay rather than a problem with the request." }, "50004": { "identifier": "server_temporarily_busy", "title": "Server temporarily busy", "summary": "The request was rejected because the server handling it could not accept it at that moment. The condition is transient." }, "50005": { "identifier": "service_temporarily_unavailable", "title": "Service temporarily unavailable", "summary": "The request could not be served because the service was temporarily in a locked-down state, during which requests are not accepted. The condition is temporary and expected to clear." }, "50006": { "identifier": "connection_superseded_by_a_newer_connection", "title": "Connection superseded by a newer connection", "summary": "The connection's state was taken over by a more recent connection, typically a reconnection or resume. This only arises on a deprecated Ably protocol version; upgrade to a recent Ably SDK release to avoid it." }, "50010": { "identifier": "edge_proxy_internal_error", "title": "Edge proxy internal error", "summary": "Ably's edge proxy service encountered an unknown internal error while handling the request and could not complete it." }, "50205": { "identifier": "routing_layer_connection_refused", "title": "Routing layer could not reach the service", "summary": "Ably's routing layer could not open a connection to the service that should have handled the request, so the request was not completed. The condition is usually transient." }, "50210": { "identifier": "invalid_platform_response", "title": "Invalid response from the platform", "summary": "Ably's edge proxy service received an invalid response from the Ably platform behind it and could not complete the request. The condition is usually transient." }, "50305": { "identifier": "routing_layer_request_failed", "title": "Routing layer could not service the request", "summary": "Ably's routing layer encountered an unexpected error while handling the request and could not complete it. The condition is usually transient." }, "50306": { "identifier": "region_temporarily_disabled", "title": "Region temporarily disabled", "summary": "The request reached a region that has been temporarily taken out of service, so it was rejected. Requests only reach a disabled region while traffic is still being routed there, and stop once the routing change takes effect." }, "50310": { "identifier": "platform_temporarily_unavailable", "title": "Platform temporarily unavailable", "summary": "Ably's edge proxy service received a service-unavailable response from the Ably platform behind it and could not complete the request. The condition is usually transient." }, "50320": { "identifier": "traffic_temporarily_redirected", "title": "Traffic temporarily redirected", "summary": "Ably's Active Traffic Management temporarily redirected traffic away from its normal path, and the request was affected while that redirection was in place. The condition is temporary." }, "50330": { "identifier": "request_reached_the_wrong_cluster", "title": "Request reached the wrong cluster", "summary": "The request arrived at a cluster that was not the one meant to handle it and should be retried. This can happen briefly during DNS changes while traffic is being migrated between clusters." }, "50405": { "identifier": "routing_layer_timed_out", "title": "Routing layer timed out", "summary": "Ably's routing layer did not receive a response from the service handling the request within the time allowed, so the request was abandoned. The condition is usually transient." }, "50410": { "identifier": "edge_proxy_timed_out_waiting_for_platform", "title": "Edge proxy timed out waiting for platform", "summary": "Ably's edge proxy service did not receive a response from the Ably platform behind it within the time allowed, so the request was abandoned. The condition is usually transient." }, "61002": { "identifier": "device_registration_client_id_mismatch", "title": "Device registered to a different clientId", "summary": "Push activation was rejected because the device already holds a registration belonging to a different clientId. This usually happens when a device is activated again after a different user has signed in." }, "70000": { "identifier": "integration_operation_failed", "title": "Integration operation failed", "summary": "An integration could not complete an operation against its configured target." }, "70001": { "identifier": "integration_invocation_failed", "title": "Integration invocation failed", "summary": "An integration could not invoke its configured target: Ably either could not reach the target, or reached it but could not deliver the data. The specific failure depends on the integration type and is named in the error message." }, "70002": { "identifier": "integration_target_returned_an_error_status", "title": "Integration target returned an error status", "summary": "An integration invoked an HTTP target, such as a webhook, which replied with an HTTP status outside the successful 2xx range. Ably treats any non-2xx response as a failed delivery." }, "70003": { "identifier": "too_many_concurrent_integration_requests", "title": "Too many concurrent integration requests", "summary": "An integration was not invoked because the number of requests already in flight for it had reached the permitted maximum. This usually happens when a target responds more slowly than the rate at which matching messages arrive." }, "70004": { "identifier": "integration_refused_to_process_a_message", "title": "Integration refused to process a message", "summary": "An integration reached its configured target, but the target did not accept the message because its contents were invalid or unsupported for that target type." }, "70005": { "identifier": "amqp_message_delivery_timed_out", "title": "AMQP message delivery timed out", "summary": "A message could not be delivered to an Ably message queue integration because the delivery did not complete within the allowed time. This usually points to the queue being unavailable or slow to accept the message." }, "70006": { "identifier": "amqp_message_queue_busy", "title": "AMQP message queue busy", "summary": "A message could not be delivered to an Ably message queue integration because the message queue was too busy to accept it. This is usually transient and eases as load falls." }, "71000": { "identifier": "exchange_error", "title": "Exchange error", "summary": "A request involving Ably Exchange failed for a reason that could not be attributed to a more specific cause. Exchange lets a publisher expose channels as a product that subscribers can receive." }, "71001": { "identifier": "forced_re_attachment_after_permissions_change", "title": "Forced re-attachment after permissions change", "summary": "An Exchange channel was detached and re-attached because the permissions governing access to it changed, so the existing attachment no longer reflected what the client was entitled to receive." }, "71100": { "identifier": "exchange_publisher_error", "title": "Exchange publisher error", "summary": "A request involving an Exchange publisher failed for a reason that could not be attributed to a more specific cause. A publisher is the party that exposes channels as an Exchange product." }, "71101": { "identifier": "publisher_not_found", "title": "Publisher not found", "summary": "The Exchange request referred to a publisher that does not exist. This usually means the publisher identifier was incorrect or the publisher is no longer available." }, "71102": { "identifier": "publisher_not_enabled_for_exchange", "title": "Publisher not enabled for Exchange", "summary": "The request referred to a party that exists but has not been enabled as an Exchange publisher, so it cannot expose channels as a product for subscribers to receive." }, "71200": { "identifier": "exchange_product_error", "title": "Exchange product error", "summary": "A request involving an Exchange product failed for a reason that could not be attributed to a more specific cause. A product is the set of channels a publisher exposes for subscribers to receive." }, "71201": { "identifier": "product_not_found", "title": "Product not found", "summary": "The Exchange request referred to a product that does not exist. This usually means the product identifier was incorrect or the product is no longer available from the publisher." }, "71202": { "identifier": "product_disabled", "title": "Product disabled", "summary": "The Exchange product exists but has been disabled by the publisher, so its channels are not currently available to subscribers." }, "71203": { "identifier": "channel_not_part_of_product", "title": "Channel not part of product", "summary": "The requested channel is not one of the channels that the Exchange product exposes, so it cannot be received through that product." }, "71204": { "identifier": "forced_re_attachment_after_product_remapping", "title": "Forced re-attachment after product remapping", "summary": "An Exchange channel was detached and re-attached because the product was remapped to a different channel namespace, so the existing attachment no longer pointed at the channel the product now exposes." }, "71300": { "identifier": "exchange_subscription_error", "title": "Exchange subscription error", "summary": "A request involving an Exchange subscription failed for a reason that could not be attributed to a more specific cause. A subscription is what grants a subscriber access to a publisher's product." }, "71301": { "identifier": "subscription_disabled", "title": "Subscription disabled", "summary": "The subscription to the Exchange product exists but has been disabled, so its channels are not currently available to the subscriber." }, "71302": { "identifier": "no_subscription_to_product", "title": "No subscription to product", "summary": "The requester attempted to receive an Exchange product they are not subscribed to. Access to a product's channels requires an active subscription to that product." }, "71303": { "identifier": "channel_outside_subscription_filter", "title": "Channel outside subscription filter", "summary": "The requested channel does not match the channel filter defined for the subscription to the Exchange product, so it falls outside the set of channels that subscription grants access to." }, "72000": { "identifier": "livesync_operation_failed", "title": "LiveSync connector operation failed", "summary": "A LiveSync database connector hit an unexpected error while running, so the operation it was attempting did not complete." }, "72001": { "identifier": "livesync_publish_failed", "title": "LiveSync connector could not publish", "summary": "A LiveSync database connector read a change from the database but could not publish the resulting message to Ably. The change may not have reached the channel it was destined for." }, "72002": { "identifier": "livesync_table_unhealthy", "title": "LiveSync database connector is unhealthy", "summary": "A LiveSync database connector could not read from the table or collection it is configured to use, because that table or collection is missing, renamed, or no longer accessible to the connector." }, "72003": { "identifier": "livesync_cannot_connect_db", "title": "LiveSync connector cannot reach the database", "summary": "A LiveSync database connector could not establish a connection to the database it reads from. This often points to the database being unreachable, or to incorrect connection details or credentials in the connector configuration." }, "72004": { "identifier": "livesync_no_channel_key", "title": "LiveSync connector could not identify target channel", "summary": "A LiveSync database connector read a change but could not determine which channel to publish it to, because the change had no _ablyChannel field. Only changes that specify a channel can be published." }, "72005": { "identifier": "livesync_invalid_pipeline", "title": "LiveSync MongoDB pipeline is invalid", "summary": "A LiveSync MongoDB connector could not start because the aggregation pipeline in its configuration was not accepted by MongoDB, for example because it references a stage or field that is not allowed." }, "72006": { "identifier": "livesync_cannot_resume", "title": "LiveSync connector failed to resume", "summary": "A LiveSync MongoDB connector could not resume its change stream from where it left off. It stores a resume token to continue after a restart, and this arises when that stored position cannot be read back." }, "72007": { "identifier": "livesync_cannot_store_resume_token", "title": "LiveSync connector failed to track its position", "summary": "A LiveSync MongoDB connector could not save its change-stream resume token to the database. The token records how far the connector has read, so that it can continue from the same point after a restart." }, "72008": { "identifier": "livesync_change_stream_history_lost", "title": "LiveSync connector failed to read history", "summary": "A LiveSync MongoDB connector's change stream could no longer continue from its last recorded position, because the history it needed was no longer available in the database. Changes made in the intervening period may have been missed." }, "80000": { "identifier": "connection_failed", "title": "Connection failed", "summary": "The connection moved to the failed state, a terminal condition from which the SDK does not automatically reconnect. It differs from a temporary disconnection, where the SDK keeps retrying to restore the connection on its own." }, "80001": { "identifier": "connection_failed_no_transport", "title": "Connection failed as no usable transport available", "summary": "No usable transport could be established to carry the connection, for example when the network blocks both WebSocket and the HTTP-based fallbacks." }, "80002": { "identifier": "connection_suspended", "title": "Connection suspended", "summary": "The connection moved to the suspended state after being disconnected for an extended period. A connection becomes suspended once it has been disconnected for around two minutes, beyond which its state can no longer be recovered." }, "80003": { "identifier": "connection_disconnected", "title": "Connection disconnected", "summary": "The connection to Ably was dropped. This is a normal, usually brief interruption, such as a network change or Ably cycling the connection, rather than a deliberate close, and the connection is expected to be re-established." }, "80004": { "identifier": "connection_already_established", "title": "Connection already established", "summary": "A request to open a connection was made while a connection was already active." }, "80005": { "identifier": "connection_no_longer_available", "title": "Connection no longer available", "summary": "A request referenced an existing connection, but the server no longer held its state, typically because the connection had been idle and was released after a period without activity. The client is signaled to reconnect and continue on a fresh connection." }, "80006": { "identifier": "connection_messages_expired", "title": "Connection continuity not guaranteed as messages expired", "summary": "A connection was resumed after the messages needed to bridge the gap had expired. The connection continues, but any messages published during the disconnection may not be redelivered, so continuity across it is not guaranteed." }, "80007": { "identifier": "connection_message_limit_exceeded", "title": "Connection continuity not guaranteed as message limit exceeded", "summary": "A connection was resumed, but more messages accumulated during the disconnection than can be held for recovery. The connection continues, but some of those messages may not be redelivered, so continuity across the gap is not guaranteed." }, "80008": { "identifier": "connection_recovery_failed_on_an_outdated_sdk", "title": "Connection recovery failed on an outdated SDK", "summary": "An older Ably SDK could not recover a dropped connection. This code is produced only by SDK versions that use a retired version of the Ably protocol; current SDKs connect differently and do not report it." }, "80009": { "identifier": "connection_not_established", "title": "Connection not established", "summary": "An operation that requires an open connection was attempted while the client was not connected." }, "80010": { "identifier": "invalid_operation_on_the_connection", "title": "Invalid operation on the connection", "summary": "An operation was attempted on a connection that was not in a valid state to carry it, such as one that had already been closed or replaced." }, "80011": { "identifier": "connection_incompatible_auth_params", "title": "Connection state recovery failed due to incompatible auth", "summary": "A dropped connection could not be recovered because the authentication details presented on the new connection did not match those of the original, so the previous connection could not be continued." }, "80012": { "identifier": "connection_invalid_serial", "title": "Connection continuity not guaranteed as serial was invalid", "summary": "A connection was resumed without a valid connection serial to identify the point it had reached, so there was no reliable position to continue from. The connection continues, but continuity across the gap is not guaranteed." }, "80013": { "identifier": "protocol_error", "title": "Protocol error", "summary": "A message exchanged over the connection did not conform to the Ably protocol. The connection received something it could not interpret as a valid protocol message." }, "80014": { "identifier": "connection_timed_out", "title": "Connection timed out", "summary": "The connection was not established, or a response was not received, within the time allowed. This often points to a slow or unreliable network path between the client and Ably." }, "80015": { "identifier": "incompatible_connection_parameters", "title": "Incompatible connection parameters", "summary": "The connection could not be established because the parameters supplied when opening it were not compatible with one another or with what Ably supports." }, "80016": { "identifier": "connection_replaced_by_a_newer_one", "title": "Connection replaced by a newer one", "summary": "An operation was attempted on a connection that is no longer current, so it could not be applied. A newer connection had replaced it, or its transport handle had been recycled. The client re-establishes the connection to continue." }, "80017": { "identifier": "connection_closed", "title": "Connection closed", "summary": "The connection was closed deliberately, rather than dropped. This is the expected outcome when the connection is closed by request and is not a fault." }, "80018": { "identifier": "invalid_connection_key", "title": "Invalid connection key", "summary": "A client tried to re-use a previous connection ID with a connection key, but the key was not in a valid format, so it could not keep that connection ID and was given a new one." }, "80019": { "identifier": "token_request_failed", "title": "Token request failed", "summary": "The Ably SDK failed to retrieve a token from the configured authUrl or authCallback." }, "80020": { "identifier": "connection_discontinuity_message_rate_exceeded", "title": "Continuity lost as message delivery rate exceeded", "summary": "Messages were dropped because they were being delivered to the connection faster than its per-connection rate limit allows. Continuity is lost on the affected channels: they keep receiving new messages, but the dropped ones are not redelivered." }, "80021": { "identifier": "rate_limit_exceeded_account_connection_creation", "title": "Account-wide connection creation rate exceeded", "summary": "A connection was refused because new connections were being opened across the account faster than the permitted rate. The limit applies to the account as a whole rather than to any single connection." }, "80022": { "identifier": "connection_not_found", "title": "Connection not found", "summary": "A request referred to a connection that the server could not find, so the exchange could not continue and the client is signaled to reconnect. This is a lookup failure, not a loss of message continuity." }, "80023": { "identifier": "connection_re_established_in_a_different_region", "title": "Connection re-established in a different region", "summary": "The client reconnected to a different Ably region from the one it was using, so it could not keep its connection ID and was given a new one." }, "80024": { "identifier": "outdated_ably_sdk_version", "title": "Outdated Ably SDK version", "summary": "The connecting Ably SDK is an old version, and the way it connects to Ably is being retired. Connections from these SDK versions increasingly fail until they can no longer connect." }, "80030": { "identifier": "client_restriction_not_satisfied", "title": "Connection failed due to a client restriction", "summary": "The connection was refused because a restriction placed on the client was not met. Restrictions can limit which clients are allowed to connect based on conditions set for the application." }, "90000": { "identifier": "channel_operation_failed", "title": "Channel operation failed", "summary": "A channel operation, such as attaching, detaching, or publishing, could not be completed." }, "90001": { "identifier": "channel_operation_failed_invalid_channel_state", "title": "Channel in an invalid state for the operation", "summary": "A channel operation was attempted while the channel was not in a state that permits it, such as publishing or performing an action on a channel that is not currently attached." }, "90002": { "identifier": "channel_history_could_not_be_retrieved", "title": "Channel history could not be retrieved", "summary": "A request for a channel's message history could not be completed, because the position it asked to read from could not be resolved, because either the query was incomplete or the point requested is no longer retained." }, "90003": { "identifier": "channel_continuity_not_guaranteed", "title": "Channel continuity not guaranteed", "summary": "The client resumed a channel after being disconnected long enough that the point it had reached is no longer available to resume from. The channel reattaches from the earliest point still available, but continuity up to that point is not guaranteed." }, "90004": { "identifier": "channel_backlog_too_large", "title": "Channel backlog too large", "summary": "The client requested to resume or rewind a channel whose backlog held more messages than a single replay can deliver. The channel attaches, but the messages beyond that limit are not replayed." }, "90005": { "identifier": "channel_resumed_in_a_different_region", "title": "Channel resumed in a different region", "summary": "The client reconnected to a different Ably region from the one it was using, so the position it resumed from could not be applied. The channel attaches at the current point, and no earlier messages are replayed." }, "90006": { "identifier": "channel_history_request_had_no_limit", "title": "Channel history request had no limit", "summary": "A request for a channel's message history could not be served because it asked for the complete history with no limit on how many messages to return." }, "90007": { "identifier": "channel_operation_timed_out", "title": "Channel operation timed out", "summary": "A channel attach or detach did not complete within the expected time because no response was received from Ably. The operation may not have taken effect, and is usually the result of a transient interruption." }, "90008": { "identifier": "attach_point_not_found", "title": "Attach point too old for untilAttach history", "summary": "A history request using untilAttach relies on the channel's attach point still being among recent messages. In this case it was not, so the request could not be served and no messages were returned." }, "90009": { "identifier": "subscribe_mode_not_enabled", "title": "Subscribe operation failed as subscribe mode not enabled", "summary": "Messages could not be delivered to a subscriber because the channel had not requested the subscribe mode in its channel options. Messages are only delivered to clients that request that mode, so the listener never fires." }, "90010": { "identifier": "too_many_channels", "title": "Too many channels", "summary": "An operation was rejected because it would exceed the maximum number of channels permitted, either the channels attached to a single connection or those included in a single batch request." }, "90021": { "identifier": "rate_limit_exceeded_account_channel_creation", "title": "Account-wide channel creation rate exceeded", "summary": "Requests were rejected because the rate at which new channels were being created across the account exceeded the permitted limit. The limit counts channels newly activated within a period, not those already active." }, "91000": { "identifier": "cannot_enter_presence_without_a_client_id", "title": "Cannot enter presence without a clientId", "summary": "A request to enter the presence set was rejected because the connection had no clientId. Presence members are identified by their clientId, so one is required to enter." }, "91001": { "identifier": "cannot_enter_presence_in_the_channels_current_state", "title": "Cannot enter presence in the channel's current state", "summary": "A request to enter the presence set was rejected because the channel was not in a state that permits presence operations, such as a channel that is detached, suspended, or failed." }, "91002": { "identifier": "cannot_leave_presence_that_was_never_entered", "title": "Cannot leave presence that was never entered", "summary": "A request to leave the presence set was rejected because the clientId was not a member of it." }, "91003": { "identifier": "too_many_presence_members", "title": "Too many presence members", "summary": "A request to enter the presence set was rejected because the channel already held the maximum number of presence members permitted. The limit counts the members present on a single channel." }, "91004": { "identifier": "unable_to_automatically_re_enter_presence", "title": "Unable to automatically re-enter presence", "summary": "After reconnecting, the Ably SDK tried to re-enter the presence set on the client's behalf but the attempt did not succeed, so the member was not restored to the presence set." }, "91005": { "identifier": "presence_state_out_of_sync", "title": "Presence state out of sync", "summary": "The presence set held by the client no longer matched the state on Ably. The presence members are re-synchronized so the two are brought back into agreement." }, "91006": { "identifier": "total_presence_set_data_too_large", "title": "Total presence set data too large", "summary": "A request to enter the presence set was rejected because the combined size of the data held by members on the channel would exceed the maximum permitted for the presence set." }, "91007": { "identifier": "unexpected_loss_of_presence_membership", "title": "Unexpected loss of presence membership", "summary": "The connection was removed from the presence set despite still being active, so the channel was detached to prompt the Ably SDK to automatically re-enter presence. The condition is usually transient." }, "91008": { "identifier": "presence_subscribe_mode_not_enabled", "title": "Presence operation failed as presence_subscribe mode not enabled", "summary": "The presence members of a channel could not be retrieved because the channel had not requested the presence_subscribe mode in its channel options. Presence state is only delivered to clients that request that mode." }, "91100": { "identifier": "presence_member_left_as_their_connection_closed", "title": "Presence member left as their connection closed", "summary": "A presence member was removed from the presence set because it was no longer present, usually because the connection it entered on was closed." }, "92000": { "identifier": "invalid_object_message", "title": "Invalid LiveObjects message", "summary": "A LiveObjects message was rejected because it was invalid or did not conform to the expected structure. This usually indicates a problem with how the object operation was constructed before it was sent." }, "92001": { "identifier": "object_limit_exceeded", "title": "LiveObjects limit exceeded", "summary": "A LiveObjects operation was rejected because it exceeded a size limit set by the account: either the channel's total object size, or the maximum size of a single object." }, "92002": { "identifier": "operation_on_tombstone_object", "title": "LiveObjects operation on a deleted object", "summary": "An operation could not be applied because the target LiveObject had already been deleted. A deleted object is retained only as a marker, or tombstone, and can no longer be modified." }, "92003": { "identifier": "object_root_deleted", "title": "LiveObjects root has been deleted", "summary": "A LiveObjects object tree could not be fetched because the object at its root had already been deleted. A deleted object is retained only as a marker, or tombstone, and cannot serve as the root of a tree." }, "92004": { "identifier": "object_not_found", "title": "LiveObjects object not found", "summary": "A LiveObjects operation referenced an object that does not exist on the channel. The object may never have been created, or it may have been removed before the operation was applied." }, "92005": { "identifier": "no_objects_at_path", "title": "LiveObjects path matched no objects", "summary": "A LiveObjects operation specified a path within an object tree that did not resolve to any object. The path may be incorrect, or the objects it points to may not exist." }, "92006": { "identifier": "object_operation_missing_identifier_or_path", "title": "LiveObjects operation missing object reference", "summary": "A LiveObjects operation could not be performed because it specified neither an object identifier nor a path." }, "92007": { "identifier": "object_operation_path_not_processable", "title": "LiveObjects operation not valid for the path", "summary": "A LiveObjects operation could not be applied to the object at the specified path, because the operation is not compatible with the kind of object found there." }, "92008": { "identifier": "objects_sync_did_not_complete", "title": "LiveObjects sync did not complete", "summary": "A LiveObjects operation could not be applied because the channel had not finished synchronizing its objects." }, "93001": { "identifier": "annotation_subscribe_mode_not_enabled", "title": "Annotation listener without annotation_subscribe mode", "summary": "An annotation listener was added to a channel that had not requested the annotation_subscribe mode in its channel options. Annotations are only delivered to clients that explicitly request them, so the listener will not receive anything." }, "93002": { "identifier": "message_updates_not_enabled", "title": "Message annotations, updates, appends, and deletes not enabled", "summary": "An operation could not be performed because the channel did not have the 'Message annotations, updates, appends, and deletes' rule enabled." }, "101000": { "identifier": "space_name_is_empty", "title": "Space name is empty", "summary": "A space could not be created or referenced because no name was supplied." }, "101001": { "identifier": "space_must_be_entered_first", "title": "Space must be entered first", "summary": "An operation was attempted that requires having first entered the space. In Ably Spaces, actions such as updating a member's location or profile are only available once the space has been entered." }, "101002": { "identifier": "lock_request_already_pending", "title": "Lock request already pending", "summary": "A lock could not be requested because a request for the same lock is already in progress. In Ably Spaces, a member may only have one outstanding request for a given lock at a time." }, "101003": { "identifier": "lock_already_held", "title": "Lock already held", "summary": "A lock could not be acquired because it is currently held by another member. In Ably Spaces, only one member can hold a given lock at a time, and it must be released before another can take it." }, "101004": { "identifier": "lock_invalidated_by_concurrent_request", "title": "Lock invalidated by concurrent request", "summary": "A lock that appeared to be acquired was invalidated because another member requested the same lock concurrently and now holds it." }, "102000": { "identifier": "invalid_chat_room_name", "title": "Invalid chat room name", "summary": "A Chat room could not be used because the name supplied for it was not valid." }, "102001": { "identifier": "room_attach_failed_for_messages", "title": "Room attach failed for messages", "summary": "Attaching a Chat room failed because its messages feature could not be attached." }, "102002": { "identifier": "room_attach_failed_for_presence", "title": "Room attach failed for presence", "summary": "Attaching a Chat room failed because its presence feature could not be attached." }, "102003": { "identifier": "room_attach_failed_for_reactions", "title": "Room attach failed for reactions", "summary": "Attaching a Chat room failed because its reactions feature could not be attached." }, "102004": { "identifier": "room_attach_failed_for_occupancy", "title": "Room attach failed for occupancy", "summary": "Attaching a Chat room failed because its occupancy feature could not be attached." }, "102005": { "identifier": "room_attach_failed_for_typing", "title": "Room attach failed for typing", "summary": "Attaching a Chat room failed because its typing feature could not be attached." }, "102050": { "identifier": "room_detach_failed_for_messages", "title": "Room detach failed for messages", "summary": "Detaching a Chat room failed because its messages feature could not be detached." }, "102051": { "identifier": "room_detach_failed_for_presence", "title": "Room detach failed for presence", "summary": "Detaching a Chat room failed because its presence feature could not be detached." }, "102052": { "identifier": "room_detach_failed_for_reactions", "title": "Room detach failed for reactions", "summary": "Detaching a Chat room failed because its reactions feature could not be detached." }, "102053": { "identifier": "room_detach_failed_for_occupancy", "title": "Room detach failed for occupancy", "summary": "Detaching a Chat room failed because its occupancy feature could not be detached." }, "102054": { "identifier": "room_detach_failed_for_typing", "title": "Room detach failed for typing", "summary": "Detaching a Chat room failed because its typing feature could not be detached." }, "102100": { "identifier": "room_continuity_not_guaranteed", "title": "Room continuity not guaranteed", "summary": "A discontinuity was detected on the Chat room, so the continuity of messages could not be guaranteed. This usually follows a disconnection long enough that the room could not resume from where it left off." }, "102101": { "identifier": "room_is_in_the_failed_state", "title": "Room is in the failed state", "summary": "The operation could not be performed because the Chat room is in the failed state. A room enters this state when an earlier operation on it failed and could not recover." }, "102102": { "identifier": "room_is_being_released", "title": "Room is being released", "summary": "The operation could not be performed because the Chat room is in the process of being released." }, "102103": { "identifier": "room_has_been_released", "title": "Room has been released", "summary": "The operation could not be performed because the Chat room has already been released." }, "102104": { "identifier": "room_operation_failed_after_earlier_attempt", "title": "Room operation failed after earlier attempt", "summary": "The operation failed because a preceding attempt to perform it had already failed." }, "102105": { "identifier": "unknown_room_lifecycle_error", "title": "Unknown room lifecycle error", "summary": "An unexpected error occurred in the Chat room lifecycle that does not correspond to a known condition." }, "102106": { "identifier": "room_released_before_operation_completed", "title": "Room released before operation completed", "summary": "The operation could not complete because the Chat room was released while it was still in progress." }, "102107": { "identifier": "room_already_exists_with_different_options", "title": "Room already exists with different options", "summary": "A Chat room with the same name already exists but was created with different options. A room must be released before it can be requested again with a different configuration." }, "102108": { "identifier": "feature_not_enabled_in_room_options", "title": "Feature not enabled in room options", "summary": "The operation required a feature that was not enabled when the Chat room was created. Features such as presence or typing indicators must be enabled in the room options to be used." }, "102109": { "identifier": "history_requested_for_an_unsubscribed_listener", "title": "History requested for an unsubscribed listener", "summary": "A request for the messages published before a listener's subscription point was rejected because that listener was not subscribed. This history is only available while the listener is subscribed to the room." }, "102110": { "identifier": "channel_serial_not_defined", "title": "Channel serial not defined", "summary": "A channel serial was expected but was not defined at the point it was needed." }, "102111": { "identifier": "channel_options_modified_after_request", "title": "Channel options modified after request", "summary": "Channel options could not be changed because the underlying channel had already been requested." }, "102112": { "identifier": "room_is_in_an_invalid_state", "title": "Room is in an invalid state", "summary": "The operation could not be performed because the Chat room was in a state that does not permit it." }, "102113": { "identifier": "sequential_execution_could_not_be_enforced", "title": "Sequential execution could not be enforced", "summary": "The operation failed because its sequential execution could not be enforced. Chat room lifecycle operations are expected to run one at a time, and that ordering could not be guaranteed." }, "102200": { "identifier": "hook_used_outside_its_provider", "title": "Hook used outside its provider", "summary": "An Ably Chat React hook was used in a component that is not wrapped in the required provider. The hooks depend on context supplied by a provider higher in the component tree." }, "102201": { "identifier": "component_unmounted_before_completion", "title": "Component unmounted before completion", "summary": "An operation started by the Ably Chat React hooks could not finish because the React component was unmounted while it was still in progress." }, "102202": { "identifier": "presence_data_could_not_be_fetched", "title": "Presence data could not be fetched", "summary": "The Ably Chat React hooks could not retrieve presence data after the maximum number of retries. This usually points to a persistent problem reaching presence rather than a transient one." }, "103000": { "identifier": "unable_to_publish_push_notification", "title": "Push notification internal error", "summary": "The push notification was not delivered because of an unexpected error within the Ably platform during preparation, dispatch, or requeue. The cause is not related to the contents of the request or the device's registration." }, "103001": { "identifier": "push_publish_retries_exhausted", "title": "Push notification retry limit reached", "summary": "The push notification was not delivered because the configured retry limit was reached after repeated unsuccessful delivery attempts. The underlying failures are typically transient, such as provider outages, rate limits, or network errors." }, "103002": { "identifier": "push_direct_publish_no_recipient", "title": "Push notification recipient missing", "summary": "The push notification was not delivered because the direct push request was submitted without a recipient device. Direct push targets a single device by ID and cannot be processed when no recipient is supplied." }, "103003": { "identifier": "push_cannot_handle_body", "title": "Push notification body invalid", "summary": "The push notification was not delivered because its body could not be processed. This typically indicates a malformed or unsupported message structure in the publish request." }, "103004": { "identifier": "push_notification_rejected_by_provider", "title": "Push notification rejected by provider", "summary": "The push notification was not delivered because the provider (APNs, FCM, or WebPush) rejected the request due to a problem with the payload or delivery parameters. Typical causes include an oversized payload, a disallowed topic, or an unsupported field." }, "103005": { "identifier": "push_device_token_invalid", "title": "Push device token invalid", "summary": "The push notification was not delivered because the provider (APNs, FCM, or WebPush) rejected the device's push token as invalid for the configured application. The token may have been issued under different credentials or for a different application." }, "103006": { "identifier": "push_transport_not_configured", "title": "Push transport not configured", "summary": "The push notification was not delivered because the device's push notification provider (APNs, FCM, or WebPush) has no credentials configured on the application. No deliveries can be made through that provider until the credentials are present." }, "103007": { "identifier": "push_notification_provider_unreachable", "title": "Push notification provider unreachable", "summary": "The push notification was not delivered because the provider (APNs, FCM, or WebPush) could not be reached, returned a server error, or sent a response that could not be processed. The condition is usually transient." }, "103008": { "identifier": "push_transport_credentials_invalid", "title": "Push transport credentials invalid", "summary": "A push notification could not be sent because the credentials configured for the target platform were rejected or had expired, such as an expired APNs certificate." }, "103009": { "identifier": "push_not_enabled_for_cluster", "title": "Push notifications not enabled for the cluster", "summary": "The push notification was not accepted for delivery because push notifications are not enabled in the cluster handling the request. On a dedicated cluster, push notifications have to be turned on by Ably before any can be sent." }, "104000": { "identifier": "streamed_message_finalize_failed", "title": "Streamed message could not be finalized", "summary": "Completing or cancelling a streamed message failed. One of its appends was not published, and the follow-up attempt to repair it by re-sending the accumulated content in a single update also failed." }, "104001": { "identifier": "session_subscription_failed", "title": "Session subscription failed", "summary": "An AI Transport session could not subscribe to and attach its channel while connecting. The channel may have been rejected, unreachable, or in a failed state, so the session can neither send nor receive." }, "104002": { "identifier": "run_cancel_handler_failed", "title": "Run cancel handler failed", "summary": "A developer-supplied onCancel hook threw while AI Transport was processing a cancel message for a run. The cancel is not carried out, so the run continues as though the message had not arrived." }, "104003": { "identifier": "run_lifecycle_event_publish_failed", "title": "Run lifecycle event publish failed", "summary": "The publish of a run's start, suspend, or end, or of one of its steps' start or end, was rejected, or the channel was unavailable. Clients therefore do not observe the run or step entering that phase." }, "104004": { "identifier": "session_closed", "title": "Session already closed", "summary": "An operation was attempted on an AI Transport session, view, or encoder that has already been closed. Once closed, these cannot send, receive, or be reopened." }, "104005": { "identifier": "session_send_failed", "title": "Session send failed", "summary": "An AI Transport send or steer could not be delivered. Either publishing it to the channel failed, or, in the Vercel chat transport, the HTTP POST to the agent endpoint failed with a network error or a non-2xx response." }, "104006": { "identifier": "session_continuity_not_guaranteed", "title": "Session continuity not guaranteed", "summary": "After an AI Transport session's channel first attached, it entered a failed, suspended, or detached state, or re-attached without resuming, so the SDK can no longer guarantee that active streams received every event." }, "104007": { "identifier": "session_channel_not_ready", "title": "Session channel not ready", "summary": "An AI Transport send was attempted while the session's channel was not in a usable state, neither attached nor attaching, so there was no reliable channel to publish on." }, "104008": { "identifier": "run_response_stream_failed", "title": "Run response stream failed", "summary": "An AI Transport run's response could not be streamed to the channel: the source event stream threw, or an underlying publish failed mid-stream." }, "104009": { "identifier": "session_message_processing_failed", "title": "Inbound message processing failed", "summary": "Processing a message that arrived on an AI Transport session's channel threw, so that one message was not folded into session state. The session's subscription survives, and it keeps sending and receiving." }, "104010": { "identifier": "adopted_run_start_not_observed", "title": "Adopted run start not observed", "summary": "A fresh process adopting an AI Transport run waited for that run's start event to appear on the channel, but the wait timed out before it was seen." }, "104011": { "identifier": "session_history_fetch_failed", "title": "Session history fetch failed", "summary": "Loading an AI Transport session's channel history failed after retries, so the messages needed to rebuild session state could not be retrieved." }, "104012": { "identifier": "run_steer_handler_failed", "title": "Run steer handler failed", "summary": "A developer-supplied onSteer hook threw while AI Transport was notifying a run that a steering message had folded into it. The run itself is unaffected, because only the notification failed." }, "104013": { "identifier": "run_cancel_routing_failed", "title": "Run cancel routing failed", "summary": "AI Transport could not deliver an inbound cancel message to the run it targets. The cancel was neither carried out nor rejected, so the run continues as though the message had not arrived." } } }