From b04c7731609126c33bc59a8c59fe647096fc65bf Mon Sep 17 00:00:00 2001 From: Lewis Marshall Date: Sat, 25 Jul 2026 13:16:46 +0100 Subject: [PATCH] Bump ably-common and regenerate error-code pages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bump the ably-common submodule to main (error docs now merged there) and regenerate: adds code 40182, refines two identifiers (40180, 93002 — the bare-code redirects keep code-based links working), and picks up copy updates across many existing entries. Co-Authored-By: Claude Opus 4.8 (1M context) --- ably-common | 2 +- src/pages/docs/platform/errors/codes.mdx | 47 ++++++++++--------- .../platform/errors/codes/10000-no-error.mdx | 4 ++ .../codes/101000-space-name-is-empty.mdx | 12 +++++ .../101001-space-must-be-entered-first.mdx | 12 +++++ .../101002-lock-request-already-pending.mdx | 12 +++++ .../errors/codes/101003-lock-already-held.mdx | 12 +++++ ...lock-invalidated-by-concurrent-request.mdx | 12 +++++ .../103001-push-publish-retries-exhausted.mdx | 4 +- ...push-notification-rejected-by-provider.mdx | 4 +- .../103005-push-device-token-invalid.mdx | 4 +- .../103006-push-transport-not-configured.mdx | 4 +- ...push-notification-provider-unreachable.mdx | 4 +- .../errors/codes/20000-general-error.mdx | 12 +++++ .../errors/codes/40000-bad-request.mdx | 12 +++++ .../codes/40001-invalid-request-body.mdx | 12 +++++ .../codes/40003-invalid-parameter-value.mdx | 12 +++++ .../errors/codes/40005-invalid-credential.mdx | 12 +++++ ...message-contains-invalid-connection-id.mdx | 12 +++++ .../codes/40009-max-message-size-exceeded.mdx | 2 +- .../codes/40010-invalid-channel-name.mdx | 12 +++++ ...11-pagination-sequence-no-longer-valid.mdx | 12 +++++ .../errors/codes/40012-invalid-client-id.mdx | 12 +++++ .../codes/40013-invalid-data-or-encoding.mdx | 12 +++++ .../errors/codes/40015-invalid-device-id.mdx | 12 +++++ .../codes/40016-invalid-message-name.mdx | 12 +++++ .../40017-unsupported-protocol-version.mdx | 12 +++++ .../codes/40018-delta-decoding-failed.mdx | 4 +- .../codes/40020-batch-request-error.mdx | 12 +++++ .../40022-api-streamer-no-longer-offered.mdx | 12 +++++ .../40024-incompatible-site-for-history.mdx | 8 ++-- .../codes/40030-invalid-publish-request.mdx | 12 +++++ ...31-invalid-client-specified-message-id.mdx | 12 +++++ .../40032-invalid-message-extras-field.mdx | 12 +++++ .../errors/codes/40100-unauthorized.mdx | 12 +++++ .../codes/40101-invalid-credentials.mdx | 16 ++++++- .../codes/40102-incompatible-credentials.mdx | 16 ++++++- ...e-of-basic-auth-over-non-tls-transport.mdx | 12 +++++ ...est-timestamp-outside-permitted-window.mdx | 12 +++++ .../codes/40105-nonce-value-replayed.mdx | 12 +++++ ...o-valid-authentication-method-provided.mdx | 16 ++++++- ...0111-account-connection-limit-exceeded.mdx | 12 +++++ .../40112-account-message-limit-exceeded.mdx | 12 +++++ .../40114-account-channel-limit-exceeded.mdx | 12 +++++ .../40115-account-request-limit-exceeded.mdx | 12 +++++ .../40121-token-revocation-not-enabled.mdx | 4 +- ...application-integration-limit-exceeded.mdx | 12 +++++ ...127-application-api-key-limit-exceeded.mdx | 12 +++++ .../errors/codes/40131-key-revoked.mdx | 18 ++++++- ...133-wrong-api-key-for-token-revocation.mdx | 12 +++++ .../errors/codes/40141-token-revoked.mdx | 16 +++++++ .../errors/codes/40142-token-expired.mdx | 2 +- .../errors/codes/40144-invalid-jwt.mdx | 12 +++++ .../errors/codes/40160-capability-denied.mdx | 8 ++-- .../40161-identified-client-required.mdx | 12 +++++ ...nnel-mode-not-requested-when-attaching.mdx | 10 ++-- ...fied-client-cannot-modify-own-messages.mdx | 6 +-- ...40170-error-from-client-token-callback.mdx | 12 +++++ .../40171-token-renewal-not-configured.mdx | 12 +++++ ...n-authentication-required-for-location.mdx | 11 +++++ ...180-apns-token-authentication-required.mdx | 11 ----- ...hentication-required-for-push-to-start.mdx | 11 +++++ .../platform/errors/codes/40300-forbidden.mdx | 12 +++++ ...-application-requires-a-tls-connection.mdx | 12 +++++ ...unt-not-permitted-in-cluster-or-region.mdx | 12 +++++ ...40331-account-not-permitted-in-cluster.mdx | 12 +++++ .../40332-account-not-permitted-in-region.mdx | 12 +++++ .../platform/errors/codes/40400-not-found.mdx | 12 +++++ .../codes/42200-unprocessable-content.mdx | 4 +- .../errors/codes/42210-content-rejected.mdx | 4 +- ...-limit-exceeded-per-connection-inbound.mdx | 2 +- ...ate-limit-exceeded-per-channel-inbound.mdx | 2 +- ...e-limit-exceeded-per-channel-bandwidth.mdx | 2 +- ...limit-exceeded-per-connection-outbound.mdx | 2 +- ...-limit-exceeded-per-connection-backlog.mdx | 2 +- ...7-rate-limit-exceeded-account-messages.mdx | 2 +- ...te-limit-exceeded-account-api-requests.mdx | 2 +- ...-exceeded-per-connection-inbound-fatal.mdx | 8 ++-- ...te-limit-exceeded-account-integrations.mdx | 2 +- ...it-exceeded-account-push-notifications.mdx | 2 +- .../errors/codes/50000-internal-error.mdx | 12 +++++ .../codes/50001-internal-channel-error.mdx | 12 +++++ .../codes/50002-internal-connection-error.mdx | 12 +++++ .../errors/codes/50003-timeout-error.mdx | 12 +++++ .../71302-no-subscription-to-product.mdx | 12 +++++ .../codes/72000-livesync-operation-failed.mdx | 12 +++++ .../72003-livesync-cannot-connect-db.mdx | 12 +++++ .../codes/72004-livesync-no-channel-key.mdx | 12 +++++ .../codes/72005-livesync-invalid-pipeline.mdx | 12 +++++ .../codes/72006-livesync-cannot-resume.mdx | 12 +++++ ...007-livesync-cannot-store-resume-token.mdx | 12 +++++ .../errors/codes/80000-connection-failed.mdx | 12 +++++ .../codes/80002-connection-suspended.mdx | 12 +++++ .../80005-connection-no-longer-available.mdx | 4 +- .../codes/80014-connection-timed-out.mdx | 12 +++++ ...016-connection-replaced-by-a-newer-one.mdx | 16 ++++++- .../errors/codes/80017-connection-closed.mdx | 12 +++++ .../codes/80019-token-request-failed.mdx | 12 +++++ ...on-discontinuity-message-rate-exceeded.mdx | 2 +- ...t-exceeded-account-connection-creation.mdx | 12 +++++ .../codes/80022-connection-not-found.mdx | 12 +++++ ...n-re-established-in-a-different-region.mdx | 4 +- .../codes/80024-outdated-ably-sdk-version.mdx | 2 +- ...operation-failed-invalid-channel-state.mdx | 12 +++++ ...channel-history-could-not-be-retrieved.mdx | 4 +- ...0003-channel-continuity-not-guaranteed.mdx | 4 +- .../codes/90004-channel-backlog-too-large.mdx | 2 +- ...-channel-resumed-in-a-different-region.mdx | 2 +- .../90007-channel-operation-timed-out.mdx | 12 +++++ .../codes/90008-attach-point-not-found.mdx | 8 ++-- .../errors/codes/90010-too-many-channels.mdx | 12 +++++ ...imit-exceeded-account-channel-creation.mdx | 12 +++++ ...not-enter-presence-without-a-client-id.mdx | 12 +++++ ...presence-in-the-channels-current-state.mdx | 12 +++++ .../codes/91003-too-many-presence-members.mdx | 12 +++++ .../91005-presence-state-out-of-sync.mdx | 12 +++++ .../codes/92000-invalid-object-message.mdx | 12 +++++ .../codes/92001-object-limit-exceeded.mdx | 16 ++++++- .../92002-operation-on-tombstone-object.mdx | 12 +++++ .../codes/92003-object-root-deleted.mdx | 12 +++++ .../errors/codes/92004-object-not-found.mdx | 12 +++++ .../errors/codes/92005-no-objects-at-path.mdx | 12 +++++ ...t-operation-missing-identifier-or-path.mdx | 12 +++++ ...-object-operation-path-not-processable.mdx | 12 +++++ .../92008-objects-sync-did-not-complete.mdx | 12 +++++ .../93002-message-updates-not-enabled.mdx | 23 +++++++++ .../93002-mutable-messages-not-enabled.mdx | 11 ----- 127 files changed, 1177 insertions(+), 123 deletions(-) create mode 100644 src/pages/docs/platform/errors/codes/40180-apns-token-authentication-required-for-location.mdx delete mode 100644 src/pages/docs/platform/errors/codes/40180-apns-token-authentication-required.mdx create mode 100644 src/pages/docs/platform/errors/codes/40182-apns-token-authentication-required-for-push-to-start.mdx create mode 100644 src/pages/docs/platform/errors/codes/93002-message-updates-not-enabled.mdx delete mode 100644 src/pages/docs/platform/errors/codes/93002-mutable-messages-not-enabled.mdx diff --git a/ably-common b/ably-common index fcc793b056..3bcbe0a110 160000 --- a/ably-common +++ b/ably-common @@ -1 +1 @@ -Subproject commit fcc793b05663d59665377dcdf5276c3a4a08ba89 +Subproject commit 3bcbe0a1109e7d217714f352e8e95509be781a60 diff --git a/src/pages/docs/platform/errors/codes.mdx b/src/pages/docs/platform/errors/codes.mdx index 3cf8abbdbe..cfaa4b2750 100644 --- a/src/pages/docs/platform/errors/codes.mdx +++ b/src/pages/docs/platform/errors/codes.mdx @@ -43,7 +43,7 @@ Every Ably error code, its identifier, and a short description. Select a code fo | [40015](/docs/platform/errors/codes/40015-invalid-device-id)
invalid_device_id | Invalid device ID | The device ID supplied for a push notification operation was missing or not in an acceptable form, so the request was rejected. | |
[40016](/docs/platform/errors/codes/40016-invalid-message-name)
invalid_message_name | Invalid message name | A message supplied a name that was invalid, so the message was rejected. | |
[40017](/docs/platform/errors/codes/40017-unsupported-protocol-version)
unsupported_protocol_version | Unsupported protocol version | 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](/docs/platform/errors/codes/40018-delta-decoding-failed)
delta_decoding_failed | Message delta could not be applied | 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. | +|
[40018](/docs/platform/errors/codes/40018-delta-decoding-failed)
delta_decoding_failed | Message delta could not be applied | 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](/docs/platform/errors/codes/40019-missing-plugin)
missing_plugin | Required SDK plugin not present | 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](/docs/platform/errors/codes/40020-batch-request-error)
batch_request_error | Batch request error | A batch request completed with one or more of its items failing. Each failing item carries its own error, reported alongside this one. | |
[40021](/docs/platform/errors/codes/40021-feature-requires-a-newer-platform-version)
feature_requires_a_newer_platform_version | Feature requires a newer platform version | 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. | @@ -59,12 +59,12 @@ Every Ably error code, its identifier, and a short description. Select a code fo |
[40035](/docs/platform/errors/codes/40035-integration-message-filter-regex-not-re2-compatible)
integration_message_filter_regex_not_re2_compatible | Integration message filter regex not RE2-compatible | 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](/docs/platform/errors/codes/40099-reserved-for-testing)
reserved_for_testing | Reserved for testing | 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](/docs/platform/errors/codes/40100-unauthorized)
unauthorized | Unauthorized | A connection or request was rejected because it was not authorized. | -|
[40101](/docs/platform/errors/codes/40101-invalid-credentials)
invalid_credentials | Authentication failed | 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](/docs/platform/errors/codes/40102-incompatible-credentials)
incompatible_credentials | Incompatible credentials | 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. | +|
[40101](/docs/platform/errors/codes/40101-invalid-credentials)
invalid_credentials | Authentication failed | 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](/docs/platform/errors/codes/40102-incompatible-credentials)
incompatible_credentials | Incompatible credentials | 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](/docs/platform/errors/codes/40103-invalid-use-of-basic-auth-over-non-tls-transport)
invalid_use_of_basic_auth_over_non_tls_transport | Basic authentication used over an insecure connection | 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](/docs/platform/errors/codes/40104-token-request-timestamp-outside-permitted-window)
token_request_timestamp_outside_permitted_window | Token request timestamp outside permitted window | 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](/docs/platform/errors/codes/40105-nonce-value-replayed)
nonce_value_replayed | Nonce value replayed | 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](/docs/platform/errors/codes/40106-no-valid-authentication-method-provided)
no_valid_authentication_method_provided | No valid authentication method provided | 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. | +|
[40106](/docs/platform/errors/codes/40106-no-valid-authentication-method-provided)
no_valid_authentication_method_provided | No valid authentication method provided | 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](/docs/platform/errors/codes/40110-account-disabled)
account_disabled | Account disabled | 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](/docs/platform/errors/codes/40111-account-connection-limit-exceeded)
account_connection_limit_exceeded | Account connection limit exceeded | A new connection was refused because the account had reached the maximum number of concurrent connections permitted by its limits. | |
[40112](/docs/platform/errors/codes/40112-account-message-limit-exceeded)
account_message_limit_exceeded | Account message limit exceeded | The request was rejected because the account had reached the maximum message volume permitted by its limits. | @@ -72,13 +72,13 @@ Every Ably error code, its identifier, and a short description. Select a code fo |
[40114](/docs/platform/errors/codes/40114-account-channel-limit-exceeded)
account_channel_limit_exceeded | Account channel limit exceeded | The request was refused because the account had reached the maximum number of concurrent channels permitted by its limits. | |
[40115](/docs/platform/errors/codes/40115-account-request-limit-exceeded)
account_request_limit_exceeded | Account request limit exceeded | The request was refused because the account had reached its permitted limit on API and token requests. | |
[40120](/docs/platform/errors/codes/40120-application-disabled)
application_disabled | Application disabled | The request was rejected because the application it targets is disabled. While an application is disabled, it cannot authenticate or carry traffic. | -|
[40121](/docs/platform/errors/codes/40121-token-revocation-not-enabled)
token_revocation_not_enabled | Token revocation not enabled | 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. | +|
[40121](/docs/platform/errors/codes/40121-token-revocation-not-enabled)
token_revocation_not_enabled | Token revocation not enabled | 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](/docs/platform/errors/codes/40125-application-integration-limit-exceeded)
application_integration_limit_exceeded | Application integration limit exceeded | An integration could not be created because the application had reached the maximum number of integrations permitted by its limits. | |
[40126](/docs/platform/errors/codes/40126-application-channel-rule-limit-exceeded)
application_channel_rule_limit_exceeded | Application channel rule limit exceeded | A channel rule could not be created because the application had reached the maximum number of channel rules permitted by its limits. | |
[40127](/docs/platform/errors/codes/40127-application-api-key-limit-exceeded)
application_api_key_limit_exceeded | Application API key limit exceeded | A new API key could not be created because the application had reached the maximum number of keys permitted by its limits. | |
[40128](/docs/platform/errors/codes/40128-account-application-limit-exceeded)
account_application_limit_exceeded | Account application limit exceeded | A new application could not be created because the account had reached the maximum number of applications it is permitted. | |
[40130](/docs/platform/errors/codes/40130-key-error)
key_error | API key not recognized | Authentication failed because the API key presented was not recognized. This usually means the key does not exist or has been removed. | -|
[40131](/docs/platform/errors/codes/40131-key-revoked)
key_revoked | API key revoked | A connection or request was rejected because the API key it used has been revoked. A revoked key is permanently invalidated and can no longer authenticate. | +|
[40131](/docs/platform/errors/codes/40131-key-revoked)
key_revoked | API key revoked | 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](/docs/platform/errors/codes/40132-key-expired)
key_expired | API key expired | 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](/docs/platform/errors/codes/40133-wrong-api-key-for-token-revocation)
wrong_api_key_for_token_revocation | Wrong API key for token revocation | 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](/docs/platform/errors/codes/40140-token-error-unspecified)
token_error_unspecified | Token not accepted | 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. | @@ -89,18 +89,19 @@ Every Ably error code, its identifier, and a short description. Select a code fo |
[40145](/docs/platform/errors/codes/40145-invalid-ably-token)
invalid_ably_token | Invalid Ably token | An Ably token presented for authentication could not be parsed, so its contents could not be read. | |
[40150](/docs/platform/errors/codes/40150-application-connection-limit-exceeded)
application_connection_limit_exceeded | Application connection limit exceeded | A new connection was refused because the application had reached the maximum number of concurrent connections permitted for it. | |
[40151](/docs/platform/errors/codes/40151-token-connection-limit-exceeded)
token_connection_limit_exceeded | Token connection limit exceeded | A connection was refused because the number of concurrent connections using the same token had reached the maximum permitted for a single token. | -|
[40160](/docs/platform/errors/codes/40160-capability-denied)
capability_denied | Client lacks the required capability | 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. | +|
[40160](/docs/platform/errors/codes/40160-capability-denied)
capability_denied | Client lacks the required capability | 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](/docs/platform/errors/codes/40161-identified-client-required)
identified_client_required | Operation requires an identified client | The client had no established client ID, so an operation that requires one was refused. | |
[40162](/docs/platform/errors/codes/40162-operation-requires-basic-authentication)
operation_requires_basic_authentication | Operation requires Basic authentication | 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](/docs/platform/errors/codes/40163-token-revocation-not-enabled-for-api-key)
token_revocation_not_enabled_for_api_key | Token revocation not enabled for API key | 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](/docs/platform/errors/codes/40164-token-revocation-not-enabled-for-api-key-40164)
token_revocation_not_enabled_for_api_key_40164 | Token revocation not enabled for API key | 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](/docs/platform/errors/codes/40165-channel-mode-not-requested-when-attaching)
channel_mode_not_requested_when_attaching | Channel mode not requested when attaching | 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](/docs/platform/errors/codes/40166-unidentified-client-cannot-modify-own-messages)
unidentified_client_cannot_modify_own_messages | Unidentified client cannot modify own messages | 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. | +|
[40165](/docs/platform/errors/codes/40165-channel-mode-not-requested-when-attaching)
channel_mode_not_requested_when_attaching | Channel mode not requested when attaching | 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](/docs/platform/errors/codes/40166-unidentified-client-cannot-modify-own-messages)
unidentified_client_cannot_modify_own_messages | Unidentified client cannot modify own messages | 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. | |
[40170](/docs/platform/errors/codes/40170-error-from-client-token-callback)
error_from_client_token_callback | Token callback failed | 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](/docs/platform/errors/codes/40171-token-renewal-not-configured)
token_renewal_not_configured | Token renewal not configured | 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](/docs/platform/errors/codes/40172-operation-requires-token-authentication)
operation_requires_token_authentication | Operation requires Token authentication | 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](/docs/platform/errors/codes/40180-apns-token-authentication-required)
apns_token_authentication_required | APNs token authentication required | A location or live-activity notification was not sent because these require the app's APNs credentials to use token-based authentication, but the app is not configured that way. | +|
[40180](/docs/platform/errors/codes/40180-apns-token-authentication-required-for-location)
apns_token_authentication_required_for_location | APNs token authentication required for location notification | 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](/docs/platform/errors/codes/40181-no-location-token-for-device)
no_location_token_for_device | No location token for device | 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](/docs/platform/errors/codes/40182-apns-token-authentication-required-for-push-to-start)
apns_token_authentication_required_for_push_to_start | APNs token authentication required for push-to-start Live Activities notification | 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](/docs/platform/errors/codes/40300-forbidden)
forbidden | Forbidden | 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](/docs/platform/errors/codes/40310-account-does-not-permit-tls-connections)
account_does_not_permit_tls_connections | Account does not permit TLS connections | The connection was rejected because it used TLS, but the account is configured not to allow TLS connections. | |
[40311](/docs/platform/errors/codes/40311-application-requires-a-tls-connection)
application_requires_a_tls_connection | Application requires a TLS connection | The connection was rejected because it did not use TLS, but the application requires TLS connections. | @@ -122,8 +123,8 @@ Every Ably error code, its identifier, and a short description. Select a code fo | Code | Title | Summary | | --- | --- | --- | -|
[42200](/docs/platform/errors/codes/42200-unprocessable-content)
unprocessable_content | Message content could not be processed | 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](/docs/platform/errors/codes/42210-content-rejected)
content_rejected | Message content rejected | A message was rejected by a content check — such as validation, moderation, or an integration — but the error does not identify which one. | +|
[42200](/docs/platform/errors/codes/42200-unprocessable-content)
unprocessable_content | Message content could not be processed | 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](/docs/platform/errors/codes/42210-content-rejected)
content_rejected | Message content rejected | A message was rejected by a content check (such as validation, moderation, or an integration), but the error does not identify which one. | |
[42211](/docs/platform/errors/codes/42211-content-rejected-by-before-publish-integration)
content_rejected_by_before_publish_integration | Message rejected by integration | A message was rejected by an integration configured to check messages before they are accepted. | |
[42212](/docs/platform/errors/codes/42212-content-rejected-by-validation)
content_rejected_by_validation | Message rejected by content validation | A message was rejected because it failed a content-validation check. | |
[42213](/docs/platform/errors/codes/42213-content-rejected-by-moderation)
content_rejected_by_moderation | Message rejected by moderation | 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. | @@ -137,7 +138,7 @@ Every Ably error code, its identifier, and a short description. Select a code fo |
[42917](/docs/platform/errors/codes/42917-rate-limit-exceeded-account-messages)
rate_limit_exceeded_account_messages | Account-wide message publish rate exceeded | 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](/docs/platform/errors/codes/42918-rate-limit-exceeded-account-api-requests)
rate_limit_exceeded_account_api_requests | Account-wide API request rate exceeded | 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](/docs/platform/errors/codes/42920-rate-limit-exceeded-connection-fatal)
rate_limit_exceeded_connection_fatal | Connection terminated by a fatal rate limit | 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](/docs/platform/errors/codes/42921-rate-limit-exceeded-per-connection-inbound-fatal)
rate_limit_exceeded_per_connection_inbound_fatal | Connection terminated for far exceeding the per-connection publish rate | 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. | +|
[42921](/docs/platform/errors/codes/42921-rate-limit-exceeded-per-connection-inbound-fatal)
rate_limit_exceeded_per_connection_inbound_fatal | Connection terminated for far exceeding the per-connection publish rate | 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](/docs/platform/errors/codes/42922-rate-limit-exceeded-too-many-requests)
rate_limit_exceeded_too_many_requests | Too many requests | 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](/docs/platform/errors/codes/42923-integration-target-rate-limit-response)
integration_target_rate_limit_response | Integration target responded with rate limit error | 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](/docs/platform/errors/codes/42924-rate-limit-exceeded-protocol-message-rate-fatal)
rate_limit_exceeded_protocol_message_rate_fatal | Per-connection protocol message rate exceeded | 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. | @@ -216,7 +217,7 @@ Every Ably error code, its identifier, and a short description. Select a code fo |
[80002](/docs/platform/errors/codes/80002-connection-suspended)
connection_suspended | Connection suspended | 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](/docs/platform/errors/codes/80003-connection-disconnected)
connection_disconnected | Connection disconnected | 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](/docs/platform/errors/codes/80004-connection-already-established)
connection_already_established | Connection already established | A request to open a connection was made while a connection was already active. | -|
[80005](/docs/platform/errors/codes/80005-connection-no-longer-available)
connection_no_longer_available | Connection no longer available | 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. | +|
[80005](/docs/platform/errors/codes/80005-connection-no-longer-available)
connection_no_longer_available | Connection no longer available | 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](/docs/platform/errors/codes/80006-connection-messages-expired)
connection_messages_expired | Connection continuity not guaranteed as messages expired | 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](/docs/platform/errors/codes/80007-connection-message-limit-exceeded)
connection_message_limit_exceeded | Connection continuity not guaranteed as message limit exceeded | 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](/docs/platform/errors/codes/80008-connection-recovery-failed-on-an-outdated-sdk)
connection_recovery_failed_on_an_outdated_sdk | Connection recovery failed on an outdated SDK | 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. | @@ -227,7 +228,7 @@ Every Ably error code, its identifier, and a short description. Select a code fo |
[80013](/docs/platform/errors/codes/80013-protocol-error)
protocol_error | Protocol error | 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](/docs/platform/errors/codes/80014-connection-timed-out)
connection_timed_out | Connection timed out | 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](/docs/platform/errors/codes/80015-incompatible-connection-parameters)
incompatible_connection_parameters | Incompatible connection parameters | 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](/docs/platform/errors/codes/80016-connection-replaced-by-a-newer-one)
connection_replaced_by_a_newer_one | Connection replaced by a newer one | An operation was attempted on a connection that was no longer current — a newer connection had replaced it, or its transport handle had been recycled — so the operation could not be applied and the client re-establishes to continue. | +|
[80016](/docs/platform/errors/codes/80016-connection-replaced-by-a-newer-one)
connection_replaced_by_a_newer_one | Connection replaced by a newer one | 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](/docs/platform/errors/codes/80017-connection-closed)
connection_closed | Connection closed | 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](/docs/platform/errors/codes/80018-invalid-connection-key)
invalid_connection_key | Invalid connection key | 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](/docs/platform/errors/codes/80019-token-request-failed)
token_request_failed | Token request failed | The Ably SDK failed to retrieve a token from the configured authUrl or authCallback. | @@ -244,7 +245,7 @@ Every Ably error code, its identifier, and a short description. Select a code fo | --- | --- | --- | |
[90000](/docs/platform/errors/codes/90000-channel-operation-failed)
channel_operation_failed | Channel operation failed | A channel operation, such as attaching, detaching, or publishing, could not be completed. | |
[90001](/docs/platform/errors/codes/90001-channel-operation-failed-invalid-channel-state)
channel_operation_failed_invalid_channel_state | Channel in an invalid state for the operation | 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](/docs/platform/errors/codes/90002-channel-history-could-not-be-retrieved)
channel_history_could_not_be_retrieved | Channel history could not be retrieved | A request for a channel's message history could not be completed, because the position it asked to read from could not be resolved — either the query was incomplete or the point requested is no longer retained. | +|
[90002](/docs/platform/errors/codes/90002-channel-history-could-not-be-retrieved)
channel_history_could_not_be_retrieved | Channel history could not be retrieved | 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](/docs/platform/errors/codes/90003-channel-continuity-not-guaranteed)
channel_continuity_not_guaranteed | Channel continuity not guaranteed | 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](/docs/platform/errors/codes/90004-channel-backlog-too-large)
channel_backlog_too_large | Channel backlog too large | 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](/docs/platform/errors/codes/90005-channel-resumed-in-a-different-region)
channel_resumed_in_a_different_region | Channel resumed in a different region | 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. | @@ -275,7 +276,7 @@ Every Ably error code, its identifier, and a short description. Select a code fo | Code | Title | Summary | | --- | --- | --- | |
[92000](/docs/platform/errors/codes/92000-invalid-object-message)
invalid_object_message | Invalid LiveObjects message | 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](/docs/platform/errors/codes/92001-object-limit-exceeded)
object_limit_exceeded | LiveObjects limit exceeded | A LiveObjects operation was rejected because it would take the channel beyond the maximum number of objects it is allowed to hold. The limit is set by the account. | +|
[92001](/docs/platform/errors/codes/92001-object-limit-exceeded)
object_limit_exceeded | LiveObjects limit exceeded | 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](/docs/platform/errors/codes/92002-operation-on-tombstone-object)
operation_on_tombstone_object | LiveObjects operation on a deleted object | 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](/docs/platform/errors/codes/92003-object-root-deleted)
object_root_deleted | LiveObjects root has been deleted | 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](/docs/platform/errors/codes/92004-object-not-found)
object_not_found | LiveObjects object not found | 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. | @@ -289,7 +290,7 @@ Every Ably error code, its identifier, and a short description. Select a code fo | Code | Title | Summary | | --- | --- | --- | |
[93001](/docs/platform/errors/codes/93001-annotation-subscribe-mode-not-enabled)
annotation_subscribe_mode_not_enabled | Annotation listener without annotation_subscribe mode | 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](/docs/platform/errors/codes/93002-mutable-messages-not-enabled)
mutable_messages_not_enabled | Message annotations, updates, appends, and deletes not enabled | An operation could not be performed because it requires a feature that is enabled by the channel namespace's 'Message annotations, updates, appends, and deletes' setting. | +|
[93002](/docs/platform/errors/codes/93002-message-updates-not-enabled)
message_updates_not_enabled | Message annotations, updates, appends, and deletes not enabled | An operation could not be performed because the channel did not have the 'Message annotations, updates, appends, and deletes' rule enabled. | ## 101xxx @@ -339,11 +340,11 @@ Every Ably error code, its identifier, and a short description. Select a code fo | Code | Title | Summary | | --- | --- | --- | |
[103000](/docs/platform/errors/codes/103000-unable-to-publish-push-notification)
unable_to_publish_push_notification | Push notification internal error | 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](/docs/platform/errors/codes/103001-push-publish-retries-exhausted)
push_publish_retries_exhausted | Push notification retry limit reached | The push notification was not delivered because the configured retry limit was reached after repeated unsuccessful delivery attempts. The underlying failures are typically transient — provider outages, rate limits, or network errors. | +|
[103001](/docs/platform/errors/codes/103001-push-publish-retries-exhausted)
push_publish_retries_exhausted | Push notification retry limit reached | 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](/docs/platform/errors/codes/103002-push-direct-publish-no-recipient)
push_direct_publish_no_recipient | Push notification recipient missing | 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](/docs/platform/errors/codes/103003-push-cannot-handle-body)
push_cannot_handle_body | Push notification body invalid | 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](/docs/platform/errors/codes/103004-push-notification-rejected-by-provider)
push_notification_rejected_by_provider | Push notification rejected by provider | 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](/docs/platform/errors/codes/103005-push-device-token-invalid)
push_device_token_invalid | Push device token invalid | 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](/docs/platform/errors/codes/103006-push-transport-not-configured)
push_transport_not_configured | Push transport not configured | 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](/docs/platform/errors/codes/103007-push-notification-provider-unreachable)
push_notification_provider_unreachable | Push notification provider unreachable | 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. | +|
[103004](/docs/platform/errors/codes/103004-push-notification-rejected-by-provider)
push_notification_rejected_by_provider | Push notification rejected by provider | 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](/docs/platform/errors/codes/103005-push-device-token-invalid)
push_device_token_invalid | Push device token invalid | 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](/docs/platform/errors/codes/103006-push-transport-not-configured)
push_transport_not_configured | Push transport not configured | 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](/docs/platform/errors/codes/103007-push-notification-provider-unreachable)
push_notification_provider_unreachable | Push notification provider unreachable | 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](/docs/platform/errors/codes/103008-push-transport-credentials-invalid)
push_transport_credentials_invalid | Push transport credentials invalid | 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. | diff --git a/src/pages/docs/platform/errors/codes/10000-no-error.mdx b/src/pages/docs/platform/errors/codes/10000-no-error.mdx index 4ff425327c..d0df75297a 100644 --- a/src/pages/docs/platform/errors/codes/10000-no-error.mdx +++ b/src/pages/docs/platform/errors/codes/10000-no-error.mdx @@ -9,3 +9,7 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/10000.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} A placeholder code indicating success, used where an error code is expected but the operation completed normally. It does not represent a failure. + +## What you should do + +Nothing. Code 10000 is not a failure: it is a placeholder used where an error code is expected but the operation completed normally. If it surfaces as though it were an error, the issue is in how the result is being interpreted, not in the operation itself. diff --git a/src/pages/docs/platform/errors/codes/101000-space-name-is-empty.mdx b/src/pages/docs/platform/errors/codes/101000-space-name-is-empty.mdx index a9d1aad790..8a7c470b21 100644 --- a/src/pages/docs/platform/errors/codes/101000-space-name-is-empty.mdx +++ b/src/pages/docs/platform/errors/codes/101000-space-name-is-empty.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/101000.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} A space could not be created or referenced because no name was supplied. + +## What you should do + +Pass a non-empty name when getting a [space](https://ably.com/docs/spaces/space). Every space is identified by its name, so the call needs one. + +## Why it happens + +A space was requested with an empty or missing name. A space has to be identified by a non-empty name, so the request could not be resolved to one. + +## What you'll see + +The error is reported with code 101000 and HTTP status 400. The message is `must have a non-empty name for the space`. diff --git a/src/pages/docs/platform/errors/codes/101001-space-must-be-entered-first.mdx b/src/pages/docs/platform/errors/codes/101001-space-must-be-entered-first.mdx index c4ab6bd85b..aba2c8c8f8 100644 --- a/src/pages/docs/platform/errors/codes/101001-space-must-be-entered-first.mdx +++ b/src/pages/docs/platform/errors/codes/101001-space-must-be-entered-first.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/101001.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +[Enter the space](https://ably.com/docs/spaces/space#enter) before performing the operation. Operations such as updating a member's location or profile act on your membership of the space, so they only work once you have entered it. + +## Why it happens + +The operation requires the client to have entered the space, and it had not. Entering the space establishes the membership these operations act on. + +## What you'll see + +The error is reported with code 101001 and HTTP status 400. The message is `must enter a space to perform this operation`. diff --git a/src/pages/docs/platform/errors/codes/101002-lock-request-already-pending.mdx b/src/pages/docs/platform/errors/codes/101002-lock-request-already-pending.mdx index ac683a3c99..ac727658b0 100644 --- a/src/pages/docs/platform/errors/codes/101002-lock-request-already-pending.mdx +++ b/src/pages/docs/platform/errors/codes/101002-lock-request-already-pending.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/101002.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Wait for the pending [lock](https://ably.com/docs/spaces/locking) request to resolve before requesting the same lock again. A member can have only one outstanding request for a given lock, so let the first attempt succeed or fail rather than issuing another alongside it. + +## Why it happens + +A lock was requested while a request for the same lock by the same member was still in progress. Lock acquisition is asynchronous, and only one request per lock can be outstanding at a time. + +## What you'll see + +The error is reported with code 101002 and HTTP status 400. The message is `lock request already exists`. diff --git a/src/pages/docs/platform/errors/codes/101003-lock-already-held.mdx b/src/pages/docs/platform/errors/codes/101003-lock-already-held.mdx index 422bf43ed6..5afd33ec19 100644 --- a/src/pages/docs/platform/errors/codes/101003-lock-already-held.mdx +++ b/src/pages/docs/platform/errors/codes/101003-lock-already-held.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/101003.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Treat the [lock](https://ably.com/docs/spaces/locking) as unavailable and handle that in your application, for example by waiting until it is released and trying again, or by showing the component as locked by someone else. Contention is expected: a lock exists precisely so that only one member holds it at a time. + +## Why it happens + +The lock was already held by another member when it was requested. Only one member can hold a given lock at a time, and it must be released before another member can acquire it. + +## What you'll see + +The error is reported with code 101003 and HTTP status 400. The message is `lock is currently locked`. diff --git a/src/pages/docs/platform/errors/codes/101004-lock-invalidated-by-concurrent-request.mdx b/src/pages/docs/platform/errors/codes/101004-lock-invalidated-by-concurrent-request.mdx index 1152c446a7..513699d342 100644 --- a/src/pages/docs/platform/errors/codes/101004-lock-invalidated-by-concurrent-request.mdx +++ b/src/pages/docs/platform/errors/codes/101004-lock-invalidated-by-concurrent-request.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/101004.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} A lock that appeared to be acquired was invalidated because another member requested the same lock concurrently and now holds it. + +## What you should do + +Treat the [lock](https://ably.com/docs/spaces/locking) as not held by you and handle losing it, for example by releasing the component you were editing. When two members request the same lock at nearly the same time, only one can win, so your application should be prepared for a request that briefly looked successful to be invalidated. + +## Why it happens + +Another member requested the same lock concurrently and now holds it, which invalidated this member's request even though it had appeared to succeed. Only one member can hold a lock, so a concurrent request is resolved in favor of a single winner. + +## What you'll see + +The error is reported with code 101004 and HTTP status 400. The message is `lock was invalidated by a concurrent lock request which now holds the lock`. diff --git a/src/pages/docs/platform/errors/codes/103001-push-publish-retries-exhausted.mdx b/src/pages/docs/platform/errors/codes/103001-push-publish-retries-exhausted.mdx index 0a9b6f30b1..95b85eb4d1 100644 --- a/src/pages/docs/platform/errors/codes/103001-push-publish-retries-exhausted.mdx +++ b/src/pages/docs/platform/errors/codes/103001-push-publish-retries-exhausted.mdx @@ -1,6 +1,6 @@ --- title: "103001: Push notification retry limit reached" -meta_description: "The push notification was not delivered because the configured retry limit was reached after repeated unsuccessful delivery attempts. The underlying failures are typically transient — provider outages, rate limits, or network errors." +meta_description: "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." identifier: "push_publish_retries_exhausted" redirect_from: - /docs/platform/errors/codes/103001 @@ -8,4 +8,4 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/103001.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} -The push notification was not delivered because the configured retry limit was reached after repeated unsuccessful delivery attempts. The underlying failures are typically transient — provider outages, rate limits, or network errors. +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. diff --git a/src/pages/docs/platform/errors/codes/103004-push-notification-rejected-by-provider.mdx b/src/pages/docs/platform/errors/codes/103004-push-notification-rejected-by-provider.mdx index 5b935fefcf..28101b8d5c 100644 --- a/src/pages/docs/platform/errors/codes/103004-push-notification-rejected-by-provider.mdx +++ b/src/pages/docs/platform/errors/codes/103004-push-notification-rejected-by-provider.mdx @@ -1,6 +1,6 @@ --- title: "103004: Push notification rejected by provider" -meta_description: "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." +meta_description: "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." identifier: "push_notification_rejected_by_provider" redirect_from: - /docs/platform/errors/codes/103004 @@ -8,4 +8,4 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/103004.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} -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. +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. diff --git a/src/pages/docs/platform/errors/codes/103005-push-device-token-invalid.mdx b/src/pages/docs/platform/errors/codes/103005-push-device-token-invalid.mdx index 5b517ed1a6..00579e1dcb 100644 --- a/src/pages/docs/platform/errors/codes/103005-push-device-token-invalid.mdx +++ b/src/pages/docs/platform/errors/codes/103005-push-device-token-invalid.mdx @@ -1,6 +1,6 @@ --- title: "103005: Push device token invalid" -meta_description: "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." +meta_description: "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." identifier: "push_device_token_invalid" redirect_from: - /docs/platform/errors/codes/103005 @@ -8,4 +8,4 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/103005.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} -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. +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. diff --git a/src/pages/docs/platform/errors/codes/103006-push-transport-not-configured.mdx b/src/pages/docs/platform/errors/codes/103006-push-transport-not-configured.mdx index 88c693d32c..8a7a86ec28 100644 --- a/src/pages/docs/platform/errors/codes/103006-push-transport-not-configured.mdx +++ b/src/pages/docs/platform/errors/codes/103006-push-transport-not-configured.mdx @@ -1,6 +1,6 @@ --- title: "103006: Push transport not configured" -meta_description: "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." +meta_description: "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." identifier: "push_transport_not_configured" redirect_from: - /docs/platform/errors/codes/103006 @@ -8,4 +8,4 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/103006.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} -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. +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. diff --git a/src/pages/docs/platform/errors/codes/103007-push-notification-provider-unreachable.mdx b/src/pages/docs/platform/errors/codes/103007-push-notification-provider-unreachable.mdx index 0f86489a82..da3b0293a6 100644 --- a/src/pages/docs/platform/errors/codes/103007-push-notification-provider-unreachable.mdx +++ b/src/pages/docs/platform/errors/codes/103007-push-notification-provider-unreachable.mdx @@ -1,6 +1,6 @@ --- title: "103007: Push notification provider unreachable" -meta_description: "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." +meta_description: "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." identifier: "push_notification_provider_unreachable" redirect_from: - /docs/platform/errors/codes/103007 @@ -8,4 +8,4 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/103007.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} -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. +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. diff --git a/src/pages/docs/platform/errors/codes/20000-general-error.mdx b/src/pages/docs/platform/errors/codes/20000-general-error.mdx index 6a77de61ef..2e0ad64a3c 100644 --- a/src/pages/docs/platform/errors/codes/20000-general-error.mdx +++ b/src/pages/docs/platform/errors/codes/20000-general-error.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/20000.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Rely on the accompanying message and HTTP status for the specifics, since 20000 itself only signals that the condition didn't map to a more specific code. Capture the message and status, and if the cause isn't clear, [contact Ably support](https://ably.com/support) with them. + +## Why it happens + +The condition could not be classified under a more specific error code, so the general code was used. The accompanying message describes the actual problem. + +## What you'll see + +The error is reported with code 20000, alongside a message and HTTP status that describe the specific condition. diff --git a/src/pages/docs/platform/errors/codes/40000-bad-request.mdx b/src/pages/docs/platform/errors/codes/40000-bad-request.mdx index 3570b61bd7..d0bd1fc66f 100644 --- a/src/pages/docs/platform/errors/codes/40000-bad-request.mdx +++ b/src/pages/docs/platform/errors/codes/40000-bad-request.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40000.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} The request was rejected because it was invalid and could not be processed. + +## What you should do + +Correct the request and resend it. 40000 is the generic code for a request Ably could not process, so start from the accompanying message, which states what was wrong. + +## Why it happens + +The request was malformed or otherwise invalid in a way that doesn't have a more specific error code. The accompanying message describes the specific problem. + +## What you'll see + +The error is reported with code 40000 and HTTP status 400. The message describes what made the request invalid. diff --git a/src/pages/docs/platform/errors/codes/40001-invalid-request-body.mdx b/src/pages/docs/platform/errors/codes/40001-invalid-request-body.mdx index 75cfcfc326..bf1b507362 100644 --- a/src/pages/docs/platform/errors/codes/40001-invalid-request-body.mdx +++ b/src/pages/docs/platform/errors/codes/40001-invalid-request-body.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40001.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} The body of the request could not be processed because it was invalid, missing required fields, or not in the expected format. + +## What you should do + +Correct the request body so it matches what the endpoint expects, then resend. Start from the accompanying error message: it names the specific problem, such as a field of the wrong type or a missing required field. + +## Why it happens + +The body of the request could not be parsed or failed validation. Common cases are a malformed or non-JSON body, a missing required field, or a value of the wrong type. It most often appears on token requests, where a field is absent or not in the expected form. + +## What you'll see + +The error is reported with code 40001 and HTTP status 400. The message varies with the cause and usually names the offending part, for example `invalid request body: ...`. diff --git a/src/pages/docs/platform/errors/codes/40003-invalid-parameter-value.mdx b/src/pages/docs/platform/errors/codes/40003-invalid-parameter-value.mdx index 09b674c1fa..6992b44c34 100644 --- a/src/pages/docs/platform/errors/codes/40003-invalid-parameter-value.mdx +++ b/src/pages/docs/platform/errors/codes/40003-invalid-parameter-value.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40003.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Correct the offending parameter and resend. The accompanying message names the parameter and the problem, so start there. + +## Why it happens + +A parameter in the request held a value that isn't acceptable: the wrong type, outside the allowed range, or otherwise invalid for that parameter. Examples include an out-of-range `limit` on a history or presence query, an unparseable pagination cursor or message serial, or a token `ttl` above the permitted maximum. + +## What you'll see + +The error is reported with code 40003 and HTTP status 400. The message identifies the parameter, for example `Invalid limit param` or `invalid serial: ...`. diff --git a/src/pages/docs/platform/errors/codes/40005-invalid-credential.mdx b/src/pages/docs/platform/errors/codes/40005-invalid-credential.mdx index 7972b2d5ec..7045dc4e25 100644 --- a/src/pages/docs/platform/errors/codes/40005-invalid-credential.mdx +++ b/src/pages/docs/platform/errors/codes/40005-invalid-credential.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40005.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Check the API key or token the client was configured with. The value couldn't be read at all, so the fix is to supply a correctly-formed credential, not to adjust its permissions. Copy the key from the [Ably dashboard](https://ably.com/accounts/any/apps/any/app_keys) again in case it was truncated or picked up stray whitespace. + +## Why it happens + +The credential supplied was not in the expected form, so it couldn't be parsed. Common causes are a key or token that was truncated, had characters added or removed, or was passed in the wrong field. This is distinct from a well-formed credential that is rejected as unauthorized. + +## What you'll see + +The error is reported with code 40005 and HTTP status 400. The message names the unreadable value, for example `Invalid key in request: ...` or `Invalid accessToken in request: ...`. diff --git a/src/pages/docs/platform/errors/codes/40006-message-contains-invalid-connection-id.mdx b/src/pages/docs/platform/errors/codes/40006-message-contains-invalid-connection-id.mdx index 222a1fca9c..67606869b7 100644 --- a/src/pages/docs/platform/errors/codes/40006-message-contains-invalid-connection-id.mdx +++ b/src/pages/docs/platform/errors/codes/40006-message-contains-invalid-connection-id.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40006.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} A published message referenced a connection by an ID or key that was invalid or did not match, so the message was rejected. + +## What you should do + +When [publishing on behalf of a realtime connection](https://ably.com/docs/pub-sub/advanced#publish-on-behalf), make sure the `connectionKey` you publish with is the current key of that connection, and that any `connectionId` set on a message matches the publishing connection. Correct the mismatched value and resend. + +## Why it happens + +A published message referenced a connection that couldn't be validated. Usual causes are a malformed or stale `connectionKey`, a REST publisher and realtime client that belong to different Ably apps or use different client IDs, or a manually constructed message whose `connectionId` doesn't match the current connection. + +## What you'll see + +The error is reported with code 40006 and HTTP status 400. The message is typically `Malformed message; invalid connectionId` or `Malformed message; mismatched connectionId`. diff --git a/src/pages/docs/platform/errors/codes/40009-max-message-size-exceeded.mdx b/src/pages/docs/platform/errors/codes/40009-max-message-size-exceeded.mdx index 27aff1e516..770f493980 100644 --- a/src/pages/docs/platform/errors/codes/40009-max-message-size-exceeded.mdx +++ b/src/pages/docs/platform/errors/codes/40009-max-message-size-exceeded.mdx @@ -14,7 +14,7 @@ A message was rejected because it exceeded the maximum permitted size. When seve Reduce the size of what you publish so it falls within the limit. Because it is rejected outright and not retried, it has to be made smaller to get through. If you publish several messages in a single call, the limit applies to their combined size, so sending fewer messages per call is one way to do that. -The default maximum is 64 KB, but the exact figure depends on your account; check it against your account's [limits](https://ably.com/docs/general/limits). If your use case genuinely needs larger messages, you can request a higher limit. +The default maximum is 64 KB, but the exact figure depends on your account; check it against your account's [limits](https://ably.com/docs/platform/pricing/limits). If your use case genuinely needs larger messages, you can request a higher limit. ## Why it happens diff --git a/src/pages/docs/platform/errors/codes/40010-invalid-channel-name.mdx b/src/pages/docs/platform/errors/codes/40010-invalid-channel-name.mdx index 230705ccd6..e58b10a062 100644 --- a/src/pages/docs/platform/errors/codes/40010-invalid-channel-name.mdx +++ b/src/pages/docs/platform/errors/codes/40010-invalid-channel-name.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40010.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Use a valid channel name and retry. Names must not be empty, must not start with `[` or `:`, and must not contain newline characters. See the [channel naming rules](https://ably.com/docs/channels) for the full set. + +## Why it happens + +The channel name in the request broke one of the naming rules, or a square-bracketed qualifier was malformed. This includes an empty name, a disallowed leading character, an unsupported qualifier or parameter in the `[...]` prefix, or an unparseable channel key. + +## What you'll see + +The error is reported with code 40010 and HTTP status 400. The message is typically `invalid channel name: ...`, or names the specific problem such as `Invalid qualifier in channelId; ...`. diff --git a/src/pages/docs/platform/errors/codes/40011-pagination-sequence-no-longer-valid.mdx b/src/pages/docs/platform/errors/codes/40011-pagination-sequence-no-longer-valid.mdx index 23fd66eeb3..e8e025b0d9 100644 --- a/src/pages/docs/platform/errors/codes/40011-pagination-sequence-no-longer-valid.mdx +++ b/src/pages/docs/platform/errors/codes/40011-pagination-sequence-no-longer-valid.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40011.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} An enumeration query could not continue because the underlying set of results shifted between pages, so the pagination sequence was no longer valid. + +## What you should do + +Restart the enumeration query from the beginning to obtain a complete result set. This is a transient condition rather than a fault in your request, so restarting from the first page is the correct response. Single-page enumerations that complete in one response are unaffected. + +## Why it happens + +Channel enumeration is paginated, and the set of channels can change between page requests as the cluster's state shifts. When that happens partway through, the pagination cursor can no longer guarantee a complete, consistent result, so the sequence is invalidated rather than returning partial or duplicated data. + +## What you'll see + +The error is reported with code 40011 and HTTP status 400. The message is typically `Unable to continue enumeration query; pagination sequence is no longer valid due to cluster shift. Please restart your query.` diff --git a/src/pages/docs/platform/errors/codes/40012-invalid-client-id.mdx b/src/pages/docs/platform/errors/codes/40012-invalid-client-id.mdx index 16af64febf..1dc998356c 100644 --- a/src/pages/docs/platform/errors/codes/40012-invalid-client-id.mdx +++ b/src/pages/docs/platform/errors/codes/40012-invalid-client-id.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40012.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Supply a valid client ID, and if the client uses token authentication as an [identified client](https://ably.com/docs/auth/identified-clients), make sure it matches the client ID its token was issued for. + +## Why it happens + +Most often the supplied client ID doesn't match the one the token permits: a token authorizes either a single client ID or a wildcard, and a client can't assume an identity outside what its token allows. The value is also rejected if it is empty, not a string, or the reserved wildcard `*` used as an actual identity. + +## What you'll see + +The error is reported with code 40012 and HTTP status 400. The message names the problem, for example `invalid clientId` or `Invalid token; clientId must be a string`. diff --git a/src/pages/docs/platform/errors/codes/40013-invalid-data-or-encoding.mdx b/src/pages/docs/platform/errors/codes/40013-invalid-data-or-encoding.mdx index 86e3e9130b..5aea90600c 100644 --- a/src/pages/docs/platform/errors/codes/40013-invalid-data-or-encoding.mdx +++ b/src/pages/docs/platform/errors/codes/40013-invalid-data-or-encoding.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40013.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Publish data of a supported type. Message data must be a string, binary data (such as a Buffer, ArrayBuffer, or TypedArray), or a plain object or array that serializes to JSON. Convert other types, such as `Date`, `Map`, or `Set`, to one of these before publishing. If you set an `encoding` yourself, make sure it correctly describes the data. + +## Why it happens + +The SDK couldn't serialize the message payload, or the declared encoding couldn't be applied or reversed. This usually means the data was of a type the SDKs don't support, so it can't be represented as JSON or MessagePack. + +## What you'll see + +The error is reported with code 40013 and HTTP status 400. The message is typically `Data type is unsupported`, and it is often raised by the SDK before the message is sent. diff --git a/src/pages/docs/platform/errors/codes/40015-invalid-device-id.mdx b/src/pages/docs/platform/errors/codes/40015-invalid-device-id.mdx index 721bafb854..d49ee9784b 100644 --- a/src/pages/docs/platform/errors/codes/40015-invalid-device-id.mdx +++ b/src/pages/docs/platform/errors/codes/40015-invalid-device-id.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40015.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} The device ID supplied for a push notification operation was missing or not in an acceptable form, so the request was rejected. + +## What you should do + +Send a valid device ID with the request. The `id` in the `DeviceDetails` object must be present and a string. Correct it and retry. See [push notifications](https://ably.com/docs/push) for how devices are registered. + +## Why it happens + +The device ID supplied when registering or updating a device for push notifications was missing or not a string, so the request was rejected. + +## What you'll see + +The error is reported with code 40015 and HTTP status 400. The message is typically `Invalid deviceId`. diff --git a/src/pages/docs/platform/errors/codes/40016-invalid-message-name.mdx b/src/pages/docs/platform/errors/codes/40016-invalid-message-name.mdx index 5f17152543..75cf4e02a0 100644 --- a/src/pages/docs/platform/errors/codes/40016-invalid-message-name.mdx +++ b/src/pages/docs/platform/errors/codes/40016-invalid-message-name.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40016.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} A message supplied a name that was invalid, so the message was rejected. + +## What you should do + +Set the message [`name`](https://ably.com/docs/channels/messages#message-properties) to a string, or leave it unset. Correct the value and republish. + +## Why it happens + +The `name` supplied on a message was not a string. The name is an optional label for the event, and when present it must be a string. + +## What you'll see + +The error is reported with code 40016 and HTTP status 400. The message is `Invalid message name`. diff --git a/src/pages/docs/platform/errors/codes/40017-unsupported-protocol-version.mdx b/src/pages/docs/platform/errors/codes/40017-unsupported-protocol-version.mdx index e6fe57d6f3..39a073137c 100644 --- a/src/pages/docs/platform/errors/codes/40017-unsupported-protocol-version.mdx +++ b/src/pages/docs/platform/errors/codes/40017-unsupported-protocol-version.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40017.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Include a supported protocol version in the request. This normally only arises when calling the Ably API directly rather than through an SDK, since the SDKs set a valid version automatically. If you reach it through an SDK, upgrade to a current version. + +## Why it happens + +The request specified a protocol version Ably doesn't support, or omitted one where it's required. A stateless (SSE) connection, for example, must specify a version in its query parameters, and a version outside the supported set is rejected. + +## What you'll see + +The error is reported with code 40017 and HTTP status 400. The messages include `Stateless connections must specify a protocol version (e.g. ?v=1.1)` and `Invalid api version specified: ...`. diff --git a/src/pages/docs/platform/errors/codes/40018-delta-decoding-failed.mdx b/src/pages/docs/platform/errors/codes/40018-delta-decoding-failed.mdx index eedd60650d..7164a1ec95 100644 --- a/src/pages/docs/platform/errors/codes/40018-delta-decoding-failed.mdx +++ b/src/pages/docs/platform/errors/codes/40018-delta-decoding-failed.mdx @@ -1,6 +1,6 @@ --- title: "40018: Message delta could not be applied" -meta_description: "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." +meta_description: "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." identifier: "delta_decoding_failed" redirect_from: - /docs/platform/errors/codes/40018 @@ -8,4 +8,4 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40018.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} -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. +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. diff --git a/src/pages/docs/platform/errors/codes/40020-batch-request-error.mdx b/src/pages/docs/platform/errors/codes/40020-batch-request-error.mdx index 668c775073..1a52959a64 100644 --- a/src/pages/docs/platform/errors/codes/40020-batch-request-error.mdx +++ b/src/pages/docs/platform/errors/codes/40020-batch-request-error.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40020.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} A batch request completed with one or more of its items failing. Each failing item carries its own error, reported alongside this one. + +## What you should do + +Inspect the individual results in the batch response. Each item carries its own success or error, so read the per-item errors to see which parts failed and why, then retry or handle just those. The top-level 40020 only signals that at least one item failed, not that the whole request was rejected. + +## Why it happens + +Batch operations, such as batch publish, batch presence, or token revocation, process each item independently, and one or more items failed while others may have succeeded. This partial failure is reported as a single envelope error with the detail attached per item. + +## What you'll see + +The error is reported with code 40020 and HTTP status 400. The message is `Batched response includes errors`, accompanied by a batch response whose failing entries each carry their own error. diff --git a/src/pages/docs/platform/errors/codes/40022-api-streamer-no-longer-offered.mdx b/src/pages/docs/platform/errors/codes/40022-api-streamer-no-longer-offered.mdx index fa6c41a04a..145c554e68 100644 --- a/src/pages/docs/platform/errors/codes/40022-api-streamer-no-longer-offered.mdx +++ b/src/pages/docs/platform/errors/codes/40022-api-streamer-no-longer-offered.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40022.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +API Streamer has been shut down, so requests that depend on it can't be served and won't recover. If your application still targets it, migrate to a current Ably integration. Contact [Ably support](https://ably.com/support) if you're unsure what replaces your use case. + +## Why it happens + +The request targeted API Streamer, a product that has been decommissioned. Any attempt to use it now fails. + +## What you'll see + +The error is reported with code 40022 and HTTP status 400. The message is `API Streamer is no longer offered, contact support@ably.com for more information`. diff --git a/src/pages/docs/platform/errors/codes/40024-incompatible-site-for-history.mdx b/src/pages/docs/platform/errors/codes/40024-incompatible-site-for-history.mdx index 7ebe2fb9a8..fcf88d7c74 100644 --- a/src/pages/docs/platform/errors/codes/40024-incompatible-site-for-history.mdx +++ b/src/pages/docs/platform/errors/codes/40024-incompatible-site-for-history.mdx @@ -14,8 +14,8 @@ A history request using untilAttach was handled by a different Ably region from Retrying may not help, as the retry might again be handled by a different region. There is no automatic recovery, so choose the approach that best fits your application: -- **Retry without untilAttach and remove duplicates yourself.** Request [history](https://ably.com/docs/storage-history/history) without untilAttach and discard any messages you have already received in real time. This keeps a gap-free record but your application has to deduplicate. -- **Retry without untilAttach and accept possible duplicates.** Less work, but some messages may appear both in the history response and among those already received in real time. +- **Retry without `untilAttach` and remove duplicates yourself.** Request [history](https://ably.com/docs/storage-history/history) without `untilAttach` and discard any messages you have already received in real time. This keeps a gap-free record but your application has to deduplicate. +- **Retry without `untilAttach` and accept possible duplicates.** Less work, but some messages may appear both in the history response and among those already received in real time. - **Treat it as having no retrievable history.** If missing the earlier messages is acceptable, continue with only the messages received in real time. Which is best depends on whether duplicate messages or missing history is worse for your use case. @@ -24,8 +24,8 @@ Which is best depends on whether duplicate messages or missing history is worse Each Ably region observes and orders recent messages independently, so a given point in one region's order does not necessarily correspond to the same point in another's. -A history request using untilAttach returns the messages published up to the point at which the channel attached — a point in the order of the region it attached in. If the request is handled by a different region, that region cannot reliably determine which messages fall before that point, so rather than risk returning the wrong set it does not serve the request. +A history request using `untilAttach` returns the messages published up to the point at which the channel attached, a point in the order of the region it attached in. If the request is handled by a different region, that region cannot reliably determine which messages fall before that point, so rather than risk returning the wrong set it does not serve the request. ## What you'll see -The whole request fails and no messages are returned. The error is reported with code 40024 and HTTP status 400, with the message `Unable to get channel history: cannot serve history from a different site` — "site" here is the internal term for a region. +The whole request fails and no messages are returned. The error is reported with code 40024 and HTTP status 400, with the message `Unable to get channel history: cannot serve history from a different site`. Here, "site" is the internal term for a region. diff --git a/src/pages/docs/platform/errors/codes/40030-invalid-publish-request.mdx b/src/pages/docs/platform/errors/codes/40030-invalid-publish-request.mdx index bb23ec8fcc..6243b3b539 100644 --- a/src/pages/docs/platform/errors/codes/40030-invalid-publish-request.mdx +++ b/src/pages/docs/platform/errors/codes/40030-invalid-publish-request.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40030.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} A publish request was rejected because it was invalid. + +## What you should do + +Correct the malformed publish request and resend. The accompanying message names the specific problem, so start there. + +## Why it happens + +The publish request was rejected because something in it was invalid: a field, a value, or the structure of the request itself. + +## What you'll see + +The error is reported with code 40030 and HTTP status 400. The message varies with the cause; the generic wording is `Invalid publish request (unspecified)`. diff --git a/src/pages/docs/platform/errors/codes/40031-invalid-client-specified-message-id.mdx b/src/pages/docs/platform/errors/codes/40031-invalid-client-specified-message-id.mdx index 2968994292..4cfab926c5 100644 --- a/src/pages/docs/platform/errors/codes/40031-invalid-client-specified-message-id.mdx +++ b/src/pages/docs/platform/errors/codes/40031-invalid-client-specified-message-id.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40031.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +When you assign your own message ids and [publish several messages atomically](https://ably.com/docs/pub-sub/advanced#atomic-restrictions), give every message an id derived from one base id, in the form `:` (`foo:0`, `foo:1`, `foo:2`, and so on). If you need each message to be independently idempotent, publish them separately or use the batch publish API instead. + +## Why it happens + +A client-specified message id acts as an [idempotency key](https://ably.com/docs/pub-sub/advanced#idempotency). For messages published atomically in one call, Ably requires all ids to share a single base id with a positional suffix, so the idempotency scope of the group is unambiguous. An id that is missing, empty, not a string, or that doesn't follow the `:` pattern is rejected. + +## What you'll see + +The error is reported with code 40031 and HTTP status 400. The messages include `Client-specified message id cannot be empty` and `Client-specified message ids do not match the required format for multi-message ProtocolMessages`. diff --git a/src/pages/docs/platform/errors/codes/40032-invalid-message-extras-field.mdx b/src/pages/docs/platform/errors/codes/40032-invalid-message-extras-field.mdx index 752d21401f..ceaffa9360 100644 --- a/src/pages/docs/platform/errors/codes/40032-invalid-message-extras-field.mdx +++ b/src/pages/docs/platform/errors/codes/40032-invalid-message-extras-field.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40032.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Put only recognized Ably keys in a message's [`extras`](https://ably.com/docs/messages#properties) field, with values of the expected shape. To attach your own metadata, use `extras.headers`, which must be a flat map of string keys to string, number, boolean, or null values. Move any custom fields there and republish. + +## Why it happens + +A message's `extras` contained a key Ably doesn't permit, or `extras.headers` had the wrong shape. `extras` is reserved for specific Ably features, so arbitrary top-level keys are rejected, as are `headers` that aren't a flat, string-keyed map of simple values. + +## What you'll see + +The error is reported with code 40032 and HTTP status 400. The messages include `Message has impermissible extras fields: ` and `extras.headers if present must be a map`. diff --git a/src/pages/docs/platform/errors/codes/40100-unauthorized.mdx b/src/pages/docs/platform/errors/codes/40100-unauthorized.mdx index 42294edb7e..300934bd47 100644 --- a/src/pages/docs/platform/errors/codes/40100-unauthorized.mdx +++ b/src/pages/docs/platform/errors/codes/40100-unauthorized.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40100.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} A connection or request was rejected because it was not authorized. + +## What you should do + +Read the accompanying message: 40100 is a general authorization failure, and the message states the specific action that was refused. Grant the credential the capability it needs, or perform the operation with credentials that have it. + +## Why it happens + +An operation was refused because the credentials in use don't permit it. This covers a range of cases, from a request for a resource or property the key has no capability for, to an attempt to modify a field that can't be changed. + +## What you'll see + +The error is reported with code 40100 and HTTP status 401. The message names the specific problem, for example `Not authorized` or `Non-permitted property ...`. diff --git a/src/pages/docs/platform/errors/codes/40101-invalid-credentials.mdx b/src/pages/docs/platform/errors/codes/40101-invalid-credentials.mdx index f52a5a0acc..be0decefef 100644 --- a/src/pages/docs/platform/errors/codes/40101-invalid-credentials.mdx +++ b/src/pages/docs/platform/errors/codes/40101-invalid-credentials.mdx @@ -1,6 +1,6 @@ --- title: "40101: Authentication failed" -meta_description: "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." +meta_description: "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." identifier: "invalid_credentials" redirect_from: - /docs/platform/errors/codes/40101 @@ -8,4 +8,16 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40101.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} -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. +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. + +## What you should do + +Check that the client is presenting valid [credentials](https://ably.com/docs/auth). For Basic authentication, confirm the API key is complete and correct; for token authentication, confirm the token is valid and that any client ID configured on the client matches the one the token was issued for. + +## Why it happens + +The credentials presented were not accepted. Causes include an API key secret that doesn't match, such as a mistyped or truncated key, an invalid or expired token, a signed token request whose MAC doesn't verify, a client ID that doesn't match the token, or no credentials at all. + +## What you'll see + +The error is reported with code 40101 and HTTP status 401. The message gives the detail, for example `Not authorized` or `Invalid clientId`. diff --git a/src/pages/docs/platform/errors/codes/40102-incompatible-credentials.mdx b/src/pages/docs/platform/errors/codes/40102-incompatible-credentials.mdx index 9627514c16..ade73cb867 100644 --- a/src/pages/docs/platform/errors/codes/40102-incompatible-credentials.mdx +++ b/src/pages/docs/platform/errors/codes/40102-incompatible-credentials.mdx @@ -1,6 +1,6 @@ --- title: "40102: Incompatible credentials" -meta_description: "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." +meta_description: "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." identifier: "incompatible_credentials" redirect_from: - /docs/platform/errors/codes/40102 @@ -8,4 +8,16 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40102.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} -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. +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. + +## What you should do + +When reauthenticating an existing connection, use credentials that match the connection's original ones: the same Ably application, the same API key origin, and the same client ID. To use different credentials, open a new connection instead. + +## Why it happens + +The credentials were valid but incompatible with the connection they were applied to. Typical causes are a token whose client ID differs from the connection's, a reauthentication using a key from a different Ably application, or an attempt to change capabilities mid-connection with a different key. + +## What you'll see + +The error is reported with code 40102 and HTTP status 401. The message is typically `Invalid clientId for credentials`. diff --git a/src/pages/docs/platform/errors/codes/40103-invalid-use-of-basic-auth-over-non-tls-transport.mdx b/src/pages/docs/platform/errors/codes/40103-invalid-use-of-basic-auth-over-non-tls-transport.mdx index f847b8e75a..80e6d5d3cd 100644 --- a/src/pages/docs/platform/errors/codes/40103-invalid-use-of-basic-auth-over-non-tls-transport.mdx +++ b/src/pages/docs/platform/errors/codes/40103-invalid-use-of-basic-auth-over-non-tls-transport.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40103.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Either use Basic authentication over a TLS connection, or switch to [token authentication](https://ably.com/docs/auth/token) if you need to connect without TLS. SDKs use TLS by default, so this normally means TLS was explicitly disabled in the client options. + +## Why it happens + +A client authenticated with an API key (Basic authentication) over a connection that wasn't secured with TLS. Because the key would be exposed to anything inspecting the unencrypted traffic, the request is rejected rather than risk the long-lived credential. + +## What you'll see + +The error is reported with code 40103 and HTTP status 401. The message is `Invalid use of Basic authentication over non-TLS transport`. diff --git a/src/pages/docs/platform/errors/codes/40104-token-request-timestamp-outside-permitted-window.mdx b/src/pages/docs/platform/errors/codes/40104-token-request-timestamp-outside-permitted-window.mdx index f5d61a393e..93c64be1c5 100644 --- a/src/pages/docs/platform/errors/codes/40104-token-request-timestamp-outside-permitted-window.mdx +++ b/src/pages/docs/platform/errors/codes/40104-token-request-timestamp-outside-permitted-window.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40104.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Make sure the system generating token requests has an accurate clock, since the fix is almost always clock synchronization. If you can't rely on the clock, set the [`queryTime`](https://ably.com/docs/auth/token#server-clock-requirements) client option to `true` so the SDK uses Ably's server time when creating token requests. Also make sure each token request is generated fresh rather than cached past the point its timestamp is still current. + +## Why it happens + +The timestamp in a token request was too far from Ably's current time to be accepted. This is usually a clock on the token-generating system that has drifted from real time, or a token request that was cached and reused after its timestamp went stale. + +## What you'll see + +The error is reported with code 40104 and HTTP status 401. The message is `Timestamp not current`. diff --git a/src/pages/docs/platform/errors/codes/40105-nonce-value-replayed.mdx b/src/pages/docs/platform/errors/codes/40105-nonce-value-replayed.mdx index 6efd38e21f..511e498243 100644 --- a/src/pages/docs/platform/errors/codes/40105-nonce-value-replayed.mdx +++ b/src/pages/docs/platform/errors/codes/40105-nonce-value-replayed.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40105.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Generate a fresh [token request](https://ably.com/docs/auth/token) on every authentication rather than caching and reusing one. Each token request carries a nonce that Ably accepts only once, so your `authCallback` or auth endpoint must return a newly created request each time it is called. If an HTTP cache sits between the client and your endpoint, set cache-busting response headers such as `Cache-Control: no-cache, no-store, must-revalidate` so a stale request isn't replayed. + +## Why it happens + +A token request was presented with a nonce that had already been used. Usually a token request is being cached and reused, whether by your auth server, your `authCallback`, or an HTTP cache between the client and your endpoint. It can also happen transiently on a network fault: if a request reaches Ably but its response doesn't reach the client, the client may retry the same request against a fallback endpoint, and the repeated nonce is rejected. + +## What you'll see + +The error is reported with code 40105 and HTTP status 401. The message is `Nonce value replayed`. diff --git a/src/pages/docs/platform/errors/codes/40106-no-valid-authentication-method-provided.mdx b/src/pages/docs/platform/errors/codes/40106-no-valid-authentication-method-provided.mdx index 8f12bff7f0..540c68fac8 100644 --- a/src/pages/docs/platform/errors/codes/40106-no-valid-authentication-method-provided.mdx +++ b/src/pages/docs/platform/errors/codes/40106-no-valid-authentication-method-provided.mdx @@ -1,6 +1,6 @@ --- title: "40106: No valid authentication method provided" -meta_description: "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." +meta_description: "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." identifier: "no_valid_authentication_method_provided" redirect_from: - /docs/platform/errors/codes/40106 @@ -8,4 +8,16 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40106.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} -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. +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. + +## What you should do + +Configure the client with a way to [authenticate](https://ably.com/docs/auth). Set one of `key`, `token`, `authUrl`, or `authCallback` in the client options. For browser and mobile clients prefer `authUrl` or `authCallback`; for server-side use an API `key`. + +## Why it happens + +The SDK was instantiated without any usable authentication option, so it had no API key, no token, and no means to obtain one. This is a configuration error raised by the SDK before it contacts Ably. + +## What you'll see + +The error is reported with code 40106 and HTTP status 401. The message is typically `No authentication options provided` or `authOptions must include valid authentication parameters`. diff --git a/src/pages/docs/platform/errors/codes/40111-account-connection-limit-exceeded.mdx b/src/pages/docs/platform/errors/codes/40111-account-connection-limit-exceeded.mdx index 082d0126b4..ba5707a527 100644 --- a/src/pages/docs/platform/errors/codes/40111-account-connection-limit-exceeded.mdx +++ b/src/pages/docs/platform/errors/codes/40111-account-connection-limit-exceeded.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40111.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} A new connection was refused because the account had reached the maximum number of concurrent connections permitted by its limits. + +## What you should do + +Restore service by upgrading the account to a package with a higher [connection limit](https://ably.com/docs/platform/pricing/limits), or, if you need more than the packages provide, by [contacting Ably support](https://ably.com/support) to request a higher limit. Enterprise customers can use the [incident escalation process](https://ably.com/docs/platform/support#escalation) when a limit is disrupting production and needs an urgent response. + +## Why it happens + +The account reached the maximum number of concurrent connections its package permits, so Ably restricted it and refused further connections until the count drops or the limit is raised. This is an account-wide limit, so connections from every app in the account count towards it. A count higher than you expect can be a sign of connections that aren't being closed. + +## What you'll see + +The error is reported with code 40111 and HTTP status 403. The message is typically `account restricted (connection limits exceeded)`. diff --git a/src/pages/docs/platform/errors/codes/40112-account-message-limit-exceeded.mdx b/src/pages/docs/platform/errors/codes/40112-account-message-limit-exceeded.mdx index 57931dfe4f..460755f1fd 100644 --- a/src/pages/docs/platform/errors/codes/40112-account-message-limit-exceeded.mdx +++ b/src/pages/docs/platform/errors/codes/40112-account-message-limit-exceeded.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40112.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} The request was rejected because the account had reached the maximum message volume permitted by its limits. + +## What you should do + +Restore service by upgrading the account to a package with a higher [message limit](https://ably.com/docs/platform/pricing/limits), or, if you need more than the packages provide, by [contacting Ably support](https://ably.com/support) to request a higher limit. Enterprise customers can use the [incident escalation process](https://ably.com/docs/platform/support#escalation) when a limit is disrupting production and needs an urgent response. + +## Why it happens + +The account reached the maximum message volume its package permits, so Ably blocked it. This is an account-wide limit covering the messages consumed across every app in the account. + +## What you'll see + +The error is reported with code 40112 and HTTP status 401. The message is typically `account blocked (message limits exceeded)`. diff --git a/src/pages/docs/platform/errors/codes/40114-account-channel-limit-exceeded.mdx b/src/pages/docs/platform/errors/codes/40114-account-channel-limit-exceeded.mdx index c6022cfa37..e5c6ba7821 100644 --- a/src/pages/docs/platform/errors/codes/40114-account-channel-limit-exceeded.mdx +++ b/src/pages/docs/platform/errors/codes/40114-account-channel-limit-exceeded.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40114.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} The request was refused because the account had reached the maximum number of concurrent channels permitted by its limits. + +## What you should do + +Restore service by upgrading the account to a package with a higher [channel limit](https://ably.com/docs/platform/pricing/limits), or, if you need more than the packages provide, by [contacting Ably support](https://ably.com/support) to request a higher limit. Enterprise customers can use the [incident escalation process](https://ably.com/docs/platform/support#escalation) when a limit is disrupting production and needs an urgent response. + +## Why it happens + +The account reached the maximum number of concurrent channels its package permits, so Ably restricted it and refused new channels until the count drops or the limit is raised. Channels are counted account-wide across every app, and a channel stays counted while any client remains attached, so channels left attached after they are no longer needed also contribute. + +## What you'll see + +The error is reported with code 40114 and HTTP status 403. The message is typically `account restricted (channel limits exceeded)`. diff --git a/src/pages/docs/platform/errors/codes/40115-account-request-limit-exceeded.mdx b/src/pages/docs/platform/errors/codes/40115-account-request-limit-exceeded.mdx index ce203b2fa3..6ed0d7fbbf 100644 --- a/src/pages/docs/platform/errors/codes/40115-account-request-limit-exceeded.mdx +++ b/src/pages/docs/platform/errors/codes/40115-account-request-limit-exceeded.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40115.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} The request was refused because the account had reached its permitted limit on API and token requests. + +## What you should do + +Restore service by upgrading the account to a package with a higher [request limit](https://ably.com/docs/platform/pricing/limits), or, if you need more than the packages provide, by [contacting Ably support](https://ably.com/support) to request a higher limit. Enterprise customers can use the [incident escalation process](https://ably.com/docs/platform/support#escalation) when a limit is disrupting production and needs an urgent response. Your dashboard's notifications page shows which limit was hit. + +## Why it happens + +The account reached its permitted limit on API and token requests, so Ably restricted it. This is an account-wide limit across every app in the account. + +## What you'll see + +The error is reported with code 40115 and HTTP status 403. The message indicates the account was restricted for exceeding its request limit. diff --git a/src/pages/docs/platform/errors/codes/40121-token-revocation-not-enabled.mdx b/src/pages/docs/platform/errors/codes/40121-token-revocation-not-enabled.mdx index 16064a7aa9..7633effe42 100644 --- a/src/pages/docs/platform/errors/codes/40121-token-revocation-not-enabled.mdx +++ b/src/pages/docs/platform/errors/codes/40121-token-revocation-not-enabled.mdx @@ -1,6 +1,6 @@ --- title: "40121: Token revocation not enabled" -meta_description: "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." +meta_description: "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." identifier: "token_revocation_not_enabled" redirect_from: - /docs/platform/errors/codes/40121 @@ -8,4 +8,4 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40121.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} -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. +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. diff --git a/src/pages/docs/platform/errors/codes/40125-application-integration-limit-exceeded.mdx b/src/pages/docs/platform/errors/codes/40125-application-integration-limit-exceeded.mdx index 2860e1b78a..57feda89b8 100644 --- a/src/pages/docs/platform/errors/codes/40125-application-integration-limit-exceeded.mdx +++ b/src/pages/docs/platform/errors/codes/40125-application-integration-limit-exceeded.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40125.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} An integration could not be created because the application had reached the maximum number of integrations permitted by its limits. + +## What you should do + +Remove integrations the application no longer needs, or [contact Ably support](https://ably.com/support) to raise the [integration limit](https://ably.com/docs/platform/pricing/limits), then create the integration again. + +## Why it happens + +The application already has the maximum number of integrations its package permits, so another could not be created. This limit applies per application. + +## What you'll see + +The error is reported with code 40125 and HTTP status 401. The message is `maximum number of rules per application exceeded`. diff --git a/src/pages/docs/platform/errors/codes/40127-application-api-key-limit-exceeded.mdx b/src/pages/docs/platform/errors/codes/40127-application-api-key-limit-exceeded.mdx index 28ceeb3946..1e9f35e22f 100644 --- a/src/pages/docs/platform/errors/codes/40127-application-api-key-limit-exceeded.mdx +++ b/src/pages/docs/platform/errors/codes/40127-application-api-key-limit-exceeded.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40127.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} A new API key could not be created because the application had reached the maximum number of keys permitted by its limits. + +## What you should do + +Delete API keys the application no longer needs, or [contact Ably support](https://ably.com/support) to raise the [key limit](https://ably.com/docs/platform/pricing/limits), then create the new key. + +## Why it happens + +The application already has the maximum number of API keys its package permits, so another could not be created. This limit applies per application. + +## What you'll see + +The error is reported with code 40127 and HTTP status 401. The message is `maximum number of keys per application exceeded`. diff --git a/src/pages/docs/platform/errors/codes/40131-key-revoked.mdx b/src/pages/docs/platform/errors/codes/40131-key-revoked.mdx index 653a52e087..f468207e3c 100644 --- a/src/pages/docs/platform/errors/codes/40131-key-revoked.mdx +++ b/src/pages/docs/platform/errors/codes/40131-key-revoked.mdx @@ -1,6 +1,6 @@ --- title: "40131: API key revoked" -meta_description: "A connection or request was rejected because the API key it used has been revoked. A revoked key is permanently invalidated and can no longer authenticate." +meta_description: "A connection or request was rejected because the API key it used has been revoked by an account admin and can no longer authenticate." identifier: "key_revoked" redirect_from: - /docs/platform/errors/codes/40131 @@ -8,4 +8,18 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40131.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} -A connection or request was rejected because the API key it used has been revoked. A revoked key is permanently invalidated and can no longer authenticate. +A connection or request was rejected because the API key it used has been revoked by an account admin and can no longer authenticate. + +## What you should do + +Move the client onto a different, valid credential. If you administer the account, select another active API key in the [Ably dashboard](https://ably.com/accounts/any/apps/any/app_keys) or create a new one; if the client uses [token authentication](https://ably.com/docs/auth/token), issue its tokens from that key instead. If you don't administer the account, ask an admin to do this and to provide the key or a token request generated from it. + +If the revocation was unexpected, find out why the key was revoked. It may have been revoked deliberately because it was compromised, rather than in error. + +## Why it happens + +An account admin revoked the key in the Ably dashboard, commonly because it was compromised, rotated out, or belonged to a decommissioned service. From that point on, any client still configured with the key is rejected, whether it authenticates with the key directly or uses it to request tokens. + +## What you'll see + +The error is reported with code 40131 and HTTP status 401. The message is typically `key/token status changed (revoke)`. diff --git a/src/pages/docs/platform/errors/codes/40133-wrong-api-key-for-token-revocation.mdx b/src/pages/docs/platform/errors/codes/40133-wrong-api-key-for-token-revocation.mdx index c70aa2c590..89292986e8 100644 --- a/src/pages/docs/platform/errors/codes/40133-wrong-api-key-for-token-revocation.mdx +++ b/src/pages/docs/platform/errors/codes/40133-wrong-api-key-for-token-revocation.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40133.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Make the [revocation request](https://ably.com/docs/auth/revocation) using the same API key that issued the tokens. The key you authenticate the request with must match the key named in the request path (`/keys/{keyName}/revokeTokens`). This is always a request error rather than a transient one, so correct the key and retry. + +## Why it happens + +The request authenticated with one API key but targeted a different key's tokens. This commonly happens because the `keyName` in the path belongs to another key, or the request was signed with the wrong key of an app that has several. + +## What you'll see + +The error is reported with code 40133 and HTTP status 401. The message is `Can only revoke tokens using the same key that issued them`. diff --git a/src/pages/docs/platform/errors/codes/40141-token-revoked.mdx b/src/pages/docs/platform/errors/codes/40141-token-revoked.mdx index a5f306ebd0..fe86b4e64b 100644 --- a/src/pages/docs/platform/errors/codes/40141-token-revoked.mdx +++ b/src/pages/docs/platform/errors/codes/40141-token-revoked.mdx @@ -9,3 +9,19 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40141.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Determine whether the revocation was expected. + +If it was deliberate, the connection or request has been rejected as intended. Check that your auth server is also configured to refuse new tokens to that client, though. [Revocation only invalidates tokens already issued](https://ably.com/docs/auth/revocation), so otherwise the client can just request a fresh token and carry on. + +If the revocation was unexpected, treat it as a security signal. A token is only invalidated when someone calls the [token revocation API](https://ably.com/docs/auth/revocation) with the key that issued it, typically an admin or an automated process cutting off credentials believed to be compromised. Find out who revoked it and why, and confirm the credentials are no longer exposed, before issuing replacements. + +## Why it happens + +Revocation invalidates a token before its normal expiry, which is distinct from a token that simply expired. A revocation request matches tokens by client ID, revocation key, or channel, but applies only to those issued before the point of revocation; a token issued afterwards, such as a renewed one, is unaffected. Revocable tokens are capped at a short lifetime so that a revocation takes full effect once the matching tokens issued beforehand have expired. + +## What you'll see + +The error is reported with code 40141 and HTTP status 401. The message is typically `token revoked`. diff --git a/src/pages/docs/platform/errors/codes/40142-token-expired.mdx b/src/pages/docs/platform/errors/codes/40142-token-expired.mdx index 17c1d807d4..77c547b684 100644 --- a/src/pages/docs/platform/errors/codes/40142-token-expired.mdx +++ b/src/pages/docs/platform/errors/codes/40142-token-expired.mdx @@ -14,7 +14,7 @@ The client's connection or request was rejected because the authentication token Usually nothing. Token expiry is a normal part of token authentication, and a client configured to renew its own tokens recovers without any intervention: it requests a fresh token and continues. A 40142 that appears briefly and then clears is expected, not a fault. -You only need to act when the error persists or surfaces to your application. That means renewal isn't happening — a configuration or auth-endpoint problem rather than the expiry itself, covered below. +You only need to act when the error persists or surfaces to your application. That means renewal isn't happening, a configuration or auth-endpoint problem rather than the expiry itself, covered below. ## Why it happens diff --git a/src/pages/docs/platform/errors/codes/40144-invalid-jwt.mdx b/src/pages/docs/platform/errors/codes/40144-invalid-jwt.mdx index e0dee55b45..d15a81c95c 100644 --- a/src/pages/docs/platform/errors/codes/40144-invalid-jwt.mdx +++ b/src/pages/docs/platform/errors/codes/40144-invalid-jwt.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40144.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Check how the JWT is generated. It must be well-formed, [signed with a supported algorithm](https://ably.com/docs/auth/token/jwt), and carry the required claims such as `iat` and `exp`. Correct the token generation on your auth server and reissue. + +## Why it happens + +A JWT presented for authentication couldn't be decoded or verified. Causes include a malformed token, an unsupported or deprecated signing algorithm, a missing key identifier (`kid`) in the header, or missing or empty required claims such as `iat` or `exp`. + +## What you'll see + +The error is reported with code 40144 and HTTP status 401. The message is typically `Unexpected exception decoding token; err = ...`. Some malformed-claim cases instead report status 400 with a message naming the claim, such as `Invalid token; iat must be specified`. diff --git a/src/pages/docs/platform/errors/codes/40160-capability-denied.mdx b/src/pages/docs/platform/errors/codes/40160-capability-denied.mdx index 8ed576fb6c..6bda8a4526 100644 --- a/src/pages/docs/platform/errors/codes/40160-capability-denied.mdx +++ b/src/pages/docs/platform/errors/codes/40160-capability-denied.mdx @@ -1,6 +1,6 @@ --- title: "40160: Client lacks the required capability" -meta_description: "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." +meta_description: "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." identifier: "capability_denied" redirect_from: - /docs/platform/errors/codes/40160 @@ -8,13 +8,13 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40160.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} -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. +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. ## What you should do If the client authenticates with an API key, assign the [capability](https://ably.com/docs/auth/capabilities) the operation needs to that key. If it authenticates with a [token](https://ably.com/docs/auth/token), update the code that issues tokens so they include that capability. -A client using an API key picks up the change on its next connection or request, though an existing connection keeps its capabilities until it reconnects. A client using a token keeps the capabilities baked into that token until it is refreshed — reconnecting with the same cached token will not help. If that delay matters, your application needs to trigger the affected clients to reconnect (for an API key) or refresh their token. +A client using an API key picks up the change on its next connection or request, though an existing connection keeps its capabilities until it reconnects. A client using a token keeps the capabilities baked into that token until it is refreshed. Reconnecting with the same cached token will not help. If that delay matters, your application needs to trigger the affected clients to reconnect (for an API key) or refresh their token. ## Why it happens @@ -26,4 +26,4 @@ Every operation requires a particular capability on the channel or resource it t ## What you'll see -The error is reported with code 40160 and HTTP status 401. The wording depends on the operation — the generic form is `operation not permitted with provided capability`, and more specific variants name the capability or resource involved, such as `Unauthorized to publish to channel` or `Listing channels requires the channel-metadata capability`. +The error is reported with code 40160 and HTTP status 401. The wording depends on the operation. The generic form is `operation not permitted with provided capability`, and more specific variants name the capability or resource involved, such as `Unauthorized to publish to channel` or `Listing channels requires the channel-metadata capability`. diff --git a/src/pages/docs/platform/errors/codes/40161-identified-client-required.mdx b/src/pages/docs/platform/errors/codes/40161-identified-client-required.mdx index b5be554f0a..9f65c9c8ce 100644 --- a/src/pages/docs/platform/errors/codes/40161-identified-client-required.mdx +++ b/src/pages/docs/platform/errors/codes/40161-identified-client-required.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40161.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} The client had no established client ID, so an operation that requires one was refused. + +## What you should do + +Authenticate the client with a client ID, or relax the namespace setting that requires one. A client gets an identifier by connecting with a token issued for a specific client ID, making it an [identified client](https://ably.com/docs/auth/identified-clients). Alternatively, change the namespace's settings in your app so it no longer requires identified clients. + +## Why it happens + +An operation was attempted on a channel whose namespace requires identified clients, by a client that had no client ID. The `identified` namespace enforces this by default, and any namespace can be configured to. + +## What you'll see + +The error is reported with code 40161 and HTTP status 401. The message is typically `Access denied to channel: namespace requires identified clients` or `operation not permitted as it requires an identified client`. diff --git a/src/pages/docs/platform/errors/codes/40165-channel-mode-not-requested-when-attaching.mdx b/src/pages/docs/platform/errors/codes/40165-channel-mode-not-requested-when-attaching.mdx index d4e18cc435..d7582674a4 100644 --- a/src/pages/docs/platform/errors/codes/40165-channel-mode-not-requested-when-attaching.mdx +++ b/src/pages/docs/platform/errors/codes/40165-channel-mode-not-requested-when-attaching.mdx @@ -1,6 +1,6 @@ --- title: "40165: Channel mode not requested when attaching" -meta_description: "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." +meta_description: "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." identifier: "channel_mode_not_requested_when_attaching" redirect_from: - /docs/platform/errors/codes/40165 @@ -8,17 +8,17 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40165.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} -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. +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. ## What you should do -Update the client so that when it attaches to the channel it requests the [channel mode](https://ably.com/docs/channels/options#modes) the operation needs. The error message names the operation that was refused — most commonly, publishing a message needs the `PUBLISH` mode, and entering, updating, or leaving presence needs the `PRESENCE` mode. +Update the client so that when it attaches to the channel it requests the [channel mode](https://ably.com/docs/channels/options#modes) the operation needs. The error message names the operation that was refused. Most commonly, publishing a message needs the `PUBLISH` mode, and entering, updating, or leaving presence needs the `PRESENCE` mode. -This is not a capability problem, so changing the token or key's capability will not help — the credentials already grant the operation. +This is not a capability problem, so changing the token or key's capability will not help, because the credentials already grant the operation. ## Why it happens -This error means the channel mode required to perform the operation was not among those the client requested when it attached — either because it requested a narrower set of modes (for example attaching to subscribe only and then publishing), or because the mode is not one of the [defaults](https://ably.com/docs/channels/options#modes) applied when no modes are specified. The credentials grant the operation; only the attach was missing the mode, so the fix is to request the required mode when attaching rather than to widen the credentials. +This error means the channel mode required to perform the operation was not among those the client requested when it attached, either because it requested a narrower set of modes (for example attaching to subscribe only and then publishing), or because the mode is not one of the [defaults](https://ably.com/docs/channels/options#modes) applied when no modes are specified. The credentials grant the operation; only the attach was missing the mode, so the fix is to request the required mode when attaching rather than to widen the credentials. ## What you'll see diff --git a/src/pages/docs/platform/errors/codes/40166-unidentified-client-cannot-modify-own-messages.mdx b/src/pages/docs/platform/errors/codes/40166-unidentified-client-cannot-modify-own-messages.mdx index 3a8f4f2071..fe7aaa4ae9 100644 --- a/src/pages/docs/platform/errors/codes/40166-unidentified-client-cannot-modify-own-messages.mdx +++ b/src/pages/docs/platform/errors/codes/40166-unidentified-client-cannot-modify-own-messages.mdx @@ -1,6 +1,6 @@ --- title: "40166: Unidentified client cannot modify own messages" -meta_description: "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." +meta_description: "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." identifier: "unidentified_client_cannot_modify_own_messages" redirect_from: - /docs/platform/errors/codes/40166 @@ -8,11 +8,11 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40166.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} -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. +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. ## What you should do -Update the client to set a `clientId`, so it connects as an [identified client](https://ably.com/docs/auth/identified-clients) which can own messages that an "own" capability can match; or grant the client the corresponding "any" [capability](https://ably.com/docs/auth/capabilities) — `message-update-any` or `message-delete-any` — which permits acting on messages regardless of author. +Update the client to set a `clientId`, so it connects as an [identified client](https://ably.com/docs/auth/identified-clients) which can own messages that an "own" capability can match; or grant the client the corresponding "any" [capability](https://ably.com/docs/auth/capabilities) (`message-update-any` or `message-delete-any`), which permits acting on messages regardless of author. ## Why it happens diff --git a/src/pages/docs/platform/errors/codes/40170-error-from-client-token-callback.mdx b/src/pages/docs/platform/errors/codes/40170-error-from-client-token-callback.mdx index 181f00b463..c36791b0cf 100644 --- a/src/pages/docs/platform/errors/codes/40170-error-from-client-token-callback.mdx +++ b/src/pages/docs/platform/errors/codes/40170-error-from-client-token-callback.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40170.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Fix your token-request mechanism. The SDK reached your `authUrl` or `authCallback` but got an error back instead of a token, so start from the accompanying message and check your auth endpoint. Common problems are a slow endpoint that times out, a missing `Content-Type` header, or a response whose content type the SDK can't parse. + +## Why it happens + +The client's own auth logic failed. The SDK invoked the configured `authUrl` or `authCallback` to obtain a token and got an error, so the cause lies in your application's auth endpoint or callback rather than in Ably. It can be a network error or timeout reaching the endpoint, or a response the SDK can't use. + +## What you'll see + +The error is reported with code 40170 and HTTP status 401. Messages include `authUrl response is missing a Content-Type header` and `authUrl responded with unacceptable Content-Type ...`. An `authUrl` must return `application/json`, `text/plain`, or `application/jwt`. diff --git a/src/pages/docs/platform/errors/codes/40171-token-renewal-not-configured.mdx b/src/pages/docs/platform/errors/codes/40171-token-renewal-not-configured.mdx index 5beeb41857..3492c70c74 100644 --- a/src/pages/docs/platform/errors/codes/40171-token-renewal-not-configured.mdx +++ b/src/pages/docs/platform/errors/codes/40171-token-renewal-not-configured.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40171.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Configure the client so it can [renew tokens](https://ably.com/docs/auth/token). Set an `authUrl`, `authCallback`, or API `key` in the client options, and the SDK will obtain a fresh token automatically when the current one expires. A bare token literal can't be renewed once it expires. + +## Why it happens + +The client was given only a token literal, with no `authUrl`, `authCallback`, or API key alongside it. When that token expired, the SDK had no configured way to obtain a replacement, so it couldn't continue. + +## What you'll see + +The error is reported with code 40171 and HTTP status 403. The message is typically `library initialized with a token literal without any way to renew the token when it expires (no authUrl, authCallback, or key)`. diff --git a/src/pages/docs/platform/errors/codes/40180-apns-token-authentication-required-for-location.mdx b/src/pages/docs/platform/errors/codes/40180-apns-token-authentication-required-for-location.mdx new file mode 100644 index 0000000000..2507d84263 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40180-apns-token-authentication-required-for-location.mdx @@ -0,0 +1,11 @@ +--- +title: "40180: APNs token authentication required for location notification" +meta_description: "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." +identifier: "apns_token_authentication_required_for_location" +redirect_from: + - /docs/platform/errors/codes/40180 +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40180.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. diff --git a/src/pages/docs/platform/errors/codes/40180-apns-token-authentication-required.mdx b/src/pages/docs/platform/errors/codes/40180-apns-token-authentication-required.mdx deleted file mode 100644 index 025831c7a0..0000000000 --- a/src/pages/docs/platform/errors/codes/40180-apns-token-authentication-required.mdx +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: "40180: APNs token authentication required" -meta_description: "A location or live-activity notification was not sent because these require the app's APNs credentials to use token-based authentication, but the app is not configured that way." -identifier: "apns_token_authentication_required" -redirect_from: - - /docs/platform/errors/codes/40180 ---- - -{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40180.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} - -A location or live-activity notification was not sent because these require the app's APNs credentials to use token-based authentication, but the app is not configured that way. diff --git a/src/pages/docs/platform/errors/codes/40182-apns-token-authentication-required-for-push-to-start.mdx b/src/pages/docs/platform/errors/codes/40182-apns-token-authentication-required-for-push-to-start.mdx new file mode 100644 index 0000000000..0379839d4c --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40182-apns-token-authentication-required-for-push-to-start.mdx @@ -0,0 +1,11 @@ +--- +title: "40182: APNs token authentication required for push-to-start Live Activities notification" +meta_description: "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." +identifier: "apns_token_authentication_required_for_push_to_start" +redirect_from: + - /docs/platform/errors/codes/40182 +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40182.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. diff --git a/src/pages/docs/platform/errors/codes/40300-forbidden.mdx b/src/pages/docs/platform/errors/codes/40300-forbidden.mdx index 8323669cd5..3ced1ca54e 100644 --- a/src/pages/docs/platform/errors/codes/40300-forbidden.mdx +++ b/src/pages/docs/platform/errors/codes/40300-forbidden.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40300.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Start from the accompanying message, which states why the request was refused. If a client lacks permission, grant the [capability](https://ably.com/docs/auth/capabilities) it needs or use credentials that have it. If the account or application appears to have been disabled and that is unexpected, [contact Ably support](https://ably.com/support). + +## Why it happens + +The request was refused as not permitted. 40300 is the generic code for a forbidden request and covers a range of conditions, such as an account or application that has been disabled, or a caller that lacks permission for the operation. + +## What you'll see + +The error is reported with code 40300 and HTTP status 403. The message describes the specific reason the request was forbidden. diff --git a/src/pages/docs/platform/errors/codes/40311-application-requires-a-tls-connection.mdx b/src/pages/docs/platform/errors/codes/40311-application-requires-a-tls-connection.mdx index dd48e47227..c906b8a234 100644 --- a/src/pages/docs/platform/errors/codes/40311-application-requires-a-tls-connection.mdx +++ b/src/pages/docs/platform/errors/codes/40311-application-requires-a-tls-connection.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40311.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} The connection was rejected because it did not use TLS, but the application requires TLS connections. + +## What you should do + +Connect over TLS. The application is configured to require it, so remove any `tls: false` setting from the client options, or set it to `true`. SDKs use TLS by default, so this normally means TLS was explicitly disabled. + +## Why it happens + +The connection did not use TLS, but the application has the TLS-only setting enabled, which rejects non-TLS connections. This applies to connections using token authentication; a non-TLS connection using Basic authentication is rejected as 40103 instead. + +## What you'll see + +The error is reported with code 40311 and HTTP status 403. The message is of the form `application requires TLS Connections; applicationId = `. diff --git a/src/pages/docs/platform/errors/codes/40330-account-not-permitted-in-cluster-or-region.mdx b/src/pages/docs/platform/errors/codes/40330-account-not-permitted-in-cluster-or-region.mdx index c42457f6fb..f1ffb36f46 100644 --- a/src/pages/docs/platform/errors/codes/40330-account-not-permitted-in-cluster-or-region.mdx +++ b/src/pages/docs/platform/errors/codes/40330-account-not-permitted-in-cluster-or-region.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40330.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} The request reached a cluster or region the account is not permitted to use; the accompanying error message gives the specific reason. + +## What you should do + +Configure every connecting client with the custom `endpoint` Ably issued for the account, following [platform customization](https://ably.com/docs/platform-customization), so requests reach the cluster or region the account is permitted to use. The accompanying message states which specific constraint the request violated. + +## Why it happens + +The account has a placement constraint limiting the cluster or region it may be activated in, and the request reached one that isn't permitted. This usually means a client connected to a default global endpoint instead of the custom endpoint for the account's dedicated deployment, typically because the `endpoint` client option was omitted. + +## What you'll see + +The error is reported with code 40330 and HTTP status 403. The default message is `Unable to activate account due to placement constraint`; an account may instead carry a more specific custom message. diff --git a/src/pages/docs/platform/errors/codes/40331-account-not-permitted-in-cluster.mdx b/src/pages/docs/platform/errors/codes/40331-account-not-permitted-in-cluster.mdx index 7e7768290c..2a0752ab2e 100644 --- a/src/pages/docs/platform/errors/codes/40331-account-not-permitted-in-cluster.mdx +++ b/src/pages/docs/platform/errors/codes/40331-account-not-permitted-in-cluster.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40331.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} The request reached an Ably cluster the account is not permitted to use. + +## What you should do + +Configure every connecting client with the custom `endpoint` Ably issued for the account, following [platform customization](https://ably.com/docs/platform-customization). This routes requests to the account's dedicated cluster instead of a default global endpoint. + +## Why it happens + +The account is pinned to a dedicated cluster, and the request reached a different one than it is permitted to use. This normally happens when a client connects without the custom `endpoint` set, so it falls back to the canonical global endpoint `main.realtime.ably.net` rather than the account's dedicated endpoint such as `acme.realtime.ably.net`. + +## What you'll see + +The error is reported with code 40331 and HTTP status 403. The message is `Unable to activate account due to placement constraint (incompatible environment)`. diff --git a/src/pages/docs/platform/errors/codes/40332-account-not-permitted-in-region.mdx b/src/pages/docs/platform/errors/codes/40332-account-not-permitted-in-region.mdx index edeefe2151..a8d3a5d2f4 100644 --- a/src/pages/docs/platform/errors/codes/40332-account-not-permitted-in-region.mdx +++ b/src/pages/docs/platform/errors/codes/40332-account-not-permitted-in-region.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40332.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} The request reached a region the account is not permitted to use. + +## What you should do + +Configure every connecting client with the custom `endpoint` Ably issued for the account, following [platform customization](https://ably.com/docs/platform-customization). This routes requests to a region the account is permitted to use. + +## Why it happens + +The account is restricted to one or more regions, such as EU-only or US-only, and the request reached a region outside that set. This normally happens when a client connects without the custom `endpoint` set and is routed to a default region the account isn't permitted to use. + +## What you'll see + +The error is reported with code 40332 and HTTP status 403. The message is `Unable to activate account due to placement constraint (incompatible site)`. diff --git a/src/pages/docs/platform/errors/codes/40400-not-found.mdx b/src/pages/docs/platform/errors/codes/40400-not-found.mdx index 745810b422..89bc26b469 100644 --- a/src/pages/docs/platform/errors/codes/40400-not-found.mdx +++ b/src/pages/docs/platform/errors/codes/40400-not-found.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40400.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} The requested resource does not exist, often because it has been deleted or the path or identifier used to reference it is incorrect. + +## What you should do + +Check the identifier or path used to reference the resource. The accompanying message names what wasn't found; confirm it exists and that identifiers such as the app ID or key ID are correct, including their case, since they are case-sensitive. + +## Why it happens + +The resource referenced by the request does not exist. It may have been deleted, or the path or identifier used to reference it may be wrong. A mismatch in the case of an identifier is a common cause. + +## What you'll see + +The error is reported with code 40400 and HTTP status 404. The message names the missing resource, for example a missing application or key. diff --git a/src/pages/docs/platform/errors/codes/42200-unprocessable-content.mdx b/src/pages/docs/platform/errors/codes/42200-unprocessable-content.mdx index 6bce6d83bb..c9808054b8 100644 --- a/src/pages/docs/platform/errors/codes/42200-unprocessable-content.mdx +++ b/src/pages/docs/platform/errors/codes/42200-unprocessable-content.mdx @@ -1,6 +1,6 @@ --- title: "42200: Message content could not be processed" -meta_description: "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." +meta_description: "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." identifier: "unprocessable_content" redirect_from: - /docs/platform/errors/codes/42200 @@ -8,4 +8,4 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/42200.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} -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. +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. diff --git a/src/pages/docs/platform/errors/codes/42210-content-rejected.mdx b/src/pages/docs/platform/errors/codes/42210-content-rejected.mdx index e0a3e8d6a0..d9bfabb321 100644 --- a/src/pages/docs/platform/errors/codes/42210-content-rejected.mdx +++ b/src/pages/docs/platform/errors/codes/42210-content-rejected.mdx @@ -1,6 +1,6 @@ --- title: "42210: Message content rejected" -meta_description: "A message was rejected by a content check — such as validation, moderation, or an integration — but the error does not identify which one." +meta_description: "A message was rejected by a content check (such as validation, moderation, or an integration), but the error does not identify which one." identifier: "content_rejected" redirect_from: - /docs/platform/errors/codes/42210 @@ -8,4 +8,4 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/42210.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} -A message was rejected by a content check — such as validation, moderation, or an integration — but the error does not identify which one. +A message was rejected by a content check (such as validation, moderation, or an integration), but the error does not identify which one. diff --git a/src/pages/docs/platform/errors/codes/42911-rate-limit-exceeded-per-connection-inbound.mdx b/src/pages/docs/platform/errors/codes/42911-rate-limit-exceeded-per-connection-inbound.mdx index 0ff60a0f11..224a74238f 100644 --- a/src/pages/docs/platform/errors/codes/42911-rate-limit-exceeded-per-connection-inbound.mdx +++ b/src/pages/docs/platform/errors/codes/42911-rate-limit-exceeded-per-connection-inbound.mdx @@ -14,7 +14,7 @@ A message was rejected because the connection published messages faster than the If the message matters, republish it after a short delay, increasing the delay if it is rejected again. -To stay within the limit, consider spreading publishing across more connections, since the limit applies to each connection on its own. If a single connection genuinely needs a higher rate, you can [request a higher limit](https://ably.com/docs/general/limits). +To stay within the limit, consider spreading publishing across more connections, since the limit applies to each connection on its own. If a single connection genuinely needs a higher rate, you can [request a higher limit](https://ably.com/docs/platform/pricing/limits). ## Why it happens diff --git a/src/pages/docs/platform/errors/codes/42913-rate-limit-exceeded-per-channel-inbound.mdx b/src/pages/docs/platform/errors/codes/42913-rate-limit-exceeded-per-channel-inbound.mdx index 12a8b47ddb..ee3eb3abd0 100644 --- a/src/pages/docs/platform/errors/codes/42913-rate-limit-exceeded-per-channel-inbound.mdx +++ b/src/pages/docs/platform/errors/codes/42913-rate-limit-exceeded-per-channel-inbound.mdx @@ -14,7 +14,7 @@ A message was rejected because the rate of messages published to the channel exc If the message matters, republish it after a short delay, increasing the delay if it is rejected again. -To keep within the limit, consider [spreading publishing across more channels](https://faqs.ably.com/how-do-i-avoid-hitting-the-max-channel-message-rate-limit), so traffic is divided between them rather than concentrated on one. If a channel genuinely needs a higher rate, you can [request a higher limit](https://ably.com/docs/general/limits). +To keep within the limit, consider [spreading publishing across more channels](https://faqs.ably.com/how-do-i-avoid-hitting-the-max-channel-message-rate-limit), so traffic is divided between them rather than concentrated on one. If a channel genuinely needs a higher rate, you can [request a higher limit](https://ably.com/docs/platform/pricing/limits). ## Why it happens diff --git a/src/pages/docs/platform/errors/codes/42914-rate-limit-exceeded-per-channel-bandwidth.mdx b/src/pages/docs/platform/errors/codes/42914-rate-limit-exceeded-per-channel-bandwidth.mdx index f2f4a3bf4a..f7d4ed3844 100644 --- a/src/pages/docs/platform/errors/codes/42914-rate-limit-exceeded-per-channel-bandwidth.mdx +++ b/src/pages/docs/platform/errors/codes/42914-rate-limit-exceeded-per-channel-bandwidth.mdx @@ -14,7 +14,7 @@ A message was rejected because the rate of data published to the channel exceede If the message matters, republish it after a short delay, increasing the delay if it is rejected again. -To keep within the limit, consider spreading publishing across more channels, so the data is divided between them rather than concentrated on one. If a channel genuinely needs more bandwidth, you can [request a higher limit](https://ably.com/docs/general/limits). +To keep within the limit, consider spreading publishing across more channels, so the data is divided between them rather than concentrated on one. If a channel genuinely needs more bandwidth, you can [request a higher limit](https://ably.com/docs/platform/pricing/limits). ## Why it happens diff --git a/src/pages/docs/platform/errors/codes/42915-rate-limit-exceeded-per-connection-outbound.mdx b/src/pages/docs/platform/errors/codes/42915-rate-limit-exceeded-per-connection-outbound.mdx index fdeb9a32e4..5216985987 100644 --- a/src/pages/docs/platform/errors/codes/42915-rate-limit-exceeded-per-connection-outbound.mdx +++ b/src/pages/docs/platform/errors/codes/42915-rate-limit-exceeded-per-connection-outbound.mdx @@ -17,7 +17,7 @@ What to do depends on whether your application can tolerate the gap: - If it can, no action is needed and the error can be ignored. - If it cannot, fetch the messages the connection did not receive from [history](https://ably.com/docs/storage-history/history) when it encounters this error. -To stop hitting the limit, consider spreading subscriptions across more connections, so that each one receives fewer messages. If a connection genuinely needs to receive messages at a higher rate, you can [request a higher limit](https://ably.com/docs/general/limits). +To stop hitting the limit, consider spreading subscriptions across more connections, so that each one receives fewer messages. If a connection genuinely needs to receive messages at a higher rate, you can [request a higher limit](https://ably.com/docs/platform/pricing/limits). ## Why it happens diff --git a/src/pages/docs/platform/errors/codes/42916-rate-limit-exceeded-per-connection-backlog.mdx b/src/pages/docs/platform/errors/codes/42916-rate-limit-exceeded-per-connection-backlog.mdx index 507de6cd1a..d79380b7d2 100644 --- a/src/pages/docs/platform/errors/codes/42916-rate-limit-exceeded-per-connection-backlog.mdx +++ b/src/pages/docs/platform/errors/codes/42916-rate-limit-exceeded-per-connection-backlog.mdx @@ -17,7 +17,7 @@ What to do depends on whether your application can tolerate the gap: - If it can, no action is needed and the error can be ignored. - If it cannot, fetch the messages the connection did not receive from [history](https://ably.com/docs/storage-history/history) when it encounters this error. -To stop hitting the limit, consider spreading subscriptions across more connections, so that each one receives fewer messages. If a connection genuinely needs to receive messages at a higher rate, you can [request a higher limit](https://ably.com/docs/general/limits). +To stop hitting the limit, consider spreading subscriptions across more connections, so that each one receives fewer messages. If a connection genuinely needs to receive messages at a higher rate, you can [request a higher limit](https://ably.com/docs/platform/pricing/limits). ## Why it happens diff --git a/src/pages/docs/platform/errors/codes/42917-rate-limit-exceeded-account-messages.mdx b/src/pages/docs/platform/errors/codes/42917-rate-limit-exceeded-account-messages.mdx index f2858e28e2..8f3f14116b 100644 --- a/src/pages/docs/platform/errors/codes/42917-rate-limit-exceeded-account-messages.mdx +++ b/src/pages/docs/platform/errors/codes/42917-rate-limit-exceeded-account-messages.mdx @@ -14,7 +14,7 @@ A message was rejected because the rate of messages published across the account If the message matters, republish it after a short delay, increasing the delay if it is rejected again. -This limit applies to your account's total publish rate, so spreading publishing across more connections or channels does not help: every publish in the account counts towards it. If your account consistently needs a higher publish rate, you can [request a higher limit](https://ably.com/docs/general/limits). +This limit applies to your account's total publish rate, so spreading publishing across more connections or channels does not help: every publish in the account counts towards it. If your account consistently needs a higher publish rate, you can [request a higher limit](https://ably.com/docs/platform/pricing/limits). ## Why it happens diff --git a/src/pages/docs/platform/errors/codes/42918-rate-limit-exceeded-account-api-requests.mdx b/src/pages/docs/platform/errors/codes/42918-rate-limit-exceeded-account-api-requests.mdx index 30d600064a..60687f672d 100644 --- a/src/pages/docs/platform/errors/codes/42918-rate-limit-exceeded-account-api-requests.mdx +++ b/src/pages/docs/platform/errors/codes/42918-rate-limit-exceeded-account-api-requests.mdx @@ -14,7 +14,7 @@ A REST API request was rejected because the request rate across the account exce If the request matters, retry it after a short delay, increasing the delay if it is rejected again. -This limit applies to your account's total REST API request rate, so making the requests from more clients or API keys does not help: every request in the account counts towards it. If your account consistently needs a higher request rate, you can [request a higher limit](https://ably.com/docs/general/limits). +This limit applies to your account's total REST API request rate, so making the requests from more clients or API keys does not help: every request in the account counts towards it. If your account consistently needs a higher request rate, you can [request a higher limit](https://ably.com/docs/platform/pricing/limits). ## Why it happens diff --git a/src/pages/docs/platform/errors/codes/42921-rate-limit-exceeded-per-connection-inbound-fatal.mdx b/src/pages/docs/platform/errors/codes/42921-rate-limit-exceeded-per-connection-inbound-fatal.mdx index bf4fac833d..15aa231191 100644 --- a/src/pages/docs/platform/errors/codes/42921-rate-limit-exceeded-per-connection-inbound-fatal.mdx +++ b/src/pages/docs/platform/errors/codes/42921-rate-limit-exceeded-per-connection-inbound-fatal.mdx @@ -1,6 +1,6 @@ --- title: "42921: Connection terminated for far exceeding the per-connection publish rate" -meta_description: "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." +meta_description: "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." identifier: "rate_limit_exceeded_per_connection_inbound_fatal" redirect_from: - /docs/platform/errors/codes/42921 @@ -8,15 +8,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/42921.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} -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. +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. ## What you should do -The connection can be re-established, but it will be closed again if it keeps publishing far above the limit. When individual publishes start being rejected, back off instead of retrying at full rate. If you need a higher overall publish rate, spread publishing across more connections, or [request a higher limit](https://ably.com/docs/general/limits). +The connection can be re-established, but it will be closed again if it keeps publishing far above the limit. When individual publishes start being rejected, back off instead of retrying at full rate. If you need a higher overall publish rate, spread publishing across more connections, or [request a higher limit](https://ably.com/docs/platform/pricing/limits). ## Why it happens -A connection that exceeds its per-connection publish rate limit normally just has the offending messages rejected with error 42911. If it keeps publishing far above the limit — around 20 times the permitted rate — Ably closes the connection instead, to protect the service from a runaway publisher. +A connection that exceeds its per-connection publish rate limit normally just has the offending messages rejected with error 42911. If it keeps publishing far above the limit, around 20 times the permitted rate, Ably closes the connection instead, to protect the service from a runaway publisher. ## What you'll see diff --git a/src/pages/docs/platform/errors/codes/42925-rate-limit-exceeded-account-integrations.mdx b/src/pages/docs/platform/errors/codes/42925-rate-limit-exceeded-account-integrations.mdx index df3b2ce2a5..31e5fc508c 100644 --- a/src/pages/docs/platform/errors/codes/42925-rate-limit-exceeded-account-integrations.mdx +++ b/src/pages/docs/platform/errors/codes/42925-rate-limit-exceeded-account-integrations.mdx @@ -14,7 +14,7 @@ An integration invocation was dropped because the invocation rate across the acc There is nothing to retry from your application: the messages that trigger your integrations are published as normal, but a proportion of the invocations they would cause are dropped while the account is over its limit. -This limit counts every integration invocation across your whole account. A high rate often comes from an integration whose channel filter matches a large number of channels, so its invocations add up across all of them. If your application does not need a filter that broad, narrowing it reduces how often the integration is invoked. The filter is configured on the integration itself, for both [webhooks](https://ably.com/docs/platform/integrations/webhooks#filter) and [streaming integrations](https://ably.com/docs/platform/integrations/streaming#filter). If your account legitimately needs a higher rate, you can [request a higher limit](https://ably.com/docs/general/limits). +This limit counts every integration invocation across your whole account. A high rate often comes from an integration whose channel filter matches a large number of channels, so its invocations add up across all of them. If your application does not need a filter that broad, narrowing it reduces how often the integration is invoked. The filter is configured on the integration itself, for both [webhooks](https://ably.com/docs/platform/integrations/webhooks#filter) and [streaming integrations](https://ably.com/docs/platform/integrations/streaming#filter). If your account legitimately needs a higher rate, you can [request a higher limit](https://ably.com/docs/platform/pricing/limits). ## Why it happens diff --git a/src/pages/docs/platform/errors/codes/42926-rate-limit-exceeded-account-push-notifications.mdx b/src/pages/docs/platform/errors/codes/42926-rate-limit-exceeded-account-push-notifications.mdx index 7166e21c29..a3d0c1709d 100644 --- a/src/pages/docs/platform/errors/codes/42926-rate-limit-exceeded-account-push-notifications.mdx +++ b/src/pages/docs/platform/errors/codes/42926-rate-limit-exceeded-account-push-notifications.mdx @@ -14,7 +14,7 @@ A push notification was dropped because the publish rate of push notifications a There is nothing to retry from your application: the messages are published as normal, but a proportion of the push notifications they trigger are dropped while the account is over its limit. -This limit applies to your account's total push notification rate, counting every push across all of its apps. If your account legitimately needs a higher rate, you can [request a higher limit](https://ably.com/docs/general/limits). +This limit applies to your account's total push notification rate, counting every push across all of its apps. If your account legitimately needs a higher rate, you can [request a higher limit](https://ably.com/docs/platform/pricing/limits). ## Why it happens diff --git a/src/pages/docs/platform/errors/codes/50000-internal-error.mdx b/src/pages/docs/platform/errors/codes/50000-internal-error.mdx index 9d7d4b7da1..e1112f763a 100644 --- a/src/pages/docs/platform/errors/codes/50000-internal-error.mdx +++ b/src/pages/docs/platform/errors/codes/50000-internal-error.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/50000.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} The request could not be completed because of an unexpected error inside the Ably platform. + +## What you should do + +This is an unexpected error inside Ably rather than a problem with your request, so retrying after a short delay is reasonable. If it persists, [contact Ably support](https://ably.com/support) with your app ID, roughly when it occurred, and any relevant logs. + +## Why it happens + +The request could not be completed because of an unexpected error inside the Ably platform. + +## What you'll see + +The error is reported with code 50000 and HTTP status 500. The message is typically `internal error`. diff --git a/src/pages/docs/platform/errors/codes/50001-internal-channel-error.mdx b/src/pages/docs/platform/errors/codes/50001-internal-channel-error.mdx index 988cc8018a..976684bf58 100644 --- a/src/pages/docs/platform/errors/codes/50001-internal-channel-error.mdx +++ b/src/pages/docs/platform/errors/codes/50001-internal-channel-error.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/50001.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} An operation on a channel failed because of an unexpected error inside the Ably platform. + +## What you should do + +This is an unexpected error inside Ably rather than a problem with your request, so retrying after a short delay is reasonable. If it persists, [contact Ably support](https://ably.com/support) with your app ID, the channel, and roughly when it occurred. + +## Why it happens + +An operation on a channel failed because of an unexpected error inside the Ably platform. + +## What you'll see + +The error is reported with code 50001 and HTTP status 500. The message is typically `Internal channel error`. diff --git a/src/pages/docs/platform/errors/codes/50002-internal-connection-error.mdx b/src/pages/docs/platform/errors/codes/50002-internal-connection-error.mdx index 0e8f8f9f18..ffede26da6 100644 --- a/src/pages/docs/platform/errors/codes/50002-internal-connection-error.mdx +++ b/src/pages/docs/platform/errors/codes/50002-internal-connection-error.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/50002.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} An operation on a connection failed because of an unexpected error inside the Ably platform. + +## What you should do + +This is an unexpected error inside Ably rather than a problem with your request, so retrying after a short delay is reasonable. If it persists, [contact Ably support](https://ably.com/support) with your app ID and roughly when it occurred. + +## Why it happens + +An operation on a connection failed because of an unexpected error inside the Ably platform. + +## What you'll see + +The error is reported with code 50002 and HTTP status 500. The message is typically `Internal connection error`. diff --git a/src/pages/docs/platform/errors/codes/50003-timeout-error.mdx b/src/pages/docs/platform/errors/codes/50003-timeout-error.mdx index 9476f97548..c68cb6ff14 100644 --- a/src/pages/docs/platform/errors/codes/50003-timeout-error.mdx +++ b/src/pages/docs/platform/errors/codes/50003-timeout-error.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/50003.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Retry after a short delay, increasing the delay if it recurs. This is usually a transient server-side delay rather than a problem with the request, so a retry generally succeeds. + +## Why it happens + +Ably did not finish handling the request within the time it allows, so the request was abandoned. This usually reflects a transient delay on the server side, for example while a channel or the internal message cache becomes ready. + +## What you'll see + +The error is reported with code 50003, usually with HTTP status 503 (some paths report 500). The message is of the form `Timeout exceeded while waiting for publish to be processed` or `Timed out waiting for the message cache to become ready`. diff --git a/src/pages/docs/platform/errors/codes/71302-no-subscription-to-product.mdx b/src/pages/docs/platform/errors/codes/71302-no-subscription-to-product.mdx index 90b0783ce7..1d8f5e41cf 100644 --- a/src/pages/docs/platform/errors/codes/71302-no-subscription-to-product.mdx +++ b/src/pages/docs/platform/errors/codes/71302-no-subscription-to-product.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/71302.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Subscribe to the product before accessing its channels, or check that an existing subscription is still active. A product's channels can only be received by an account that holds a current subscription to that product. + +## Why it happens + +The requester tried to receive a product the account is not subscribed to. Access to a product's channels is gated on an active subscription to that product. + +## What you'll see + +The error is reported with code 71302. The message is of the form `Requester has no subscription to this product`. diff --git a/src/pages/docs/platform/errors/codes/72000-livesync-operation-failed.mdx b/src/pages/docs/platform/errors/codes/72000-livesync-operation-failed.mdx index dfde5a77d9..2a8dacb987 100644 --- a/src/pages/docs/platform/errors/codes/72000-livesync-operation-failed.mdx +++ b/src/pages/docs/platform/errors/codes/72000-livesync-operation-failed.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/72000.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} A LiveSync database connector hit an unexpected error while running, so the operation it was attempting did not complete. + +## What you should do + +This is an unexpected internal error rather than something in your data or configuration. If it persists, [contact Ably support](https://ably.com/support) with the connector details and roughly when it occurred. + +## Why it happens + +The LiveSync connector hit an unexpected error while running, so the operation it was attempting did not complete. The underlying failure is attached as the cause. + +## What you'll see + +The error is reported with code 72000 and HTTP status 500. The message describes the operation that failed, with the underlying error attached as the cause. diff --git a/src/pages/docs/platform/errors/codes/72003-livesync-cannot-connect-db.mdx b/src/pages/docs/platform/errors/codes/72003-livesync-cannot-connect-db.mdx index 8babb485a2..bafdd2fea6 100644 --- a/src/pages/docs/platform/errors/codes/72003-livesync-cannot-connect-db.mdx +++ b/src/pages/docs/platform/errors/codes/72003-livesync-cannot-connect-db.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/72003.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Check that the database is running and reachable from Ably, and that the connection details and credentials in the [connector's configuration](https://ably.com/docs/livesync) are correct. This includes the host and port, and any network or firewall rules that must allow Ably to connect. + +## Why it happens + +The connector could not open a connection to the database it reads from. Common causes are the database being down or unreachable, network or firewall rules blocking Ably, or incorrect connection details or credentials in the configuration. + +## What you'll see + +The error is reported with code 72003 and HTTP status 500. The message is of the form `unable to connect to database: ` or `unable to start change stream: `. diff --git a/src/pages/docs/platform/errors/codes/72004-livesync-no-channel-key.mdx b/src/pages/docs/platform/errors/codes/72004-livesync-no-channel-key.mdx index 31ca5bf045..66ee50e758 100644 --- a/src/pages/docs/platform/errors/codes/72004-livesync-no-channel-key.mdx +++ b/src/pages/docs/platform/errors/codes/72004-livesync-no-channel-key.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/72004.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Make sure each change carries an `_ablyChannel` field naming the channel to publish to, at the top level of the change event rather than nested inside the document. This is normally set by the connector's [aggregation pipeline](https://ably.com/docs/livesync/mongodb). + +## Why it happens + +The connector read a change that had no `_ablyChannel` field, so it could not tell which channel to publish it to. Only changes that carry a channel name in `_ablyChannel` can be published, and the field has to be at the root of the change event, not under a nested document. + +## What you'll see + +The error is reported with code 72004 and HTTP status 400. The message is of the form `no channel key in message `. diff --git a/src/pages/docs/platform/errors/codes/72005-livesync-invalid-pipeline.mdx b/src/pages/docs/platform/errors/codes/72005-livesync-invalid-pipeline.mdx index 07fe6f5275..b13dd6cddf 100644 --- a/src/pages/docs/platform/errors/codes/72005-livesync-invalid-pipeline.mdx +++ b/src/pages/docs/platform/errors/codes/72005-livesync-invalid-pipeline.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/72005.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Correct the aggregation pipeline in the [connector's configuration](https://ably.com/docs/livesync/mongodb). Check for unrecognized operators or invalid syntax, and make sure every stage is one MongoDB accepts on a change stream. + +## Why it happens + +The MongoDB connector could not start because MongoDB rejected the aggregation pipeline in its configuration. This is usually an unrecognized stage or operator, a field that isn't allowed, or a syntax error. + +## What you'll see + +The error is reported with code 72005 and HTTP status 400. The message is of the form `invalid pipeline: `. diff --git a/src/pages/docs/platform/errors/codes/72006-livesync-cannot-resume.mdx b/src/pages/docs/platform/errors/codes/72006-livesync-cannot-resume.mdx index c8326f8ba0..a75a5987a1 100644 --- a/src/pages/docs/platform/errors/codes/72006-livesync-cannot-resume.mdx +++ b/src/pages/docs/platform/errors/codes/72006-livesync-cannot-resume.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/72006.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Check the resume token the connector stored in the database, since it could not be read back in the expected form. If the token document is corrupt or malformed the connector cannot continue from where it left off, so [contact Ably support](https://ably.com/support) if you can't resolve it. + +## Why it happens + +The MongoDB connector stores a resume token so it can continue its change stream after a restart. This error arises when that stored token cannot be read back, for example because the token document is not in the expected format. + +## What you'll see + +The error is reported with code 72006 and HTTP status 500. The message is of the form `unable to resume change stream: `. diff --git a/src/pages/docs/platform/errors/codes/72007-livesync-cannot-store-resume-token.mdx b/src/pages/docs/platform/errors/codes/72007-livesync-cannot-store-resume-token.mdx index 09691098ad..f2e4931c86 100644 --- a/src/pages/docs/platform/errors/codes/72007-livesync-cannot-store-resume-token.mdx +++ b/src/pages/docs/platform/errors/codes/72007-livesync-cannot-store-resume-token.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/72007.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Grant the connector's database user permission to read and write the `ably` collection, where the resume token is stored as a document. Without write access there, the connector cannot record how far it has read. + +## Why it happens + +The MongoDB connector saves its change-stream resume token to a document in a collection named `ably`, and it could not write it. This is usually because the connection's database user lacks read and write permission on that collection. + +## What you'll see + +The error is reported with code 72007 and HTTP status 500. The message is of the form `unable to store resume token: `. diff --git a/src/pages/docs/platform/errors/codes/80000-connection-failed.mdx b/src/pages/docs/platform/errors/codes/80000-connection-failed.mdx index 85c344f79a..f6e2746310 100644 --- a/src/pages/docs/platform/errors/codes/80000-connection-failed.mdx +++ b/src/pages/docs/platform/errors/codes/80000-connection-failed.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80000.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Start from the error attached to the failed state, which explains why the connection failed. Because the [failed state](https://ably.com/docs/connect/states) is terminal, the SDK will not reconnect on its own, so once the underlying cause is resolved you need to call `connect()` to try again. + +## Why it happens + +The connection entered the failed state, usually because of an error the SDK treats as non-recoverable rather than a passing network problem. A fatal authentication error is a common cause. This is distinct from a temporary disconnection, where the SDK keeps retrying by itself. + +## What you'll see + +The error is reported with code 80000. The message is typically `Connection failed or disconnected by server`, though the failure that caused it carries its own, more specific error. diff --git a/src/pages/docs/platform/errors/codes/80002-connection-suspended.mdx b/src/pages/docs/platform/errors/codes/80002-connection-suspended.mdx index 9bb4ae5f82..3172d45587 100644 --- a/src/pages/docs/platform/errors/codes/80002-connection-suspended.mdx +++ b/src/pages/docs/platform/errors/codes/80002-connection-suspended.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80002.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Usually nothing, since the SDK keeps trying to reconnect from the suspended state on its own. To see why the connection dropped, read the reason on the [connection state change](https://ably.com/docs/connect/states) event the SDK emits. When it reconnects, channels are re-attached automatically, but messages published while it was suspended are not replayed, so use the [history API](https://ably.com/docs/storage-history/history) to catch up on any you need. + +## Why it happens + +The connection was disconnected for around two minutes without recovering, so it moved from disconnected to suspended. This is usually a prolonged network interruption between the client and Ably rather than a fault in the request. + +## What you'll see + +The error is reported with code 80002 and HTTP status 400. The message is typically `Connection to server unavailable`. diff --git a/src/pages/docs/platform/errors/codes/80005-connection-no-longer-available.mdx b/src/pages/docs/platform/errors/codes/80005-connection-no-longer-available.mdx index 97a08df81f..ac070c7d54 100644 --- a/src/pages/docs/platform/errors/codes/80005-connection-no-longer-available.mdx +++ b/src/pages/docs/platform/errors/codes/80005-connection-no-longer-available.mdx @@ -1,6 +1,6 @@ --- title: "80005: Connection no longer available" -meta_description: "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." +meta_description: "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." identifier: "connection_no_longer_available" redirect_from: - /docs/platform/errors/codes/80005 @@ -8,4 +8,4 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80005.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} -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. +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. diff --git a/src/pages/docs/platform/errors/codes/80014-connection-timed-out.mdx b/src/pages/docs/platform/errors/codes/80014-connection-timed-out.mdx index eebda69bf2..301ed7d251 100644 --- a/src/pages/docs/platform/errors/codes/80014-connection-timed-out.mdx +++ b/src/pages/docs/platform/errors/codes/80014-connection-timed-out.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80014.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Usually nothing, since the SDK retries automatically. If the connection never establishes, check that the network and any firewall or proxy between the client and Ably allow access to Ably's endpoints, and look for a slow or unreliable path that keeps requests from completing in time. + +## Why it happens + +The connection wasn't established, or an expected response didn't arrive, within the time the SDK allows before timing out. This usually reflects a slow or unreliable network path, or the client being unable to reach Ably's primary and fallback endpoints. + +## What you'll see + +The error is reported with code 80014. The message is typically `connection timed out`, and the request is retried automatically. diff --git a/src/pages/docs/platform/errors/codes/80016-connection-replaced-by-a-newer-one.mdx b/src/pages/docs/platform/errors/codes/80016-connection-replaced-by-a-newer-one.mdx index a2730033e1..b7eef0082d 100644 --- a/src/pages/docs/platform/errors/codes/80016-connection-replaced-by-a-newer-one.mdx +++ b/src/pages/docs/platform/errors/codes/80016-connection-replaced-by-a-newer-one.mdx @@ -1,6 +1,6 @@ --- title: "80016: Connection replaced by a newer one" -meta_description: "An operation was attempted on a connection that was no longer current — a newer connection had replaced it, or its transport handle had been recycled — so the operation could not be applied and the client re-establishes to continue." +meta_description: "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." identifier: "connection_replaced_by_a_newer_one" redirect_from: - /docs/platform/errors/codes/80016 @@ -8,4 +8,16 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80016.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} -An operation was attempted on a connection that was no longer current — a newer connection had replaced it, or its transport handle had been recycled — so the operation could not be applied and the client re-establishes to continue. +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. + +## What you should do + +Usually nothing. This is a non-fatal error that the SDK handles by re-establishing the connection, so it normally appears only in logs. Investigate only if it surfaces to your application repeatedly. + +## Why it happens + +An operation was made against a connection that was no longer the current one, because a newer connection had already replaced it. This happens during normal reconnection, so the operation could not be applied to the old, superseded connection. + +## What you'll see + +The error is reported with code 80016 and HTTP status 410. The message is typically `Invalid transport id: `. diff --git a/src/pages/docs/platform/errors/codes/80017-connection-closed.mdx b/src/pages/docs/platform/errors/codes/80017-connection-closed.mdx index a932f24321..1a9a176cb5 100644 --- a/src/pages/docs/platform/errors/codes/80017-connection-closed.mdx +++ b/src/pages/docs/platform/errors/codes/80017-connection-closed.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80017.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Nothing, if you closed the connection on purpose. If you didn't expect it, an operation was attempted on a connection that had already been closed; check the [connection state](https://ably.com/docs/connect/states) before acting on it, or open a new connection first. + +## Why it happens + +The connection was closed by request, and then either reported as closed or acted on after closing. Closing is deliberate and final for that connection, so it is not a fault in itself. + +## What you'll see + +The error is reported with code 80017 and HTTP status 400. The message is typically `Connection closed`. diff --git a/src/pages/docs/platform/errors/codes/80019-token-request-failed.mdx b/src/pages/docs/platform/errors/codes/80019-token-request-failed.mdx index 58e50e386f..e6117a3b33 100644 --- a/src/pages/docs/platform/errors/codes/80019-token-request-failed.mdx +++ b/src/pages/docs/platform/errors/codes/80019-token-request-failed.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80019.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} The Ably SDK failed to retrieve a token from the configured authUrl or authCallback. + +## What you should do + +Fix your token-request mechanism. The SDK tried to obtain a token from your `authUrl` or `authCallback` and the attempt failed, so inspect the error's `cause` field for the underlying reason and check that your auth endpoint is reachable and returns a valid token. A `403` from your endpoint fails the connection, so make sure it doesn't reject valid clients. + +## Why it happens + +Obtaining a token through the configured [authUrl or authCallback](https://ably.com/docs/auth) failed, so the connection could not authenticate. Common causes are the endpoint being unreachable, timing out, returning an error status, or returning something that isn't a valid token or token request. + +## What you'll see + +The error is reported with code 80019, with HTTP status 401, or 403 when your endpoint responds `403`. The message is typically `Client configured authentication provider request failed`, and the underlying error is attached as the `cause`. diff --git a/src/pages/docs/platform/errors/codes/80020-connection-discontinuity-message-rate-exceeded.mdx b/src/pages/docs/platform/errors/codes/80020-connection-discontinuity-message-rate-exceeded.mdx index bff3fe2e0a..fa0cb629d3 100644 --- a/src/pages/docs/platform/errors/codes/80020-connection-discontinuity-message-rate-exceeded.mdx +++ b/src/pages/docs/platform/errors/codes/80020-connection-discontinuity-message-rate-exceeded.mdx @@ -17,7 +17,7 @@ What to do depends on whether your application can tolerate the gap: - If it can, no action is needed and the error can be ignored. - If it cannot, fetch the messages the connection did not receive from [history](https://ably.com/docs/storage-history/history) when it encounters this error. -To stop hitting the limit, consider spreading subscriptions across more connections, so that each one receives fewer messages. If a connection genuinely needs to receive messages at a higher rate, you can [request a higher limit](https://ably.com/docs/general/limits). +To stop hitting the limit, consider spreading subscriptions across more connections, so that each one receives fewer messages. If a connection genuinely needs to receive messages at a higher rate, you can [request a higher limit](https://ably.com/docs/platform/pricing/limits). ## Why it happens diff --git a/src/pages/docs/platform/errors/codes/80021-rate-limit-exceeded-account-connection-creation.mdx b/src/pages/docs/platform/errors/codes/80021-rate-limit-exceeded-account-connection-creation.mdx index 40be8698c2..023114aeff 100644 --- a/src/pages/docs/platform/errors/codes/80021-rate-limit-exceeded-account-connection-creation.mdx +++ b/src/pages/docs/platform/errors/codes/80021-rate-limit-exceeded-account-connection-creation.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80021.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +If the connection is needed, retry it after a short delay, increasing the delay if it is refused again. This limit applies to your account's total rate of opening new connections, so opening them from more clients does not help: every new connection in the account counts towards it. If your account consistently needs to open connections faster, you can [request a higher limit](https://ably.com/docs/platform/pricing/limits). + +## Why it happens + +Your account has a maximum rate at which new connections can be opened across all of its apps, set by your account's limits. This is about how quickly connections are opened, not how many are open at once. When new connections are opened faster than the permitted rate, further attempts are refused until it falls back within the limit. + +## What you'll see + +The connection is refused. The error is reported with code 80021 and HTTP status 429, with a message of the form `Maximum account-wide instantaneous connections rate exceeded; permitted rate = ...; metric = connections.maxRate`. diff --git a/src/pages/docs/platform/errors/codes/80022-connection-not-found.mdx b/src/pages/docs/platform/errors/codes/80022-connection-not-found.mdx index 9be18c72a6..504bec1e0c 100644 --- a/src/pages/docs/platform/errors/codes/80022-connection-not-found.mdx +++ b/src/pages/docs/platform/errors/codes/80022-connection-not-found.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80022.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Usually nothing. This is a non-fatal error that the SDK handles by re-establishing the connection, so no intervention is normally needed. Investigate only if it surfaces to your application repeatedly. + +## Why it happens + +A request reached a server that wasn't handling the connection it referred to, so the connection couldn't be found. This is typically a transient routing effect, for example after disruption on one of Ably's servers, and it resolves once the client reconnects. + +## What you'll see + +The error is reported with code 80022 and HTTP status 410. The message is typically `Unable to find connection`. diff --git a/src/pages/docs/platform/errors/codes/80023-connection-re-established-in-a-different-region.mdx b/src/pages/docs/platform/errors/codes/80023-connection-re-established-in-a-different-region.mdx index 4fca28055b..60cb5a64d4 100644 --- a/src/pages/docs/platform/errors/codes/80023-connection-re-established-in-a-different-region.mdx +++ b/src/pages/docs/platform/errors/codes/80023-connection-re-established-in-a-different-region.mdx @@ -20,8 +20,8 @@ The only thing to be aware of is presence: a presence member is identified by bo When a client briefly drops its connection, it can reconnect and carry on with the same connection ID rather than being assigned a new one. -A connection ID cannot be carried across Ably regions, and the main reason is presence. When a client enters presence, its membership is registered against its connection ID and tracked by the region it is connected to, and Ably checks whether those members are still present only within that region, not across regions — which keeps regions independent of one another. So if the client reconnects to a different region, it is issued a new connection ID instead of keeping the previous one. +A connection ID cannot be carried across Ably regions, and the main reason is presence. When a client enters presence, its membership is registered against its connection ID and tracked by the region it is connected to, and Ably checks whether those members are still present only within that region, not across regions, which keeps regions independent of one another. So if the client reconnects to a different region, it is issued a new connection ID instead of keeping the previous one. ## What you'll see -The connection reaches the connected state, so this surfaces as the connection's error reason rather than a failure. It is reported with code 80023 and HTTP status 400, with the message `Unable to resume connection from another site` — "site" here is the internal term for a region. +The connection reaches the connected state, so this surfaces as the connection's error reason rather than a failure. It is reported with code 80023 and HTTP status 400, with the message `Unable to resume connection from another site`. Here, "site" is the internal term for a region. diff --git a/src/pages/docs/platform/errors/codes/80024-outdated-ably-sdk-version.mdx b/src/pages/docs/platform/errors/codes/80024-outdated-ably-sdk-version.mdx index ba14dcb66d..0b6a2e8cea 100644 --- a/src/pages/docs/platform/errors/codes/80024-outdated-ably-sdk-version.mdx +++ b/src/pages/docs/platform/errors/codes/80024-outdated-ably-sdk-version.mdx @@ -25,4 +25,4 @@ The error is reported with code 80024 and HTTP status 400. You may see it only i - While the connection still succeeds, it carries the warning `Support for this protocol version will be removed imminently, please update your SDK immediately`. - Once that protocol version is being removed, the connection is refused with `This protocol version is no longer supported, please update your SDK version to connect`. -The "protocol version" named in these messages corresponds to your installed SDK version — the thing you update to resolve this. +The "protocol version" named in these messages corresponds to your installed SDK version, which is the thing you update to resolve this. diff --git a/src/pages/docs/platform/errors/codes/90001-channel-operation-failed-invalid-channel-state.mdx b/src/pages/docs/platform/errors/codes/90001-channel-operation-failed-invalid-channel-state.mdx index 288abd3db6..25903b3027 100644 --- a/src/pages/docs/platform/errors/codes/90001-channel-operation-failed-invalid-channel-state.mdx +++ b/src/pages/docs/platform/errors/codes/90001-channel-operation-failed-invalid-channel-state.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/90001.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Refer to the [channel's state](https://ably.com/docs/channels/states) and its error reason to see why the operation wasn't allowed. A failed channel does not recover on its own: address the cause reported in its error reason, often an authentication or capability problem, then call `attach()` to re-establish it. A suspended channel is re-attached automatically once the connection is restored. If you are releasing a channel, detach it first, since a channel can only be released once it can no longer receive updates. + +## Why it happens + +The operation is only valid in certain channel states, and the channel was in a different one. Common cases are performing an action on a channel that is not currently attached, detaching a channel that has failed, or releasing a channel that could still receive updates. + +## What you'll see + +The error is reported with code 90001. The message is of the form `Channel operation failed as channel state is `; the server reports `Unable to perform operation on channel: (not currently attached)` with HTTP status 404. diff --git a/src/pages/docs/platform/errors/codes/90002-channel-history-could-not-be-retrieved.mdx b/src/pages/docs/platform/errors/codes/90002-channel-history-could-not-be-retrieved.mdx index 654bef8bdf..477bcc45ce 100644 --- a/src/pages/docs/platform/errors/codes/90002-channel-history-could-not-be-retrieved.mdx +++ b/src/pages/docs/platform/errors/codes/90002-channel-history-could-not-be-retrieved.mdx @@ -1,6 +1,6 @@ --- title: "90002: Channel history could not be retrieved" -meta_description: "A request for a channel's message history could not be completed, because the position it asked to read from could not be resolved — either the query was incomplete or the point requested is no longer retained." +meta_description: "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." identifier: "channel_history_could_not_be_retrieved" redirect_from: - /docs/platform/errors/codes/90002 @@ -8,4 +8,4 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/90002.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} -A request for a channel's message history could not be completed, because the position it asked to read from could not be resolved — either the query was incomplete or the point requested is no longer retained. +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. diff --git a/src/pages/docs/platform/errors/codes/90003-channel-continuity-not-guaranteed.mdx b/src/pages/docs/platform/errors/codes/90003-channel-continuity-not-guaranteed.mdx index 5398bb92c0..ae815c0aba 100644 --- a/src/pages/docs/platform/errors/codes/90003-channel-continuity-not-guaranteed.mdx +++ b/src/pages/docs/platform/errors/codes/90003-channel-continuity-not-guaranteed.mdx @@ -21,8 +21,8 @@ The channel stays attached and keeps delivering new messages, so nothing is brok Clients keep track of the last message they received on a channel. When they reconnect they automatically tell Ably which message that was, so that they can receive any messages they may have missed. -Ably only keeps previous messages for a short time — [around two minutes](https://ably.com/docs/connect/states). If a client is disconnected for longer than that, the message it had reached, along with all others older than two minutes, are gone. Ably then reattaches the client at the earliest point still available, and any messages published before that point may not have reached it. +Ably only keeps previous messages for a short time, [around two minutes](https://ably.com/docs/connect/states). If a client is disconnected for longer than that, the message it had reached, along with all others older than two minutes, are gone. Ably then reattaches the client at the earliest point still available, and any messages published before that point may not have reached it. ## What you'll see -The error is reported with code 90003 and HTTP status 404. The message reads `Unable to recover channel (messages expired)` — despite that wording, it means continuity is not guaranteed, not that messages are known to have expired. +The error is reported with code 90003 and HTTP status 404. The message reads `Unable to recover channel (messages expired)`. Despite that wording, it means continuity is not guaranteed, not that messages are known to have expired. diff --git a/src/pages/docs/platform/errors/codes/90004-channel-backlog-too-large.mdx b/src/pages/docs/platform/errors/codes/90004-channel-backlog-too-large.mdx index 361e485c0d..e19befd771 100644 --- a/src/pages/docs/platform/errors/codes/90004-channel-backlog-too-large.mdx +++ b/src/pages/docs/platform/errors/codes/90004-channel-backlog-too-large.mdx @@ -21,7 +21,7 @@ The channel stays attached and keeps delivering new messages, so nothing is brok When a client resumes or [rewinds](https://ably.com/docs/channels/options/rewind) a channel, Ably replays the messages published in the requested range. There is a limit on how many it can replay at once. If the range holds more than that, Ably delivers the most recent messages up to the limit, and the older ones beyond it are not replayed. -This is most likely on high-throughput channels, or when recovering over a long or busy period — for example a `rewind` covering more messages than the limit. +This is most likely on high-throughput channels, or when recovering over a long or busy period, for example a `rewind` covering more messages than the limit. ## What you'll see diff --git a/src/pages/docs/platform/errors/codes/90005-channel-resumed-in-a-different-region.mdx b/src/pages/docs/platform/errors/codes/90005-channel-resumed-in-a-different-region.mdx index 1bd263345e..fb4401c912 100644 --- a/src/pages/docs/platform/errors/codes/90005-channel-resumed-in-a-different-region.mdx +++ b/src/pages/docs/platform/errors/codes/90005-channel-resumed-in-a-different-region.mdx @@ -25,4 +25,4 @@ The record of the order of messages is specific to the region each client was co ## What you'll see -The error is reported with code 90005 and HTTP status 404, with the message `Unable to recover channel (unable to resume from a different site)` — "site" here is the internal term for a region. +The error is reported with code 90005 and HTTP status 404, with the message `Unable to recover channel (unable to resume from a different site)`. Here, "site" is the internal term for a region. diff --git a/src/pages/docs/platform/errors/codes/90007-channel-operation-timed-out.mdx b/src/pages/docs/platform/errors/codes/90007-channel-operation-timed-out.mdx index 629cba387c..8f44743b83 100644 --- a/src/pages/docs/platform/errors/codes/90007-channel-operation-timed-out.mdx +++ b/src/pages/docs/platform/errors/codes/90007-channel-operation-timed-out.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/90007.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Usually nothing. After an attach times out the channel becomes suspended, and the SDK retries the attach automatically while the connection is connected; you can call `attach()` to retry immediately. After a detach times out the channel returns to the attached state, so call `detach()` again if you still want to detach. If operations keep timing out, check the network path between the client and Ably, and inspect the channel's error reason. + +## Why it happens + +The channel attach or detach did not receive a response from Ably within the time the SDK allows, so it timed out. This is usually a transient interruption or a slow network path rather than a fault in the request. + +## What you'll see + +The error is reported with code 90007 and HTTP status 408. The message is `Channel attach timed out` or `Channel detach timed out`. diff --git a/src/pages/docs/platform/errors/codes/90008-attach-point-not-found.mdx b/src/pages/docs/platform/errors/codes/90008-attach-point-not-found.mdx index 9e30475672..a88d6bdd03 100644 --- a/src/pages/docs/platform/errors/codes/90008-attach-point-not-found.mdx +++ b/src/pages/docs/platform/errors/codes/90008-attach-point-not-found.mdx @@ -14,9 +14,9 @@ A history request using untilAttach relies on the channel's attach point still b Whether this matters depends on whether the channel has [persistence](https://ably.com/docs/storage-history/storage) enabled. -Without persistence, there is nothing to do and the error can be ignored. The client already has all recent messages, because it has received everything since its attach point and that point is older than the recent window. The older history [untilAttach](https://ably.com/docs/storage-history/history) would have returned is not retained, so there is nothing more to recover. +Without persistence, there is nothing to do and the error can be ignored. The client already has all recent messages, because it has received everything since its attach point and that point is older than the recent window. The older history [`untilAttach`](https://ably.com/docs/storage-history/history) would have returned is not retained, so there is nothing more to recover. -With persistence, the older history untilAttach would have returned is retained, and can be fetched with a plain [history](https://ably.com/docs/storage-history/history) request without untilAttach. That response won't line up exactly with the messages the client already received from the channel, so choose how to reconcile them: +With persistence, the older history `untilAttach` would have returned is retained, and can be fetched with a plain [history](https://ably.com/docs/storage-history/history) request without `untilAttach`. That response won't line up exactly with the messages the client already received from the channel, so choose how to reconcile them: - **Remove duplicates yourself.** Discard any messages in the response that the client already received. This keeps a gap-free record but your application has to deduplicate. - **Accept possible duplicates.** Less work, but some messages may appear both in the response and among those already received. @@ -26,9 +26,9 @@ Which is best depends on whether duplicate messages or missing history is worse ## Why it happens -untilAttach returns history up to the attach point, and it works from Ably's window of recent messages — about two minutes. It can therefore only serve an attach point that still falls within that window. +`untilAttach` returns history up to the attach point, and it works from Ably's window of recent messages, about two minutes. It can therefore only serve an attach point that still falls within that window. -This error means the attach point was older than that, so untilAttach could not use it. The messages themselves are unaffected; whether the older ones can still be retrieved depends on the channel's persistence. +This error means the attach point was older than that, so `untilAttach` could not use it. The messages themselves are unaffected; whether the older ones can still be retrieved depends on the channel's persistence. ## What you'll see diff --git a/src/pages/docs/platform/errors/codes/90010-too-many-channels.mdx b/src/pages/docs/platform/errors/codes/90010-too-many-channels.mdx index 1a02cbf887..9374ff6cb6 100644 --- a/src/pages/docs/platform/errors/codes/90010-too-many-channels.mdx +++ b/src/pages/docs/platform/errors/codes/90010-too-many-channels.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/90010.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +If you hit the per-connection limit, detach channels the connection no longer needs; the usual cause is channels that are attached and then never explicitly detached. If you hit it on a batch publish or batch presence request, reduce the number of channels included in a single request. If your use case genuinely needs more, [contact Ably support](https://ably.com/support) to raise the limit. + +## Why it happens + +The operation would exceed a maximum number of channels. This applies in two places: the number of channels attached to a single connection, and the number of channels included in a single batch publish or batch presence request. Both limits are set by the account. + +## What you'll see + +The error is reported with code 90010 and HTTP status 400. The messages include `Maximum number of channels per connection () exceeded`, `Max number of channels permitted in a single bulk publish request () exceeded`, and `Max number of channels permitted in a single batch presence request () exceeded`. diff --git a/src/pages/docs/platform/errors/codes/90021-rate-limit-exceeded-account-channel-creation.mdx b/src/pages/docs/platform/errors/codes/90021-rate-limit-exceeded-account-channel-creation.mdx index 88163fe348..bee42a5c47 100644 --- a/src/pages/docs/platform/errors/codes/90021-rate-limit-exceeded-account-channel-creation.mdx +++ b/src/pages/docs/platform/errors/codes/90021-rate-limit-exceeded-account-channel-creation.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/90021.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Usually nothing: this is non-fatal, and the SDK retries the channel automatically until it succeeds. If you create channels through the REST API and it matters, retry after a short delay, increasing the delay if it is rejected again. This limit applies to your account's total rate of activating new channels, so spreading them across more connections does not help: every newly activated channel in the account counts towards it. If your account consistently needs to create channels faster, you can [request a higher limit](https://ably.com/docs/platform/pricing/limits). + +## Why it happens + +Your account has a maximum rate at which new channels can be activated across all of its apps, set by your account's limits. When channels are activated faster than that, further activations are rejected until the rate falls back within the limit. Because this applies across the whole account, a channel activation can be rejected even when no single connection is creating channels quickly on its own. + +## What you'll see + +The error is reported with code 90021 and HTTP status 429, with a message of the form `Maximum account-wide instantaneous channels rate exceeded; permitted rate = ...; metric = channels.maxRate`. Because it is non-fatal, the SDK retries automatically. diff --git a/src/pages/docs/platform/errors/codes/91000-cannot-enter-presence-without-a-client-id.mdx b/src/pages/docs/platform/errors/codes/91000-cannot-enter-presence-without-a-client-id.mdx index 04159d08f5..8005e393ad 100644 --- a/src/pages/docs/platform/errors/codes/91000-cannot-enter-presence-without-a-client-id.mdx +++ b/src/pages/docs/platform/errors/codes/91000-cannot-enter-presence-without-a-client-id.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/91000.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Give the client a [client ID](https://ably.com/docs/auth/identified-clients) before it enters presence. Set one when the client authenticates, either in the client options or in the token issued to it, or enter on behalf of a specific client ID with `enterClient()`. + +## Why it happens + +The client tried to enter the presence set without a client ID. A connection has no client ID when it authenticates with Basic authentication, or with a token whose client ID is a wildcard, and none was set in the client options. + +## What you'll see + +The error is reported with code 91000 and HTTP status 400. The message is of the form `unable to enter presence channel (no clientId)`. diff --git a/src/pages/docs/platform/errors/codes/91001-cannot-enter-presence-in-the-channels-current-state.mdx b/src/pages/docs/platform/errors/codes/91001-cannot-enter-presence-in-the-channels-current-state.mdx index ed5b98617d..d519f15230 100644 --- a/src/pages/docs/platform/errors/codes/91001-cannot-enter-presence-in-the-channels-current-state.mdx +++ b/src/pages/docs/platform/errors/codes/91001-cannot-enter-presence-in-the-channels-current-state.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/91001.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Enter presence once the channel is attached. If the channel is detached, reattach it; if it is suspended, wait for the connection to be restored, after which the SDK reattaches automatically; if it has failed, resolve the cause shown in its [error reason](https://ably.com/docs/channels/states) before reattaching. + +## Why it happens + +Presence can only be entered on an attached channel, and the channel was detached, suspended, or failed at the time. + +## What you'll see + +The error is reported with code 91001 and HTTP status 400. The message is of the form `unable to enter presence channel (invalid channel state: )`. diff --git a/src/pages/docs/platform/errors/codes/91003-too-many-presence-members.mdx b/src/pages/docs/platform/errors/codes/91003-too-many-presence-members.mdx index 57cd092b0e..b035c15a67 100644 --- a/src/pages/docs/platform/errors/codes/91003-too-many-presence-members.mdx +++ b/src/pages/docs/platform/errors/codes/91003-too-many-presence-members.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/91003.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Reduce the number of members present on the channel, for example by spreading them across more channels, since members that leave or whose connections close free capacity. This per-channel limit is the same on every package, so if your use case genuinely needs more members on one channel, [contact Ably support](https://ably.com/support). + +## Why it happens + +The channel already held the maximum number of presence members its limit permits, so another member could not enter. The limit counts the members present on a single channel, not across the account. + +## What you'll see + +The error is reported with code 91003 and HTTP status 400. The message is of the form `Unable to enter member to presence channel; maximum number of members exceeded`. diff --git a/src/pages/docs/platform/errors/codes/91005-presence-state-out-of-sync.mdx b/src/pages/docs/platform/errors/codes/91005-presence-state-out-of-sync.mdx index 8a5daf170d..1b9539c4a2 100644 --- a/src/pages/docs/platform/errors/codes/91005-presence-state-out-of-sync.mdx +++ b/src/pages/docs/platform/errors/codes/91005-presence-state-out-of-sync.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/91005.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Wait for the channel to return to the attached state before reading the [presence set](https://ably.com/docs/presence-occupancy/presence), at which point the SDK re-synchronizes it. If you need a result immediately and can accept stale data, read the presence set with `waitForSync` disabled, which returns the last known members rather than the current set. + +## Why it happens + +The presence set was read while the channel was suspended, so it could not be guaranteed current. While the channel is suspended the client's presence set can drift from the state on Ably, until the channel reattaches and re-synchronizes. + +## What you'll see + +The error is reported with code 91005 and HTTP status 400. The message is `Presence state is out of sync due to channel being in the SUSPENDED state`. diff --git a/src/pages/docs/platform/errors/codes/92000-invalid-object-message.mdx b/src/pages/docs/platform/errors/codes/92000-invalid-object-message.mdx index 086f703644..2438d6401f 100644 --- a/src/pages/docs/platform/errors/codes/92000-invalid-object-message.mdx +++ b/src/pages/docs/platform/errors/codes/92000-invalid-object-message.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/92000.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Send a well-formed object operation. This means the fix is in how the operation was built rather than in retrying it. If you construct object operations yourself rather than through the [LiveObjects](https://ably.com/docs/liveobjects) API, check them against what that API produces. + +## Why it happens + +An object message did not conform to the structure Ably expects. Causes include a malformed object identifier, an unrecognized operation or message action, or a missing required field. + +## What you'll see + +The error is reported with code 92000 and HTTP status 400. The message describes what was invalid, for example `invalid object message: object operation required` or `invalid object message: invalid object id: ...`. diff --git a/src/pages/docs/platform/errors/codes/92001-object-limit-exceeded.mdx b/src/pages/docs/platform/errors/codes/92001-object-limit-exceeded.mdx index cfc3a318ae..b419661b4e 100644 --- a/src/pages/docs/platform/errors/codes/92001-object-limit-exceeded.mdx +++ b/src/pages/docs/platform/errors/codes/92001-object-limit-exceeded.mdx @@ -1,6 +1,6 @@ --- title: "92001: LiveObjects limit exceeded" -meta_description: "A LiveObjects operation was rejected because it would take the channel beyond the maximum number of objects it is allowed to hold. The limit is set by the account." +meta_description: "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." identifier: "object_limit_exceeded" redirect_from: - /docs/platform/errors/codes/92001 @@ -8,4 +8,16 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/92001.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} -A LiveObjects operation was rejected because it would take the channel beyond the maximum number of objects it is allowed to hold. The limit is set by the account. +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. + +## What you should do + +Reduce the size of the object being set, or the total size of objects held on the channel. This is a size limit rather than a retryable condition. If a single object is too large, upgrade the account to a package with a higher [maximum message size](https://ably.com/docs/platform/pricing/limits), which is the limit on an individual object. The total object size per channel is the same on every package, so if you need more of that, [contact Ably support](https://ably.com/support) to request a higher limit. + +## Why it happens + +The operation would exceed a size limit set by the account: either the total size of all objects on the channel, or the maximum size of a single object, which cannot be larger than the maximum message size. + +## What you'll see + +The error is reported with code 92001 and HTTP status 400. The message is of the form `channel object total size limit exceeded` or `inband object size exceeds max message size `. diff --git a/src/pages/docs/platform/errors/codes/92002-operation-on-tombstone-object.mdx b/src/pages/docs/platform/errors/codes/92002-operation-on-tombstone-object.mdx index 994bc7b320..3f68555ff7 100644 --- a/src/pages/docs/platform/errors/codes/92002-operation-on-tombstone-object.mdx +++ b/src/pages/docs/platform/errors/codes/92002-operation-on-tombstone-object.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/92002.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Stop applying operations to the deleted object. Once an object is deleted it can no longer be modified, so recreate it, or target a different object, if you still need to make the change. + +## Why it happens + +The operation targeted an object that had already been deleted. Ably retains a deleted object only as a marker so the deletion propagates, but it no longer accepts operations. + +## What you'll see + +The error is reported with code 92002 and HTTP status 400. The message is `unable to submit operation on tombstone object: `. diff --git a/src/pages/docs/platform/errors/codes/92003-object-root-deleted.mdx b/src/pages/docs/platform/errors/codes/92003-object-root-deleted.mdx index c6d38e1a08..e61397d3fd 100644 --- a/src/pages/docs/platform/errors/codes/92003-object-root-deleted.mdx +++ b/src/pages/docs/platform/errors/codes/92003-object-root-deleted.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/92003.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Root the fetch at an object that still exists, or recreate the deleted object first. A deleted object can't be the root of an object tree, so the fetch has to start elsewhere. + +## Why it happens + +The object at the root of the requested tree had been deleted. Ably retains a deleted object only as a marker, so it can no longer serve as the root of a tree. + +## What you'll see + +The error is reported with code 92003 and HTTP status 400. The message is `unable to fetch objects tree for tombstone object: `. diff --git a/src/pages/docs/platform/errors/codes/92004-object-not-found.mdx b/src/pages/docs/platform/errors/codes/92004-object-not-found.mdx index 40693fa05e..e50b94dd4d 100644 --- a/src/pages/docs/platform/errors/codes/92004-object-not-found.mdx +++ b/src/pages/docs/platform/errors/codes/92004-object-not-found.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/92004.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Reference an object that exists on the channel. Check the object identifier, and make sure the object was created and had not been removed before the operation ran. + +## Why it happens + +The operation referenced an object that does not exist on the channel. It may never have been created, or it may have been removed beforehand. + +## What you'll see + +The error is reported with code 92004 and HTTP status 404. The message is `unable to fetch objects tree for not found object: `. diff --git a/src/pages/docs/platform/errors/codes/92005-no-objects-at-path.mdx b/src/pages/docs/platform/errors/codes/92005-no-objects-at-path.mdx index 7584fbb24b..4d2ff31477 100644 --- a/src/pages/docs/platform/errors/codes/92005-no-objects-at-path.mdx +++ b/src/pages/docs/platform/errors/codes/92005-no-objects-at-path.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/92005.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Check the path in the operation. It didn't resolve to any object, so correct the path, or make sure the objects it points to exist before the operation runs. + +## Why it happens + +The path specified in the operation did not resolve to any object in the tree. The path may be wrong, or the objects it refers to may not exist. + +## What you'll see + +The error is reported with code 92005 and HTTP status 400. The message is `no objects matched path: `. diff --git a/src/pages/docs/platform/errors/codes/92006-object-operation-missing-identifier-or-path.mdx b/src/pages/docs/platform/errors/codes/92006-object-operation-missing-identifier-or-path.mdx index c0ef02a092..08150edf5f 100644 --- a/src/pages/docs/platform/errors/codes/92006-object-operation-missing-identifier-or-path.mdx +++ b/src/pages/docs/platform/errors/codes/92006-object-operation-missing-identifier-or-path.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/92006.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} A LiveObjects operation could not be performed because it specified neither an object identifier nor a path. + +## What you should do + +Include an object reference in the operation. Every object operation must identify its target by either an object identifier or a path, so supply one of them. + +## Why it happens + +The operation specified neither an object identifier nor a path, so Ably had no way to determine which object it applied to. + +## What you'll see + +The error is reported with code 92006 and HTTP status 400. The message is `object id or path required`. diff --git a/src/pages/docs/platform/errors/codes/92007-object-operation-path-not-processable.mdx b/src/pages/docs/platform/errors/codes/92007-object-operation-path-not-processable.mdx index 1b875ccdbd..6ed59de789 100644 --- a/src/pages/docs/platform/errors/codes/92007-object-operation-path-not-processable.mdx +++ b/src/pages/docs/platform/errors/codes/92007-object-operation-path-not-processable.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/92007.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} 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. + +## What you should do + +Apply an operation that matches the kind of object at the path. Set and remove keys only on a [LiveMap](https://ably.com/docs/liveobjects), and increment or decrement only a LiveCounter. Check the object's type before operating on it. + +## Why it happens + +The operation is not compatible with the kind of object found at the specified path. Applying a map operation to a counter, or a counter operation to a map, produces this error. + +## What you'll see + +The error is reported with code 92007 and HTTP status 400. The messages include `path not processable: ...`, `Cannot set a key on a non-LiveMap instance`, and `Cannot increment a non-LiveCounter instance`. diff --git a/src/pages/docs/platform/errors/codes/92008-objects-sync-did-not-complete.mdx b/src/pages/docs/platform/errors/codes/92008-objects-sync-did-not-complete.mdx index 8a30a95ca8..52bea4bcd4 100644 --- a/src/pages/docs/platform/errors/codes/92008-objects-sync-did-not-complete.mdx +++ b/src/pages/docs/platform/errors/codes/92008-objects-sync-did-not-complete.mdx @@ -9,3 +9,15 @@ redirect_from: {/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/92008.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} A LiveObjects operation could not be applied because the channel had not finished synchronizing its objects. + +## What you should do + +Retry the operation once the channel has reattached and finished syncing its objects. The failure is local, so if the operation had already been sent to Ably it still takes effect on the server; avoid re-applying one that did, to prevent applying it twice. + +## Why it happens + +The channel entered a detached, suspended, or failed state while the SDK was waiting for its objects to finish synchronizing, so the operation could not be applied to the local object state. + +## What you'll see + +The error is reported with code 92008 and HTTP status 400. The message is of the form `the operation could not be applied locally due to the channel entering the state whilst waiting for objects sync to complete`. diff --git a/src/pages/docs/platform/errors/codes/93002-message-updates-not-enabled.mdx b/src/pages/docs/platform/errors/codes/93002-message-updates-not-enabled.mdx new file mode 100644 index 0000000000..de55c5de3a --- /dev/null +++ b/src/pages/docs/platform/errors/codes/93002-message-updates-not-enabled.mdx @@ -0,0 +1,23 @@ +--- +title: "93002: Message annotations, updates, appends, and deletes not enabled" +meta_description: "An operation could not be performed because the channel did not have the 'Message annotations, updates, appends, and deletes' rule enabled." +identifier: "message_updates_not_enabled" +redirect_from: + - /docs/platform/errors/codes/93002 +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/93002.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +An operation could not be performed because the channel did not have the 'Message annotations, updates, appends, and deletes' rule enabled. + +## What you should do + +Enable the "Message annotations, updates, appends, and deletes" rule for the channel's namespace in your app settings, then retry. This one rule turns on both [message annotations](https://ably.com/docs/messages/annotations) and message [updates, deletes and appends](https://ably.com/docs/messages/updates-deletes), one of which the operation depends on. + +## Why it happens + +The operation uses [message annotations](https://ably.com/docs/messages/annotations) or [updates, deletes and appends](https://ably.com/docs/messages/updates-deletes), but the channel's namespace did not have the "Message annotations, updates, appends, and deletes" rule turned on. + +## What you'll see + +The error is reported with code 93002 and HTTP status 400. The message is of the form `Annotations are only supported on channels with mutable messages enabled in channel namespace settings`. diff --git a/src/pages/docs/platform/errors/codes/93002-mutable-messages-not-enabled.mdx b/src/pages/docs/platform/errors/codes/93002-mutable-messages-not-enabled.mdx deleted file mode 100644 index 23d3b584cb..0000000000 --- a/src/pages/docs/platform/errors/codes/93002-mutable-messages-not-enabled.mdx +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: "93002: Message annotations, updates, appends, and deletes not enabled" -meta_description: "An operation could not be performed because it requires a feature that is enabled by the channel namespace's 'Message annotations, updates, appends, and deletes' setting." -identifier: "mutable_messages_not_enabled" -redirect_from: - - /docs/platform/errors/codes/93002 ---- - -{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/93002.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} - -An operation could not be performed because it requires a feature that is enabled by the channel namespace's 'Message annotations, updates, appends, and deletes' setting.