diff --git a/.circleci/config.yml b/.circleci/config.yml index 6459a6b971..3310e561ef 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -106,6 +106,29 @@ jobs: name: Validate llms.txt command: yarn validate-llms-txt + check-error-docs: + executor: + name: default + steps: + - checkout + - run: + name: Fetch error code registry (ably-common submodule) + command: git submodule update --init ably-common + - run: + name: Regenerate error code pages from the registry + command: node bin/generate-error-pages.ts + - run: + name: Ensure committed error pages match the registry + command: | + CHANGES="$(git status --porcelain src/pages/docs/platform/errors/codes src/pages/docs/platform/errors/codes.mdx)" + if [ -n "$CHANGES" ]; then + echo "❌ Generated error code pages are out of date or were hand-edited:" + echo "$CHANGES" + echo "Run 'yarn generate:errors' and commit the result." + exit 1 + fi + echo "✓ Error code pages are up to date" + test-nginx: docker: - image: heroku/heroku:24-build @@ -174,6 +197,7 @@ workflows: unless: << pipeline.parameters.content-update >> jobs: - install-dependencies + - check-error-docs - security-audit: requires: - install-dependencies diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000..faa17515ab --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "ably-common"] + path = ably-common + url = https://github.com/ably/ably-common.git diff --git a/ably-common b/ably-common new file mode 160000 index 0000000000..fcc793b056 --- /dev/null +++ b/ably-common @@ -0,0 +1 @@ +Subproject commit fcc793b05663d59665377dcdf5276c3a4a08ba89 diff --git a/bin/generate-error-pages.ts b/bin/generate-error-pages.ts new file mode 100644 index 0000000000..0b242dedc3 --- /dev/null +++ b/bin/generate-error-pages.ts @@ -0,0 +1,194 @@ +import fs from 'fs'; +import path from 'path'; + +// Generates the docs pages for Ably error codes from the ably-common registry +// (the pinned `ably-common` git submodule). Each `ably-common/errors/codes/.md` +// becomes a docs page at `/docs/platform/errors/codes/-` (the bare +// `/docs/platform/errors/codes/` redirects to it), plus an index at +// `/docs/platform/errors/codes`. +// +// The generated pages are committed to the repo, so the site build consumes them +// without needing the submodule checked out. Run `yarn generate:errors` after +// bumping the submodule; CI regenerates and fails on any diff, so the committed +// output can't drift from the registry or be hand-edited (see .circleci/config.yml). + +const REGISTRY_DIR = path.resolve('ably-common/errors/codes'); +const DETAIL_OUT_DIR = path.resolve('src/pages/docs/platform/errors/codes'); +const INDEX_OUT = path.resolve('src/pages/docs/platform/errors/codes.mdx'); +const DETAIL_BASE_URL = '/docs/platform/errors/codes'; + +interface ErrorEntry { + code: number; + identifier: string; + title: string; + summary: string; + body: string; +} + +// Mirrors ably-common's `errors/scripts/frontmatter.js`: a `---` fence, then one +// `key: value` per line (split on the first `: ` only, so values may contain +// colons), optional surrounding double quotes, then a closing `---`. We parse it +// the same way rather than with a strict YAML parser, which rejects the colons +// that appear in some summaries. +const parseFrontmatter = (content: string): { fields: Record; body: string } | null => { + if (!content.startsWith('---\n')) { + return null; + } + const rest = content.slice(4); + const end = rest.indexOf('\n---'); + if (end === -1) { + return null; + } + const body = rest.slice(end + 4).replace(/^\n+/, ''); + const fields: Record = {}; + + for (const raw of rest.slice(0, end).split('\n')) { + const line = raw.trimEnd(); + if (line === '') { + continue; + } + const sep = line.indexOf(': '); + const key = sep === -1 ? line.replace(/:$/, '') : line.slice(0, sep); + let value = sep === -1 ? '' : line.slice(sep + 2); + if (value.length >= 2 && value.startsWith('"') && value.endsWith('"')) { + value = value.slice(1, -1).replace(/\\"/g, '"'); + } + fields[key.trim()] = value; + } + + return { fields, body }; +}; + +// Frontmatter values are single-line; a double-quoted YAML scalar with `\` and +// `"` escaped is safe for the titles, summaries, identifiers and URLs we emit. +const yamlQuote = (value: string): string => `"${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`; + +// An MDX comment (`{/* … */}`, not an HTML `` comment, which MDX rejects) +// that renders to nothing. Marks the file as generated so it isn't hand-edited. +const generatedBanner = (source: string): string => + `{/* AUTOGENERATED — DO NOT EDIT. Generated from ${source} by bin/generate-error-pages.ts; run \`yarn generate:errors\` to update. */}`; + +// The URL slug pairs the code with the identifier using hyphens (identifiers are +// snake_case), giving pretty URLs like `…/codes/40142-token-expired`. The bare +// `…/codes/` URL redirects here (see writeDetailPage), so links by code +// alone still resolve. +const pageSlug = (entry: ErrorEntry): string => `${entry.code}-${entry.identifier.replace(/_/g, '-')}`; + +// Table cells are single-line and pipe-delimited: flatten whitespace and escape pipes. +const escapeCell = (value: string): string => + value + .replace(/\s*\n\s*/g, ' ') + .replace(/\|/g, '\\|') + .trim(); + +const readRegistry = (): ErrorEntry[] => { + const entries: ErrorEntry[] = []; + + for (const file of fs.readdirSync(REGISTRY_DIR)) { + if (!file.endsWith('.md')) { + continue; + } + const parsed = parseFrontmatter(fs.readFileSync(path.join(REGISTRY_DIR, file), 'utf8')); + if (!parsed) { + console.warn(`[error-docs] skipping ${file}: could not parse frontmatter`); + continue; + } + const { identifier, title, summary } = parsed.fields; + const code = Number(parsed.fields.code); + + if (!Number.isFinite(code) || !identifier || !title || !summary) { + console.warn(`[error-docs] skipping ${file}: missing required frontmatter (code, identifier, title, summary)`); + continue; + } + entries.push({ code, identifier, title, summary, body: parsed.body.trim() }); + } + + return entries.sort((a, b) => a.code - b.code); +}; + +const writeDetailPage = (entry: ErrorEntry): void => { + const frontmatter = [ + '---', + `title: ${yamlQuote(`${entry.code}: ${entry.title}`)}`, + `meta_description: ${yamlQuote(entry.summary)}`, + `identifier: ${yamlQuote(entry.identifier)}`, + // The canonical URL carries the identifier; redirect the bare-code URL to it + // so links by code alone (inline docs links, error `href`) keep working. + 'redirect_from:', + ` - ${yamlQuote(`${DETAIL_BASE_URL}/${entry.code}`)}`, + '---', + '', + ].join('\n'); + const banner = generatedBanner(`ably-common/errors/codes/${entry.code}.md`); + // The summary is the error's primary description, so it leads the body as + // normal prose (not the muted PageHeader `intro`). Any detail body follows. + const content = [entry.summary, entry.body].filter(Boolean).join('\n\n'); + fs.writeFileSync(path.join(DETAIL_OUT_DIR, `${pageSlug(entry)}.mdx`), `${frontmatter}\n${banner}\n\n${content}\n`); +}; + +const writeIndexPage = (entries: ErrorEntry[]): void => { + const frontmatter = [ + '---', + `title: ${yamlQuote('Error codes')}`, + `meta_description: ${yamlQuote('Understand Ably error codes and their causes, to resolve them efficiently.')}`, + 'redirect_from:', + ` - ${yamlQuote('/docs/errors/codes')}`, + '---', + '', + ].join('\n'); + const intro = + '\nEvery Ably error code, its identifier, and a short description. ' + + 'Select a code for details on what it means, why it happens, and how to resolve it.\n\n'; + // Group codes into a table per thousands bucket (40xxx, 80xxx, …) for easier + // navigation. Each row links to the detail page, shows the identifier beneath + // the code in smaller text, and keeps a numeric anchor so old + // `…/codes#` deep links still resolve. + const groups = new Map(); + for (const e of entries) { + const bucket = Math.floor(e.code / 1000); + const list = groups.get(bucket); + if (list) { + list.push(e); + } else { + groups.set(bucket, [e]); + } + } + + const sections = [...groups.entries()] + .sort(([a], [b]) => a - b) + .map(([bucket, bucketEntries]) => { + const rows = bucketEntries + .map((e) => { + const codeCell = `[${e.code}](${DETAIL_BASE_URL}/${pageSlug(e)})
${e.identifier}`; + return `| ${codeCell} | ${escapeCell(e.title)} | ${escapeCell(e.summary)} |`; + }) + .join('\n'); + return `## ${bucket}xxx\n\n| Code | Title | Summary |\n| --- | --- | --- |\n${rows}\n`; + }) + .join('\n'); + + const banner = generatedBanner('the ably-common errors registry'); + fs.writeFileSync(INDEX_OUT, `${frontmatter}\n${banner}\n${intro}${sections}`); +}; + +const generate = (): void => { + if (!fs.existsSync(REGISTRY_DIR)) { + console.error( + `[error-docs] registry not found at ${REGISTRY_DIR}. Run \`git submodule update --init ably-common\` first.`, + ); + process.exit(1); + } + + // Rebuild the output directory from scratch so codes removed from the registry + // don't leave stale pages behind (a stale deletion then shows up in the CI diff). + fs.rmSync(DETAIL_OUT_DIR, { recursive: true, force: true }); + fs.mkdirSync(DETAIL_OUT_DIR, { recursive: true }); + + const entries = readRegistry(); + entries.forEach(writeDetailPage); + writeIndexPage(entries); + + console.log(`[error-docs] generated ${entries.length} error code pages and the index`); +}; + +generate(); diff --git a/data/onPostBuild/transpileMdxToMarkdown.test.ts b/data/onPostBuild/transpileMdxToMarkdown.test.ts index ab0c34a3fc..e35a6f3009 100644 --- a/data/onPostBuild/transpileMdxToMarkdown.test.ts +++ b/data/onPostBuild/transpileMdxToMarkdown.test.ts @@ -114,6 +114,33 @@ Some content here.`; }); }); + describe('identifier frontmatter (error-code pages)', () => { + it('surfaces the identifier beneath the title for LLM consumption', () => { + const input = `--- +title: "40142: Token expired" +identifier: token_expired +--- + +The token had expired.`; + + const { content } = transformMdxToMarkdown(input, 'https://ably.com'); + + expect(content).toContain('# 40142: Token expired\n\nIdentifier: `token_expired`'); + }); + + it('omits the identifier line when frontmatter has no identifier', () => { + const input = `--- +title: Test Page +--- + +Some content here.`; + + const { content } = transformMdxToMarkdown(input, 'https://ably.com'); + + expect(content).not.toContain('Identifier:'); + }); + }); + describe('removeImportExportStatements', () => { it('should remove single-line imports', () => { const input = `import Foo from 'bar'\n\nContent here`; diff --git a/data/onPostBuild/transpileMdxToMarkdown.ts b/data/onPostBuild/transpileMdxToMarkdown.ts index 6830422369..3b3f3b65e0 100644 --- a/data/onPostBuild/transpileMdxToMarkdown.ts +++ b/data/onPostBuild/transpileMdxToMarkdown.ts @@ -135,6 +135,7 @@ interface MdxQueryResult { interface FrontMatterAttributes { title?: string; + identifier?: string; [key: string]: any; } @@ -572,6 +573,7 @@ function transformMdxToMarkdown( const title = parsed.attributes.title; const intro = parsed.attributes.intro; + const identifier = parsed.attributes.identifier; let content = parsed.body; // Stage 2: Remove import/export statements @@ -616,8 +618,11 @@ function transformMdxToMarkdown( // Stage 15: Add language subheadings to code blocks within tags content = addLanguageSubheadingsToCodeBlocks(content); - // Stage 16: Prepend title as markdown heading - let finalContent = `# ${title}\n\n${intro ? `${intro}\n\n` : ''}${content}`; + // Stage 16: Prepend title as markdown heading. Error-code pages carry a stable + // `identifier`; surface it beneath the title for LLM consumption (the `.md` + // otherwise loses it, since it is rendered from frontmatter on the HTML page). + const identifierBlock = identifier ? `Identifier: \`${identifier}\`\n\n` : ''; + let finalContent = `# ${title}\n\n${identifierBlock}${intro ? `${intro}\n\n` : ''}${content}`; // Stage 17: Append navigation footer (after all transformations to avoid double-processing) if (navContext) { diff --git a/package.json b/package.json index c08eed1baa..12b53f1891 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,8 @@ "lint-staged": "lint-staged", "repo-githooks": "git config core.hooksPath .githooks", "no-githooks": "git config --unset core.hooksPath", - "validate-llms-txt": "node bin/validate-llms.txt.ts" + "validate-llms-txt": "node bin/validate-llms.txt.ts", + "generate:errors": "node bin/generate-error-pages.ts" }, "dependencies": { "@ably/ui": "18.3.1", diff --git a/src/components/Layout/Footer.tsx b/src/components/Layout/Footer.tsx index 530a6df72c..35becf0760 100644 --- a/src/components/Layout/Footer.tsx +++ b/src/components/Layout/Footer.tsx @@ -171,6 +171,17 @@ const Footer: React.FC<{ pageContext: PageContextType }> = ({ pageContext }) => let path = '#'; const pathName = location.pathname.replace('docs/', ''); + // Error-code pages are generated from the ably-common registry, not authored + // in this repo. Point edits at the source file there; hide the link for the + // generated aggregate index (no single source file). + const errorCodeMatch = pathName.match(/^\/platform\/errors\/codes\/(\d+)\/?$/); + if (errorCodeMatch) { + return `https://github.com/ably/ably-common/blob/main/errors/codes/${errorCodeMatch[1]}.md`; + } + if (pathName === '/platform/errors/codes' || pathName === '/platform/errors/codes/') { + return null; + } + if (customGithubPaths[pathName]) { path = customGithubPaths[pathName]; } else if (activePage.template === 'mdx') { diff --git a/src/components/Layout/Layout.tsx b/src/components/Layout/Layout.tsx index 4917689a22..6300ee71c5 100644 --- a/src/components/Layout/Layout.tsx +++ b/src/components/Layout/Layout.tsx @@ -25,6 +25,9 @@ export type Frontmatter = { last_updated?: string; intro?: string; json_ld?: Record; + // Error-code pages (generated from the ably-common registry) carry the stable + // snake_case identifier, rendered as a soft sub-title beneath the title. + identifier?: string; }; export type PageContextType = { diff --git a/src/components/Layout/MDXWrapper.tsx b/src/components/Layout/MDXWrapper.tsx index 72bd5a5c6b..c2c613fc48 100644 --- a/src/components/Layout/MDXWrapper.tsx +++ b/src/components/Layout/MDXWrapper.tsx @@ -235,6 +235,9 @@ const MDXWrapper: React.FC = ({ children, pageContext, location const description = getFrontmatter(frontmatter, 'meta_description', META_DESCRIPTION_FALLBACK) as string; const intro = getFrontmatter(frontmatter, 'intro') as string; const keywords = getFrontmatter(frontmatter, 'meta_keywords') as string; + // Error-code pages carry a stable snake_case identifier, shown as a soft + // sub-title beneath the title. + const identifier = getFrontmatter(frontmatter, 'identifier') as string; const metaTitle = getMetaTitle(title, (activePage.product as ProductName) || META_PRODUCT_FALLBACK) as string; const { canonicalUrl } = useSiteMetadata(); @@ -362,7 +365,7 @@ const MDXWrapper: React.FC = ({ children, pageContext, location RequiredBadge, }} > - + {identifier} : undefined} /> {children} diff --git a/src/components/Layout/mdx/PageHeader.tsx b/src/components/Layout/mdx/PageHeader.tsx index 4099f60b7f..4268b75f3c 100644 --- a/src/components/Layout/mdx/PageHeader.tsx +++ b/src/components/Layout/mdx/PageHeader.tsx @@ -4,12 +4,16 @@ import cn from 'src/utilities/cn'; type PageHeaderProps = { title: string; intro: string; + subtitle?: React.ReactNode; }; -export const PageHeader: React.FC = ({ title, intro }) => { +export const PageHeader: React.FC = ({ title, intro, subtitle }) => { return (
-

{title}

+

{title}

+ {subtitle && ( +
{subtitle}
+ )} {intro && (

{intro} diff --git a/src/contexts/layout-context.tsx b/src/contexts/layout-context.tsx index 8107314649..e9a22fd340 100644 --- a/src/contexts/layout-context.tsx +++ b/src/contexts/layout-context.tsx @@ -97,7 +97,14 @@ export const LayoutProvider: React.FC { - const activePageData = determineActivePage(productData, location.pathname); + const activePageData = + determineActivePage(productData, location.pathname) ?? + // Error-code detail pages (/docs/platform/errors/codes/) are generated + // from the ably-common registry and not individually in the nav; resolve them + // to the Error codes index so they inherit the Platform sidebar. + (/^\/docs\/platform\/errors\/codes\/[^/]+\/?$/.test(location.pathname) + ? determineActivePage(productData, '/docs/platform/errors/codes') + : null); let languages: LanguageKey[] = []; if (activePageData?.page.languages) { diff --git a/src/pages/docs/api/realtime-sdk/types.mdx b/src/pages/docs/api/realtime-sdk/types.mdx index 9bbbe544b8..ff02153053 100644 --- a/src/pages/docs/api/realtime-sdk/types.mdx +++ b/src/pages/docs/api/realtime-sdk/types.mdx @@ -197,7 +197,7 @@ An `ErrorInfo` is a type encapsulating error information containing an Ably-spec ErrorInfo objects can contain nested errors through the `cause` property, allowing you to trace the root cause of failures. When an operation fails due to underlying system errors, the main `ErrorInfo` provides the high-level failure reason while the nested `cause` contains more specific details about what went wrong. -One example of ErrorInfo nesting is [80019: Auth server rejecting request](/docs/platform/errors/codes#80019) where the main error indicates token renewal failed, while the nested `cause` contains the specific HTTP error from the auth server. +One example of ErrorInfo nesting is [80019: Auth server rejecting request](/docs/platform/errors/codes/80019) where the main error indicates token renewal failed, while the nested `cause` contains the specific HTTP error from the auth server. The following example demonstrates how to handle nested errors: diff --git a/src/pages/docs/api/rest-sdk/types.mdx b/src/pages/docs/api/rest-sdk/types.mdx index a1d56414d2..a1a4997197 100644 --- a/src/pages/docs/api/rest-sdk/types.mdx +++ b/src/pages/docs/api/rest-sdk/types.mdx @@ -149,7 +149,7 @@ An `ErrorInfo` is a type encapsulating error information containing an Ably-spec ErrorInfo objects can contain nested errors through the `cause` property, allowing you to trace the root cause of failures. When an operation fails due to underlying system errors, the main `ErrorInfo` provides the high-level failure reason while the nested `cause` contains more specific details about what went wrong. -One example of ErrorInfo nesting is [80019: Auth server rejecting request](/docs/platform/errors/codes#80019) where the main error indicates token renewal failed, while the nested `cause` contains the specific HTTP error from the auth server. +One example of ErrorInfo nesting is [80019: Auth server rejecting request](/docs/platform/errors/codes/80019) where the main error indicates token renewal failed, while the nested `cause` contains the specific HTTP error from the auth server. The following example demonstrates how to handle nested errors: diff --git a/src/pages/docs/auth/token/index.mdx b/src/pages/docs/auth/token/index.mdx index cc6b68251f..24053b8202 100644 --- a/src/pages/docs/auth/token/index.mdx +++ b/src/pages/docs/auth/token/index.mdx @@ -65,7 +65,7 @@ Ably enforces maximum TTL (time-to-live) limits: - Revocable tokens: Maximum TTL of 1 hour. A token is revocable if [token revocation](/docs/auth/revocation) has been enabled for the API key used to issue it.

## Dynamic channel access control
@@ -81,7 +81,7 @@ When you call `client.auth.authorize()`: ### Use cases You can trigger re-authentication in response to: -- Detect error code [40160](/docs/platform/errors/codes#40160) when a client attempts to attach to a channel. +- Detect error code [40160](/docs/platform/errors/codes/40160) when a client attempts to attach to a channel. - Instruct clients to re-authenticate via Ably channels or other communication methods. The following example shows how to re-authenticate with updated capabilities: diff --git a/src/pages/docs/connect/states.mdx b/src/pages/docs/connect/states.mdx index 3ab67b1290..b019f7c1ed 100644 --- a/src/pages/docs/connect/states.mdx +++ b/src/pages/docs/connect/states.mdx @@ -30,11 +30,11 @@ The different connection states are: | `initialized` | A `Connection` object has been initialized but not yet connected. | | `connecting` | A connection attempt has been initiated, this state is entered as soon as an SDK has completed initialization, and is re-entered each time connection is re-attempted following disconnection. | | `connected` | A connection exists and is active. | -| `disconnected` | A temporary failure condition when no current connection exists. The disconnected state is entered if an established connection is dropped, or if a connection attempt is unsuccessful. In the disconnected state an SDK will periodically attempt to open a new connection (approximately every 15 seconds), anticipating the connection will be re-established soon and connection and channel continuity will be possible. In this state, developers can continue to publish messages as they are automatically placed in a local queue, sent when connection is re-established. Messages published by other clients whilst this client is disconnected will be delivered to it when reconnected if the connection was resumed within two minutes. After two minutes have elapsed, recovery is no longer possible and the connection will move to the `suspended` state. Publishing: Attempting to publish while disconnected will return error code [80003](/docs/platform/errors/codes#80003). | -| `suspended` | A long term failure condition when no current connection exists because there is no network connectivity or available host. The suspended state is entered after a failed connection attempt if there has then been no connection for a period of two minutes. In the suspended state, an SDK will periodically attempt to open a new connection every 30 seconds. Developers are unable to publish messages in this state. A new connection attempt can also be triggered by an explicit call to [`connect()`](/docs/api/realtime-sdk/connection#connect) on the `Connection` object. Once the connection has been re-established, channels will be automatically re-attached. The client has been disconnected for too long for them to resume from where they left off, so if it wants to catch up on messages published by other clients while it was disconnected, it needs to use the [history API](/docs/storage-history/history). Publishing: Attempting to publish while suspended will return error code [80002](/docs/platform/errors/codes#80002). | +| `disconnected` | A temporary failure condition when no current connection exists. The disconnected state is entered if an established connection is dropped, or if a connection attempt is unsuccessful. In the disconnected state an SDK will periodically attempt to open a new connection (approximately every 15 seconds), anticipating the connection will be re-established soon and connection and channel continuity will be possible. In this state, developers can continue to publish messages as they are automatically placed in a local queue, sent when connection is re-established. Messages published by other clients whilst this client is disconnected will be delivered to it when reconnected if the connection was resumed within two minutes. After two minutes have elapsed, recovery is no longer possible and the connection will move to the `suspended` state. Publishing: Attempting to publish while disconnected will return error code [80003](/docs/platform/errors/codes/80003). | +| `suspended` | A long term failure condition when no current connection exists because there is no network connectivity or available host. The suspended state is entered after a failed connection attempt if there has then been no connection for a period of two minutes. In the suspended state, an SDK will periodically attempt to open a new connection every 30 seconds. Developers are unable to publish messages in this state. A new connection attempt can also be triggered by an explicit call to [`connect()`](/docs/api/realtime-sdk/connection#connect) on the `Connection` object. Once the connection has been re-established, channels will be automatically re-attached. The client has been disconnected for too long for them to resume from where they left off, so if it wants to catch up on messages published by other clients while it was disconnected, it needs to use the [history API](/docs/storage-history/history). Publishing: Attempting to publish while suspended will return error code [80002](/docs/platform/errors/codes/80002). | | `closing` | An explicit request by the developer to close the connection has been sent to the Ably service. If a reply is not received from Ably shortly, the connection will be forcibly terminated and the connection state will become `closed`. | | `closed` | The connection has been explicitly closed by the client. In the closed state, no reconnection attempts are made automatically by an SDK, and clients may not publish messages. No connection state is preserved by the service or by an SDK. A new connection attempt can be triggered by an explicit call to [`connect()`](/docs/api/realtime-sdk/connection#connect) on the `Connection` object, which will result in a new connection. | -| `failed` | This state is entered if an SDK encounters a failure condition that it cannot recover from. This may be a fatal connection error received from the Ably service (e.g. an attempt to connect with an incorrect API key), or some local terminal error (e.g. the token in use has expired and the SDK does not have any way to renew it). In the failed state, no reconnection attempts are made automatically by an SDK, and clients may not publish messages. A new connection attempt can be triggered by an explicit call to [`connect()`](/docs/api/realtime-sdk/connection#connect) on the `Connection` object. Publishing: Attempting to publish while failed will return error code [80000](/docs/platform/errors/codes#80000). | +| `failed` | This state is entered if an SDK encounters a failure condition that it cannot recover from. This may be a fatal connection error received from the Ably service (e.g. an attempt to connect with an incorrect API key), or some local terminal error (e.g. the token in use has expired and the SDK does not have any way to renew it). In the failed state, no reconnection attempts are made automatically by an SDK, and clients may not publish messages. A new connection attempt can be triggered by an explicit call to [`connect()`](/docs/api/realtime-sdk/connection#connect) on the `Connection` object. Publishing: Attempting to publish while failed will return error code [80000](/docs/platform/errors/codes/80000). | ### Example connection state sequences diff --git a/src/pages/docs/faq/index.mdx b/src/pages/docs/faq/index.mdx index 7b5dd5cd7b..a44fa1b9a7 100644 --- a/src/pages/docs/faq/index.mdx +++ b/src/pages/docs/faq/index.mdx @@ -242,7 +242,7 @@ channel.on(new ChannelStateListener() { A non-2xx status code on an HTTP request is not a reliable error indicator. Many factors, such as imperfect network connections, can cause HTTP errors, and only a small fraction represent actual problems. -For example, when using Comet, if a token expires and cannot reauthenticate online in time, the recv stream closes with a 401 status code and an `errorinfo` body with code [40142](/docs/platform/errors/codes#40142). This is expected behavior: it simply triggers the library to obtain a new token and resume the connection. Conversely, many actual problems (errors sent as protocol messages over a `WebSocket`) do not appear as non-2xx HTTP requests. +For example, when using Comet, if a token expires and cannot reauthenticate online in time, the recv stream closes with a 401 status code and an `errorinfo` body with code [40142](/docs/platform/errors/codes/40142). This is expected behavior: it simply triggers the library to obtain a new token and resume the connection. Conversely, many actual problems (errors sent as protocol messages over a `WebSocket`) do not appear as non-2xx HTTP requests. The protocol uses the most semantically appropriate status code for each response (like 401 for an expired token) rather than avoiding non-2xx responses. diff --git a/src/pages/docs/platform/errors/codes.mdx b/src/pages/docs/platform/errors/codes.mdx index 558f6e095c..b1051c5bd7 100644 --- a/src/pages/docs/platform/errors/codes.mdx +++ b/src/pages/docs/platform/errors/codes.mdx @@ -1,825 +1,349 @@ --- -title: Error codes +title: "Error codes" meta_description: "Understand Ably error codes and their causes, to resolve them efficiently." redirect_from: - - /docs/errors/codes + - "/docs/errors/codes" --- -Use the error codes provided, which include descriptions, possible causes, and solutions, to troubleshoot issues effectively. - - - -## 500: Internal error - -This error occurs when there is an issue within Ably's system. - -## 50000: Internal error - -This error occurs when there is an issue within Ably's system. - -## 10000: No error - -This error code indicates that the attempted action was successful and no issues occurred; there will be additional info in the `message` property about the successful action. - -## 20000: General error code - -This error code is a generic response used when the Ably [protocol](/docs/protocols) requires an `errorInfo` object, even though no actual issue has occurred. The message property may contain additional details about the successful action. - -## 40000: Bad request - -This error occurs when Ably cannot understand the request due to a malformed structure or other issues with the request format. - -An example of this error is when a message is published while the connection is in a [suspended state](/docs/connect/states#connection-states). - -## 40001: Invalid request body - -This error occurs when a request contains invalid content, such as incorrect [data types](/docs/api/realtime-sdk/types#data-types) or missing required objects. It is most likely caused by missing required fields or incorrect data formats when sending a request to Ably. - -An example of this error is a missing field, such as a `keyName` in a [token request](/docs/api/token-request-spec#tokenrequest-format). - -## 40003: Invalid parameter value - -This error occurs when an invalid value is sent in the request. It may be caused by either user input or the SDK sending incorrect parameters. - -Additional examples of the `40003` error code output include: - -* **40003: Excessive value for TTL** -This error occurs when the [TTL](/docs/api/rest-sdk/authentication#token-request) set for a token parameter exceeds the maximum allowed value of 24 hours. -* **40003: Excessive value for TTL (revocation is enabled on this key)** -This error occurs when [revocation](/docs/auth/revocation#revocable-tokens) is enabled, revocable tokens are limited to a TTL of 1 hour instead of 24 hours. - -## 40005: Invalid credentials - -This error occurs when the [API key](/docs/auth#api-keys) or [token](/docs/auth/token) used to initialize the library is invalid. -Resolution: The following steps can help resolve this issue: - -* API key initialization: -** Ensure you are the account's **admin** or **owner**. -** In your [Ably dashboard](https://ably.com/accounts/any/apps/any/) to the **API keys** tab. -** Use one of these API keys instead of your current one or create a new API key with the necessary permissions and privileges and use that to instance the SDK. -* Token initialization: -** If you are using [token authentication](/docs/auth/token), ensure you are correctly requesting a valid token before using it with Ably. - -## 40006: Invalid connectionId - -This error occurs when a message is published with an invalid or mismatched [`connectionId`](/docs/messages#properties). - -Examples of this error are when: -* A client attempts to publish a message using a malformed `connectionId`. -* A client publishes a realtime message with a `connectionId` that does not match the currently active connection. -* A connection is identified, but the resolved `clientId` is missing or incorrect (due to authentication issues or an explicitly provided, but incorrect, `clientId`). - -## 40009: Maximum message length exceeded - -This error occurs when the message being published exceeds the maximum size allowed set by the [limits](/docs/platform/pricing/limits#account) for your current [package](/docs/platform/pricing#packages). - -## 40010: Invalid channel name - -This error occurs when a [channel name](/docs/channels#use) does not meet the required format or contains invalid characters. - -## 40011: Stale ring state - -This error occurs when using the channel [enumeration](/docs/api/rest-api#enumeration-rest) API and the state of the cluster changes between successive calls, causing a pagination sequence to become invalid. Note: This issue does not occur if the enumeration request is fully satisfied within the first response page. - -## 40012: Invalid `clientId` - -This error occurs when a `clientId` is invalid due to disallowed characters or a mismatch between the `clientId` specified in the request and the one assigned in the authentication [token](/docs/auth/token). - -Examples of this error are when: - -* The client attempts to use `*` as a `clientId`, which is not allowed because `*` is used as a [wildcard](/docs/auth/capabilities#wildcards) in capability expressions. -* A client tries to assume an ID of `foo` for an operation, but the token they are using specifies an ID of `bar`. - -## 40013: Invalid message data or encoding - -This error occurs when the SDK is unable to encode the [message payload](/docs/messages) due to an unsupported data type. - -An example of this error is when a client attempts to publish a payload that includes something that isn't serializable by an Ably SDK. - -Resolution: Try marshalling the payload as JSON or MsgPack before publishing. - -## 40015: Invalid deviceId - -This error occurs when the ID property in a [DeviceDetails](/docs/api/rest-sdk/push-admin#device-details) object, sent during a push notification registration request, is invalid. The ID must be a string. - -## 40016: Invalid message name - -This error occurs when the `name` [property](/docs/messages#properties) of a message is not a string. The `name` field is used to categorize messages within channels, and it must always be a string. - -## 40017: Unsupported protocol version or Invalid API version specified - -This error occurs when a request does not specify a protocol version or provides an invalid version in the request parameters of a [Server-Sent Events (SSE)](/docs/protocols/sse) request. This error also occurs when a WebSocket connection to Ably specifies an invalid API version in the request parameters. - -**Resolution**: Ensure that the request specifies a valid protocol version. Note: You will not see this error when using an Ably SDK, as SDKs automatically use valid versions. - -## 40020: Partial failure in batch operation requests - -This error occurs when a [batch](/docs/api/rest-api#batch) request partially fails, meaning that some operations succeed while others fail. - -This error can occur for the following endpoints: - -* Revoking tokens: [`POST/revokeTokens`](/docs/api/rest-api#revoke-tokens) -* Publishing messages: [`POST/messages`](/docs/api/rest-api#batch-publish) -* Retrieving presence data: [`GET/presence`](/docs/api/rest-api#batch-presence) - -The following example is a batch operation response that includes partial failures. The `error` field indicates that some requests within the batch were unsuccessful, while the `batchResponse` contains individual results for each operation: - - -```json -{ - "error": "new ErrorInfo('Batched response includes errors', 40020, 400)", - "batchResponse": "results" -} -``` - - -## 40022: Invalid resource - -This error occurs when the requested resource is invalid or already exists. It is typically returned by requests to the [Control API](/docs/platform/account/control-api). - -Examples of this error include attempting to create a resource that already exists or providing an invalid resource name. - -Resolution: The following steps can help resolve this issue: -* Ensure that an app with the requested name does not already exist in your account. If it does, use a different name. -* Verify that the [capabilities](/docs/auth/capabilities#capability-operations) listed in the request are valid when creating an API key. - -## 40023: Action requires a newer protocol version - -This error occurs when the requested operation is only available in a newer version of the Ably protocol than the one specified in the request. This can happen if the client is using an older version of the Ably SDK that does not support the requested operation. - -Examples of this error include attempting to use [channel objects](/docs/liveobjects) or message annotations, updates, deletes, and appends from an Ably SDK that does not support protocol version 2. - -Resolution: The following steps can help resolve this issue: -* Upgrade the Ably SDK to a version that supports the requested operation. - -## 40030: Invalid publish request (unspecified) - -This error occurs when a [publish request](/docs/pub-sub#publish) is malformed. - -## 40032: Invalid publish request (impermissible extras field) - -This error occurs when a published message contains arbitrary fields in the [`extras`](/docs/api/realtime-sdk/messages#extras) payload that are not allowed by the Ably service. The `extras` field is reserved for specific objects related to Ably. - -Resolution: Place any additional data inside the `headers` field within `extras`. The `headers` field must be a flat object (`map` or equivalent) with no nested structures. If using unenveloped Reactor rules, ensure that header names are in `ASCII`, as they will be converted into HTTP, AMQP, or other protocol headers. - -The following example is a valid `extras` object: - - -```javascript -const extras = { - headers: { - header1: 'value1', - header2: 'value2' - } -}; -``` - - -## 40100: Unauthorized - -This error occurs when an action cannot be performed due to a lack of [authentication](/docs/auth). There will be additional info in the `message` property about the reason the action could not be performed. - -## 40101: Invalid credentials - -This error occurs when [authentication](/docs/auth) credentials are invalid. The specific error message may provide further details about the cause. - -An example of this error is when a signed token request is invalid due to a mismatched cryptographic signature (MAC does not match) or when the `clientId` specified in the Ably SDK does not match the `clientId` in the access token. - -Resolution: Review your authentication setup and token request implementation. Ensure the following: - -* The cryptographic signature (MAC) is correct - If a signed token request is invalid, Ably will reject it. -* The API key used to generate the token request is accurate - Double-check for missing or extra characters. -* The token request JSON is correctly formatted and unaltered, including: -** `keyName`: Must match the API key used in the request. -** `clientId`: If provided, it must match the one in the client constructor. -** `ttl`: Must be an integer in milliseconds. -** `timestamp`: Must be an integer in milliseconds. -** `capability`: Must be stringified JSON, not raw JSON. -** `nonce`: Must be a randomly generated string value. -** `mac`: Must be correctly generated using the secret key. -* The `clientId` in the SDK matches the one in the token. If a `clientId` is provided in the token, it must align with the `clientId` set in the Ably client options. -* A `clientId` cannot be changed on an existing connection. Ensure consistency in authentication. -* For JWT authentication, confirm that `clientId` is correctly set in `x-ably-clientId`. - -## 40102: Incompatible credentials - -This error occurs when [authentication](/docs/auth) credentials do not match the existing connection, causing the connection to enter the [failed state](/docs/connect/states). - -Examples of this error include: - -* Attempting to authenticate with an API key from a different app than the one used for the original connection -* Resuming a connection using credentials tied to a different app -* Calling `auth.authorize` with an API key that differs from the one originally used to establish the connection - -## 40103: Invalid use of Basic auth over non-TLS transport - -This error occurs when an API key is used over a non-TLS (unencrypted) connection, which is not permitted due to security risks. API keys are long-lived credentials, making them more vulnerable if exposed. Unlike short-lived tokens, API keys remain valid indefinitely, meaning a compromised key presents a significant security risk. - -Non-TLS transports can be inspected by network devices routing traffic between the client and Ably. Ably does not allow API key authentication over non-TLS connections. However, Ably supports [basic authentication](/docs/auth/basic) over TLS and [token authentication](/docs/auth/token) over non-TLS connections. - -Resolution: Select the appropriate [authentication mechanism](/docs/auth#selecting-auth) for your use case. - -## 40104: Timestamp not current - -This error occurs when a signed token request sent to Ably is too old. Ably enforces timestamp validation to ensure [`TokenRequest`](/docs/auth/token/ably-tokens#token-request) remain valid for a limited time, reducing the risk of interception and misuse. - -Resolutions: The following steps can help resolve this issue: -* Ensure that the authentication servers clock is accurate when generating signed token requests. -* If time synchronization is unreliable, set the `queryTime` [ClientOptions](/docs/api/rest-sdk/types#client-options) object to true when initializing the Ably client. This ensures Ably's server time is used. -* Do not cache signed token requests on the authentication server or client. Each token request must be freshly generated and used immediately. -* If using Next.js 13, prevent caching issues by setting revalidate to 0 or changing the request method from `GET` to `POST` using the `authMethod` [ClientOption](/docs/api/rest-sdk/types#client-options). - -## 40105: Nonce value replayed - -This error occurs when a signed [token request](/docs/api/realtime-sdk/types#token-request) has been used more than once. Ably enforces nonce (number used once) checks to ensure that each signed token request is unique, as a security measure. - -Examples of this error include: -* A client sends a signed token request to Ably but does not receive the response due to network issues. If the client automatically retries the HTTP request in a fallback data center, Ably detects the duplicate nonce and rejects it. -* An authentication server caches and reuses signed token requests instead of generating a unique one for each request. -* A misconfigured [`authCallback`](/docs/auth/token/jwt#auth-callback) function reuses the same token request on every invocation instead of generating a fresh one. -* The `tokenRequest` is not renewed. A new token request should be requested from your server at this point: - - -```javascript -var tokenRequest = ""; -var ably = new Ably.Realtime({ - authCallback: function(tokenParams, callback) { - // This is a mistake. The tokenRequest is not renewed. - A new token request should be requested from your server at this point */ - callback(null, tokenRequest); - } -}); -``` - - -Resolution: The following steps can help resolve this issue: -* Ensure that each token request is unique and never cached by the authentication server or client. -* Always generate a new token request each time authCallback is invoked. -* If retrieving a token request over HTTP, prevent caching by using the Cache-Control header (no-cache, no-store, must-revalidate) or by adding a cache-busting query string parameter, where the number is regenerated for every request, for example, `?rnd=73849275`. -* If network issues are suspected, check logs and debug the token request process to confirm proper request handling. - -## 40106: Unable to obtain credentials from given parameters - -This error occurs when invalid [authentication](/docs/auth) options (key or token) are provided to the Ably SDK, preventing successful authentication. - -An example of this error is when no [API key](/docs/auth#api-keys) or [token](/docs/auth/token) is supplied, or when an authentication request is made using a token to request another token, instead of an API key. - -## 40111: Connection limits exceeded - -This error occurs when the peak [connection limit](/docs/platform/pricing/limits#connection) for your account has been exceeded, preventing new connections from being established until existing ones disconnect. - -## 40112: Account blocked (message limits exceeded) - -This error occurs when your account has exceeded the allocated [message limit](/docs/platform/pricing/limits#message) based on your [package](/docs/platform/pricing#packages). Once this limit is reached, further message publishing is blocked. - -## 40114: Account-wide peak channel limit exceeded - -This error occurs when your account has exceeded the concurrent [channel limit](/docs/platform/pricing/limits#channel), preventing additional channels from being created. - -Examples of this error are when the application attempts to open more channels than the account allows, causing new channel creation to be blocked. Also, during development, an implementation error or bug causes unintended channel creation, leading to the limit being reached. - -Resolution: Detach unused channels to free up space for new ones. - -## 40115: Account restricted (request limit exceeded) - -This error occurs when your account has exceeded the allocated [limits](/docs/platform/pricing/limits) based on your [package](/docs/platform/pricing#packages). - -## 40125: Maximum number of rules per application exceeded - -This error occurs when the application has reached the maximum number of [integration rules](/docs/platform/integrations) set by the [limits](/docs/platform/pricing/limits#account) for your current package. - -## 40127: Maximum number of keys per application exceeded - -This error occurs when the application has reached the maximum number of API keys set by the [limits](/docs/platform/pricing/limits#account) for your current package. - -## 40131: Key revoked - -This error occurs when the [Ably API key](/docs/auth#api-keys) used to initialize the SDK is no longer valid because it has been [revoked](/docs/auth/revocation) by an admin of the application. - -Resolution: The following steps can help resolve this issue: -* If you are an admin, go to the [API keys tab](https://ably.com/accounts/any/apps/any/app_keys) in the Ably dashboard to check for valid keys. Use an existing valid key or create a new one with the necessary permissions. -* If you are not an admin, request a new API key from an administrator or obtain a token request generated with a valid key. - -## 40133: Wrong key; cannot revoke tokens with a different key than the one that issued them - -This error occurs when the [Ably API key](/docs/auth#api-keys) used to authorize a token [revocation](/docs/auth/revocation) request does not match the key that originally issued the token. - -Resolution: The following steps can help resolve this issue: -* Ensure that the public API key ID used in the request matches the key that originally issued the token. -* Verify that the `keyname` in the request path corresponds with the API key used for authentication. - -## 40141: Token revoked - -This error occurs when attempting to authenticate with a [token](/docs/auth/token) that has been [revoked](/docs/auth/revocation) and is no longer valid. - -Resolution: Ensure that you are using a valid, [non-revoked](/docs/auth/revocation). token for authentication. If needed, generate a new token and use it for authorization. - -## 40142: Token expired - -This error occurs when the authentication [token](/docs/auth/token/jwt#refresh) has expired and is no longer valid for use. - -An example of this error is when a client attempts to authenticate with a token that has exceeded its time-to-live (TTL). - -Resolution: The following steps can help resolve this issue: -* Use [`authUrl`](/docs/auth/token/jwt#auth-url) or [`authCallback`](/docs/auth/token/jwt#auth-callback) in your client configuration to enable automatic token renewal. -* If `authUrl` or `authCallback` is correctly configured, the client SDK will automatically renew the token when needed, so you may see this error temporarily before renewal occurs. - -## 40143: Token unrecognized - -This error occurs when the provided token is not recognized as a valid Ably [token](/docs/auth/token/ably-tokens), Ably [JWT](/docs/auth/token/jwt), or a JWT containing a valid Ably token. - -An example of this error is when a JWT is incorrectly formatted or when an Ably token does not follow the expected structure, for example: `.`. Any token that does not adhere to the correct format will not be recognized. - -Resolution: Validate the token format before using it for authentication. If creating a [JWT](/docs/auth/token/jwt), use a standard JWT library to ensure correct generation. If using an Ably token, verify that it matches the expected format as returned from the [`requestToken`](/docs/api/token-request-spec#examples) endpoint. - -## 40144: Unexpected error decoding JWT; decode exception - -This error occurs when the [JWT](/docs/auth/token/jwt). provided for authentication cannot be validated by Ably due to incorrect formatting, missing claims, or unsupported configurations. - -This error occurs when the [JWT](/docs/auth/token/jwt) provided for authentication cannot be validated by Ably. The specific reason for the failure will be available in the reason property of a [`ConnectionStateChange`](/docs/api/realtime-sdk/types#connection-state-change) object or in an error response from a REST request. - -Examples of this error include: -* Missing or invalid payload claims, such as iat (issued at) or exp (expiration). -* Using a deprecated or unsupported signing algorithm. -* Providing an empty string for `x-ably-capability`. -* Using an empty string or non-string value for [`x-ably-revocation-key`](/docs/auth/revocation#revocation-key). -* Missing kid (Key ID) when using [JWT authentication with an API key](/docs/api/realtime-sdk/authentication#ably-jwt). - -## 40160: Action not permitted - -This error occurs when the client does not have permission to perform the requested action. - -An example of this error is when a token request includes an empty [capability object](/docs/auth/capabilities#capabilities-token), for example: `({})`, meaning the client has no assigned permissions, or when the requested [resource](/docs/auth/capabilities#wildcards) does not match the API key's allowed capabilities. - -Resolution: Ensure the [API key](/docs/auth#api-keys) supports the required [capabilities](/docs/auth/capabilities#capabilities-key) for the requested action. - -## 40161: Access denied to channel: namespace requires identified clients - -This error occurs when a [non-identified client](/docs/auth/identified-clients) attempts to access a channel that requires an identified client. Each application's channel namespaces configuration can be found in its application settings. By default, the identified namespace requires a client to be identified. - -## 40170: Error from client token callback - -This error occurs when an authentication attempt using [`authUrl`](/docs/auth/token/jwt#auth-url) or [`authCallback`](/docs/auth/token/jwt#auth-callback) fails due to a timeout, network issue, invalid token format, or another authentication error condition. - -Examples of this error include when a `TokenRequest` callback times out after the default 10-second limit. Also, when he `authUrl` response is missing a Content-Type header has an unsupported Content-Type. - -Resolution: The following steps can help resolve this issue: -* Check for network latency between the client and the authentication server. -* Ensure the authentication server returns a valid Content-Type header and one of the supported content types: -** `application/json` -** `text/plain` -** `application/jwt` -* Additional error details can be found in the `error.message` field. - -## 40171: No means provided to renew auth token - -This error occurs when no [`authUrl`](/docs/auth/token/jwt#auth-url) or [`authCallback`](/docs/auth/token/jwt#auth-callback) is provided in [`clientOptions`](/docs/getting-started#options) when initializing the Ably REST or Realtime SDK. - -Tokens have a set expiration time, and once expired, they are no longer valid for communication with Ably. If `authUrl` or `authCallback` is configured, the SDK will automatically request a new token before expiration, ensuring uninterrupted operation. - -Resolution: Ensure that `authUrl` or `authCallback` is set in your client configuration. This allows the SDK to automatically request a new token before the current one expires. - -## 40300: Forbidden - -This error occurs when a requested action is not permitted. It serves as the default response for forbidden actions and can be triggered by various issues. - -The following are example for this error: -* Mismatched SDK versions, occurring if an application uses multiple versions of the Ably SDK, leading to inconsistencies in connections. -* A disabled account, indicating that the app belongs to an account that has been manually disabled by Ably. -* An incorrect URL for a private cluster. - -## 40311: Operation requires TLS connection - -By default, Ably apps require TLS for connections. This error occurs when a realtime SDK attempts to connect with TLS disabled (tls: false) while using token authentication. - -Resolution: The following steps can help resolve this issue: -* Ensure that the `tls` [`ClientOption`](/docs/api/realtime-sdk?#client-options) is set to true when connecting. -* If using API key authentication, note that this scenario will result in a [`40103`](#40103) error instead. - -## 40330: Unable to activate account due to placement constraint (unspecified) - -This error occurs when an app belonging to a dedicated (private) [cluster](/docs/platform/account/enterprise-customization#dedicated-and-isolated-clusters) is accessed using an incorrect endpoint. [Enterprise](/docs/platform/pricing/enterprise) customers with private clusters receive [custom](/docs/platform/account/enterprise-customization#setting-up-a-custom-environment) environment endpoints specific to their deployment. - -An example of this error is when an app configured for a private cluster tries to connect via the default global endpoint. - -Resolution: Check your custom environment settings for all connecting clients to ensure they point to the correct private cluster endpoints. - -## 40331: Unable to activate account due to placement constraint (incompatible environment) - -This error occurs when an app that belongs to a dedicated (private) [cluster](/docs/platform/account/enterprise-customization#dedicated-and-isolated-clusters) is accessed using an incorrect URL. This often happens when the correct environment is not specified when initializing a client library. [Enterprise](/docs/platform/pricing/enterprise) customers with private clusters receive [custom](/docs/platform/account/enterprise-customization#setting-up-a-custom-environment) environment endpoints specific to their deployment. - -If a request arrives at an unexpected dedicated cluster or incorrect region, the account in that scope may be disabled, triggering this error. - -An example of this error is when a client intended for a dedicated environment, such as acme, connects to the default global endpoint (`main.realtime.ably.net`) instead of the correct dedicated cluster endpoint (`acme.realtime.ably.net`). If the expected environment is not configured, requests may be rejected. - -Resolution: Verify that all connecting clients are configured with the correct custom environment settings to ensure they are pointing to the intended dedicated cluster. - -## 40332: Unable to activate account due to placement constraint (incompatible site) - -This error occurs when attempting to connect to an app for an account restricted to a specific region. - -An example of this error is when a client attempts to connect to an Ably app restricted to the EU region but does not specify the EU environment in the SDK configuration. - -Resolution: The following steps can help resolve this issue: -* Ensure you are configured with the correct environment for your [region-restricted](https://faqs.ably.com/do-you-have-an-option-to-keep-my-data-in-europe-or-the-united-states) account. -* If your account has a regional constraint, you should have been provided with a [custom](/docs/platform/account/enterprise-customization#setting-up-a-custom-environment) environment to pass to the [`ClientOptions`](/docs/getting-started#options). -* Verify that your connection settings match the region assigned to your account. - -## 40400: Not found - -This error occurs when the requested resource does not exist. This can apply to an Ably app, client, device, connection, API key, or token. The accompanying error message provides more details about the missing resource. - -Examples of this error include: -* Attempting to authenticate using an Ably API key or token, but the specified appId cannot be found. This may happen if: -** The appId is incorrect. -** The appId does not exist in the current environment (especially in a custom deployment). -* Attempting to authenticate with an incorrect API key ID, which may be due to: -* An invalid API key ID. -* The key not being found in the specified environment. -* Incorrect formatting, particularly case sensitivity issues. - -## 42910: Rate limit exceeded; request rejected - -This error occurs when a [limit](/docs/platform/pricing/limits) on your account has been reached, preventing further requests until the limit resets. The duration of the limit depends on the type of rate limit: - -* Instantaneous rate limits typically last up to six seconds before allowing message publishing to resume. -* Other limits may apply on an hourly or monthly basis. - -An example of this error is when a client exceeds the maximum allowed message rate on a channel. - -In the following example, the metric `channel.maxRate` represents the maximum rate of messages allowed to be published on a channel per second. The permitted rate is 5000 messages per second, but the client is attempting to publish 5015 messages per second, triggering the limit. - - -```text -Rate limit exceeded; request rejected (nonfatal); -metric = channel.maxRate; -interval = 2018-01-05:10:10:3; -permitted rate = 5000; -current rate = 5015; -scope = channel:[YOUR APP ID]:[YOUR CHANNEL] -(status: 429, code: 42910) (code: 42910, http status: 429) -``` - - -Resolution: Wait for the rate limit period to reset before retrying. Optimize your message publishing to stay within allowed limits. Upgrade your package if higher throughput is required. Review your account limits to determine which restriction has been hit. - -## 42911: Maximum account-wide instantaneous messages rate exceeded - -This error occurs when the number of [messages](/docs/platform/pricing/limits#message) sent per second exceeds the limit imposed on an account. To maintain service reliability for all users, Ably enforces usage limits at different levels, including monthly, hourly, and per-second thresholds. - -## 42912: Channel iteration call already in progress - -This error occurs when multiple concurrent [metadata REST requests](/docs/metadata-stats/metadata#rest) are made to retrieve a list of active channels. The API is rate-limited, allowing only one in-flight call at a time. Additional concurrent requests will be rejected with this error. - -Resolution: The following steps can help resolve this issue: -* Ensure that only one request is in progress at any given time. -* Implement request queuing or backoff strategies to avoid sending concurrent calls. -* If you require enhanced channel [enumeration capabilities](/docs/api/rest-api#enumeration-rest), visit this page to request access to the preview API. - -## 42922: Rate limit exceeded; too many requests - -This error occurs when a client has made too many requests within a 5-minute time window, causing the request to be rejected. The [limit](/docs/platform/pricing/limits#hitting) remains in effect for up to 30 seconds but may persist longer if request volume remains above the threshold from the same IP address. - -This rate limit is in place to protect the Ably platform and is not expected during normal use. - -## 50001: Internal channel error - -This error occurs when there is an internal issue on an Ably channel. - -## 50002: Internal connection error - -This error occurs when there is an internal connection issue. - -## 50003: Timeout error - -This error occurs when a [connection](/docs/connect) request to Ably times out. - -An example of this error is when a client attempts to publish a message to a channel, but the operation fails to complete within the allowed time. - -Examples of this error include: -* Poor network conditions affecting connectivity. -* Improper usage of the Ably SDKs leading to unexpected delays. -* Temporary Ably server issues impacting response times. - -## 50305: Ably's routing layer was unable to service this request - -This error occurs as a result of a request not being handled due to an internal routing error within the Ably service. - -## 61002: Activation failed: Present clientId is not compatible with existing device registration - -This error occurs when you previously [activated](/docs/push/configure/device#activate-devices) a device for push notifications with a specific `clientId`, but then changed the `clientId` used for authentication. The mismatch causes the error because the push notification setup tracks the `clientId` and other details to prevent accidental changes between app launches. The `clientId` is linked to registrations, such as subscribing by `clientId`. - -Resolution: If you need to change your client's `clientId`, deactivate and reactivate the device. This process triggers an internal `device.reset()` call, which clears and resets the old device details. - -## 70001: Reactor operation failed (POST operation failed) - -This error occurs when a Reactor rule fails due to an issue with the configured endpoint. Ably attempts to send a POST request, but the response is unexpected or unsuccessful. - -## 70002: Reactor operation failed (POST operation returned unexpected code) - -This error occurs when Ably sends a webhook to your server, but the server refuses or returns an unexpected response code. While Ably will retry the request multiple times, repeated failures indicate an issue on the server side. - -## 72000: Ingress operation failed - -This error occurs due to an internal error with the ingress worker. It is an unexpected issue that happens when the worker attempts to execute a rule but encounters an error during the process. - -## 72002: Ingress table is unhealthy - -This error occurs when the rule worker is unable to access or retrieve data from either the [outbox](/docs/livesync/postgres#outbox-table) or [nodes](/docs/livesync/postgres#nodes-table) table in the database as expected. - -An example of this error is misconfigurations in the database setup or inconsistencies between the provided configuration and the actual database schema or table names. - -Resolution: The following steps can help resolve this issue: -* Verify the configuration of the outbox and nodes tables in the database to ensure they are correctly set up and match the rule definition. -* Check for database connectivity issues and confirm that the database is accessible. -* Ensure that the schema and table names align with the expected configuration. - -## 72004: Ingress cannot identify channel, no _ablyChannel field - -This error occurs when a [MongoDB Change Stream](https://www.mongodb.com/docs/manual/changeStreams/#change-streams) event does not contain the required `_ablyChannel` field after being processed through the Change Stream pipeline. This field is essential for identifying the channel where the change event message will be published. - -Resolution: The following steps can help resolve this issue: -* Ensure that the `_ablyChannel` field is present at the root level of the change event. -* Avoid nesting it inside other sections, such as `$fullDocument._ablyChannel`. -* The field must be part of the main structure of the change event to allow proper identification. - -## 72005: Ingress invalid pipeline - -This error occurs when the [MongoDB Change Stream](https://www.mongodb.com/docs/manual/changeStreams/#change-streams) fails to start due to an invalid pipeline. An example of this error is when the pipeline syntax does not conform to MongoDB's requirements or contains unrecognized operators. - -Resolution: The following steps can help resolve this issue: -* Review the pipeline syntax for errors and ensure all operators are valid. -* Adjust the pipeline to match MongoDB's accepted structure and syntax guidelines. - -## 72006: Unable to resume from change stream - -This error occurs when the [MongoDB Change Stream](https://www.mongodb.com/docs/manual/changeStreams/#change-streams) cannot be resumed because the resume token document stored in MongoDB is not in the correct format. - -Resolution: The following steps can help resolve this issue: -* Verify the format of the stored resume token document in MongoDB. -* Ensure the token meets the expected structure and format required for MongoDB Change Stream resumption. -* Refer to the MongoDB documentation for guidelines on properly storing and using resume tokens. - -## 72007: Unable to store change stream resume token - -This error occurs when the [MongoDB Change Stream](https://www.mongodb.com/docs/manual/changeStreams/#change-streams) resume token cannot be stored in the `ably` collection of the database. - -Resolution: The following steps can help resolve this issue: -* Verify that the integration rule and MongoDB connection string are correctly configured. -* Ensure the database user has the necessary read and write permissions for the `ably` collection. -* Adjust permissions if needed to allow the token to be successfully stored. - -## 80000: Connection failed - -This error occurs when the SDK is having trouble [connecting](/docs/connect/states#connection-states) to Ably, likely due to client-side network connectivity issues. Note: The SDK will automatically retry the connection after 30 seconds. - -## 80002: Connection suspended - -This error occurs when the SDK is having trouble [connecting](/docs/connect/states#connection-states) to Ably. This is likely due to client-side network connectivity issues, and has failed to establish a connection within 2 minutes. Note: The SDK will automatically retry the connection after 15 seconds. - -## 80003: Generic disconnection error - -This error occurs when the SDK is having trouble [connecting](/docs/connect/states#connection-states) to Ably, likely due to client-side network connectivity issues. Note: The SDK will automatically retry the connection after 15 seconds. - -## 80008: Unable to recover connection (connection expired) - -This error occurs when a [connection](/docs/connect/states#connection-states) resume attempt fails because the original connection has expired. This typically happens when the [`resume`](/docs/connect/states#resume) attempt occurs after the two-minute window has passed. - -If this error occurs, the client establishes a new connection instead of resuming the old one. Any messages sent during the gap will be missed, unless channel persistence is enabled. - -Resolution: Ensure that resume attempts occur within the two-minute window to successfully recover a connection. If message loss is a concern, use [history](/docs/api/realtime-sdk/history) to retrieve missed messages. - -## 80014: Connection timed out - -This error occurs when a realtime [connection](/docs/connect/states#connection-states) times out after waiting for the default 10-second `realtimeRequestTimeout` in certain Ably SDKs. - -The request will be automatically retried by the SDK. - -Resolution: If the client never connects to the [primary or fallback endpoints](https://faqs.ably.com/routing-around-network-and-dns-issues), check any firewall rules that may be blocking access to Ably's [endpoints](https://faqs.ably.com/if-i-need-to-whitelist-ablys-servers-from-a-firewall-which-ports-ips-and/or-domains-should-i-add). - - -## 80016: Operation on superseded connection - -This error occurs when a browser [connection](/docs/connect/states#connection-states) upgrades from an HTTP (Comet) transport to WebSockets. It is logged by the client library when operations are performed on the older transport. - -Resolution: the following steps can help resolve this issue: -* If this error only appears in logs, it is harmless and does not affect your application. No action is needed. -* If you receive this error as a response to a request, contact Ably support with relevant logs and details, and they will investigate the issue. - -## 80017: Connection closed - -This error occurs when a [connection](/docs/connect/states#connection-states) has been closed and an operation is attempted on it, such as calling a channel or presence method, for example, `channel.presence.update` while the connection is still in a closed state. - -Resolution: The following steps can help resolve this issue: -* Check the client's connection state before performing operations to ensure the connection is active. -* If the connection is closed, reconnect before making requests to avoid this error. - -## 80018: Invalid connection ID (invalid format) - -This error occurs when an invalid `connectionId` is supplied. - -Resolution: This was a bug in ably-js versions 1.2.30 through 1.2.33 and was fixed in later 1.x releases. If you are on an affected version, upgrade to the latest SDK. - -## 80019: Auth server rejecting request - -This error occurs when the client library fails to obtain a token using the client-supplied [`authUrl`](/docs/auth/token/jwt#auth-url) or [`authCallback`](/docs/auth/token/jwt#auth-callback). It is raised when the request to the authentication server fails due to an error or exception in the callback. - -## 80020: Continuity loss due to maximum subscribe message rate exceeded - -This error occurs when a client exceeds the [outbound](/docs/platform/pricing/limits#connection) subscribe message rate on a realtime connection. - -Resolution: The subscriber will receive an `UPDATE` [channel state change](/docs/api/realtime-sdk/channels#channel-state-change) event, indicating that continuity is lost. Use the [`resume`](/docs/connect/states#resume) flag to determine whether to recover missing messages or handle the failure accordingly. - -## 80021: Max new connections rate exceeded - -This error occurs when the maximum allowed rate of new connections for an account has been [exceeded](/docs/platform/pricing/limits#hitting). - -## 80022: Unable to find connection - -This error can occur when using the Comet transport, where a `send` or `recv` request is sent to the system but reaches a different frontend instance than the one hosting the connection. This can happen due to a disruption on a frontend instance. - -Resolution: This is a non-fatal error, and no action is required. The transport will automatically drop and be re-initiated without any need for manual intervention. - -## 80023: Unable to resume connection from a different site - -This error occurs when a disconnected client attempts to resume a [connection](/docs/connect) from a different site than the original connection. This typically happens when a client tries to [`resume`](/docs/connect/states#resume) via a fallback host. - -Resolution: Channel message continuity will not be possible in this scenario. Any messages sent while the client was disconnected will need to be retrieved using [history](/docs/storage-history/history). - -## 90001: Channel operation failed (invalid channel state) - -This error occurs when an application attempts to perform an operation on a channel that is in a [state](/docs/channels/states#connection-state) that does not permit it. - -An example of this error is when an application tries to [publish](/docs/pub-sub#publish) a message or attach to a channel that is in a failed state due to a prior error. As a result, the operation fails because actions cannot be performed on a channel in this state. - -Resolution: The following steps can help resolve this issue: -* Ensure the channel is in an appropriate state before performing any operations. -* Use an Ably SDK to listen for channel state changes and handle operations accordingly. -* Implement state change callbacks to trigger the intended operation when the channel is in a valid [state](/docs/channels/states). - -## 90004: Unable to recover channel (message limit exceeded) - -This error occurs when using the rewind feature with a specified time period, and the total number of messages within the selected timeframe exceeds the maximum [limit](/docs/channels/options/rewind#limits) that can be retrieved in a single request. - -## 90007: Channel didn't attach within 00:00:10 - -This error occurs when a channel fails to [attach](/docs/channels/states#attach) within the default 10-second timeout. It is most commonly encountered by clients with poor internet connections, where the `ACK` response to an `ATTACH` request does not return within the expected timeframe. - -Note: In older versions of the ably-java SDK, this error was incorrectly assigned to error code `91200`. - -Resolution: Adjust the `realtimeRequestTimeout` or `channelRetryTimeout` (depending on the SDK) to a higher value to allow more time for the attachment process. - -## 90010: Maximum number of channels per connection exceeded - -This error occurs when a Realtime client [attaches](/docs/channels/states#attach) to more channels than the account allows on a single connection. This happens when channels are attached but never explicitly detached, causing the limit to be reached. - -Resolution: Review your channel [limits](/docs/platform/pricing/limits#channel) and ensure that channels are explicitly detached when no longer needed. - -## 90021: Max channel creation rate exceeded - -This error occurs when the [maximum](/docs/platform/pricing/limits#channel) rate of channel creation has been exceeded, across an account. Until the rate returns below the limit, new channels may not be created immediately. The Ably SDK will automatically retry every 10 seconds until the request succeeds. - -## 91000: Unable to enter presence channel (no clientId) - -This error occurs when a client attempts to [enter](/docs/chat/rooms/presence#set) the [presence](/docs/presence-occupancy/presence) set of a channel without specifying a `clientId`. - -A client can be identified in several ways: -* If using [token](/docs/auth/token) authentication, ensure the token is associated with a `clientId` by setting the `clientId` field in `tokenParams` when creating a token request or requesting a token. -* If using basic authentication or token authentication with a wildcard `clientId`, set the `clientId` in the client options when initializing the Ably SDK. -* Specify a `clientId` at the time of entering presence using [`enterClient()`](/docs/api/realtime-sdk/presence#enterclient). - -## 91003: Maximum member limit exceeded - -This error occurs when the [maximum](/docs/platform/pricing/limits#hitting) number of clients in the [presence](/docs/presence-occupancy/presence) set for a channel has been reached, preventing additional clients from joining. - -## 91005: Presence state is out of sync - -This is a client-side issue that occurs when an up-to-date [presence](/docs/presence-occupancy/presence) set cannot be retrieved due to connection issues. It typically happens when calling `presence.get()` while the channel is in a suspended state, often caused by an interruption in the client's internet connection. - -Resolution: The following steps can help resolve this issue: -* Ensure the client has an active connection before calling `presence.get()`. -* If an outdated presence set is acceptable, set `waitForSync` to `false` to retrieve the presence data even when out of sync. - -## 92000: Invalid object message - -This error occurs when an object message used to represent [operations](/docs/liveobjects/concepts/operations) and [objects](/docs/liveobjects/concepts/objects) is malformed or contains invalid data that cannot be processed. - -* If this error occurs when using the REST API, the error response will include additional details about how to correctly construct your request. -* If this error occurs when using a Realtime SDK, it likely indicates a bug in the client. Please raise an issue in the GitHub repository for the SDK you are using with relevant logs and details. - -## 92001: Objects limit exceeded - -This error occurs when the maximum number of [objects](/docs/liveobjects) on the channel has exceeded the allowed [limit](/docs/platform/pricing/limits#channel) for the account or application. - -Resolution: -* Remove any unnecessary objects from the channel to free up space, for example by [removing](/docs/liveobjects/map#remove) any references to them. -* [Upgrade](/docs/platform/pricing) your package to increase the [limit](/docs/platform/pricing/limits#channel) on the allowed number of objects on the channel. - -## 92002: Unable to submit operation on tombstone object - -This error occurs when attempting to perform an [operation](/docs/liveobjects/concepts/operations) on a [tombstone](/docs/liveobjects/concepts/objects#tombstones) object (an object that has been marked as deleted). - -Resolution: -* Retry the operation on an object that is not a tombstone and is [reachable](/docs/liveobjects/concepts/objects#reachability) from the [root object](/docs/liveobjects/concepts/objects#root-object) . - -## 92003: Unable to fetch object tree with tombstone object as root - -This error occurs when attempting to fetch an [object](/docs/liveobjects/concepts/objects) tree where the specified object is a [tombstone](/docs/liveobjects/concepts/objects#tombstones) object (an object that has been marked as deleted). - -You may encounter this error when [fetching objects](/docs/liveobjects/rest-api-usage#fetching-objects-get-children) via the REST API using the `children` query parameter, or if using the [compact](/docs/liveobjects/rest-api-usage#fetching-objects-compact) endpoint. - -Resolution: -* Retry the operation on an object that is not a tombstone and is [reachable](/docs/liveobjects/concepts/objects#reachability) from the [root object](/docs/liveobjects/concepts/objects#root-object) . - -## 92004: Object not found - -This error occurs when attempting to access an [object](/docs/liveobjects/concepts/objects) that does not exist. - -You may encounter this error when using the [REST API](/docs/liveobjects/rest-api-usage) or if calling methods on a [LiveMap](/docs/liveobjects/map) or [LiveCounter](/docs/liveobjects/map) instance that has been deleted. - -Resolution: -* Listen for [lifecycle events](/docs/liveobjects/lifecycle) on object instances to be notified when an object is deleted. -* Retry the REST API request with a valid [object ID](/docs/liveobjects/rest-api-usage#updating-objects-by-id) or [path](/docs/liveobjects/rest-api-usage#updating-objects-by-path) that corresponds to an existing object. - -## 92005: No objects found matching operation path - -This error occurs when no objects are found that match the specified [path](/docs/liveobjects/rest-api-usage#updating-objects-by-path) when using the REST or Realtime Objects API. This may happen either because no object exists at that path, or because one or more path segments refer to a non-collection object type. - -Resolution: -* Ensure that the `path` is correctly specified and corresponds to an existing object. - -## 92006: Unable to perform operation without objectId or path - -This error occurs when attempting to perform an operation without providing either an [object ID](/docs/liveobjects/rest-api-usage#updating-objects-by-id) or [path](/docs/liveobjects/rest-api-usage#updating-objects-by-path) to identify the target object when using the REST API. - -Resolution: -* Ensure that the request includes either an `objectId` or a `path` parameter to specify the target object for the operation. - -## 92007: Operation not processable on path - -This error occurs when the requested operation cannot be processed for the object located at the specified [path](/docs/liveobjects/rest-api-usage#updating-objects-by-path) when using the REST or Realtime Objects API. - -You may encounter this error when the type of the object located at the specified path does not support the specified operation (e.g. publishing a `COUNTER_INC` operation on a [LiveMap](/docs/liveobjects/map) instance). - -Resolution: -* Ensure that the operation is valid for the type of object at the specified path. - -## 92008: Unable to apply objects operation; objects sync did not complete - -This error occurs when a LiveObjects mutation operation has been successfully published to the server, but the operation could not be applied locally because the channel entered the `DETACHED`, `SUSPENDED`, or `FAILED` state while waiting for the objects sync to complete. The operation will still take effect on the server, but the local state may not reflect it until the channel is re-attached and the objects are re-synced. - -## 93001: Attempt to add an annotation listener without having requested the annotation_subscribe channel mode - -This error occurs when attempting to [subscribe to individual annotations](/docs/messages/annotations#subscribe-individual-annotations) without having requested the `annotation_subscribe` [channel mode](/docs/channels/options#modes) . - -**Resolution:** -* Ensure that `annotation_subscribe` mode is specified in the client [channel options](/docs/channels/options) before subscribing to individual annotations. - -## 93002: Annotations are only supported on channels with message annotations, updates, deletes, and appends enabled - -This error occurs when attempting to use [message annotations](/docs/messages/annotations) on a channel that does not have them enabled. - -**Resolution:** -* Create a [rule](/docs/channels#rules) for the channel or channel namespace with **Message annotations, updates, deletes, and appends** enabled. - -## 101000: Space name missing - -This error occurs when calling [`spaces.get()`](/docs/spaces/space#options) without specifying a space name. The name parameter is required to retrieve a space. - -Resolution: Ensure that a valid space name is provided when calling `spaces.get()`: - - -```javascript -const space = await spaces.get('mySpaceName'); -``` - - -## 101001: Not entered space - -This error occurs when calling a function that requires the client to be [entered](/docs/spaces/space#enter) into a space, but the client has not yet done so. - -Resolution: Ensure that `space.enter()` is called before performing operations that require the client to be inside the space: - - -```javascript -const space = await spaces.get('mySpace'); -space.enter({ - username: 'Claire Lemons', - avatar: 'https://slides-internal.com/users/clemons.png', -}); -``` - - -## 101002: Lock request exists - -This error occurs when an existing [lock request](/docs/spaces/locking#states) is still pending or locked. Nested locks are not supported, so a new lock cannot be requested until the previous one is resolved. - -## 101003: Lock is locked - -This error occurs when a lock is already in the [locked state](/docs/spaces/locking#states), and a pending request did not override or release the lock. - -## 101004: Lock invalidated - -This error occurs when a [lock request](/docs/spaces/locking#states) invalidates an existing lock that was already in the locked state. +{/* AUTOGENERATED — DO NOT EDIT. Generated from the ably-common errors registry by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +Every Ably error code, its identifier, and a short description. Select a code for details on what it means, why it happens, and how to resolve it. + +## 10xxx + +| Code | Title | Summary | +| --- | --- | --- | +| [10000](/docs/platform/errors/codes/10000-no-error)
no_error | No error | A placeholder code indicating success, used where an error code is expected but the operation completed normally. It does not represent a failure. | + +## 20xxx + +| Code | Title | Summary | +| --- | --- | --- | +|
[20000](/docs/platform/errors/codes/20000-general-error)
general_error | General error | 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. | + +## 40xxx + +| Code | Title | Summary | +| --- | --- | --- | +|
[40000](/docs/platform/errors/codes/40000-bad-request)
bad_request | Bad request | The request was rejected because it was invalid and could not be processed. | +|
[40001](/docs/platform/errors/codes/40001-invalid-request-body)
invalid_request_body | Invalid request body | The body of the request could not be processed because it was invalid, missing required fields, or not in the expected format. | +|
[40002](/docs/platform/errors/codes/40002-invalid-request-parameter-name)
invalid_request_parameter_name | Invalid request parameter name | The request included a parameter that is not recognized or not permitted for the operation being performed. | +|
[40003](/docs/platform/errors/codes/40003-invalid-parameter-value)
invalid_parameter_value | Invalid request parameter value | A parameter in the request was invalid, such as a value of the wrong type, outside the allowed range, or otherwise unacceptable for that parameter. | +|
[40004](/docs/platform/errors/codes/40004-invalid-request-header)
invalid_request_header | Invalid request header | A header supplied with the request was missing, invalid, or held a value that was not accepted for the operation. | +|
[40005](/docs/platform/errors/codes/40005-invalid-credential)
invalid_credential | Invalid API key or token | An API key or token supplied with the request could not be read because it was not in the expected form. This is distinct from a key or token that is well-formed but unauthorized. | +|
[40006](/docs/platform/errors/codes/40006-message-contains-invalid-connection-id)
message_contains_invalid_connection_id | Message contains invalid connection ID | A published message referenced a connection by an ID or key that was invalid or did not match, so the message was rejected. | +|
[40007](/docs/platform/errors/codes/40007-invalid-connection-serial)
invalid_connection_serial | Invalid connection serial | An older Ably SDK attempted to resume a connection using an invalid connection serial. | +|
[40008](/docs/platform/errors/codes/40008-invalid-content-length)
invalid_content_length | Invalid content length | More data arrived in the request body than its Content-Length header declared, so the request was rejected. | +|
[40009](/docs/platform/errors/codes/40009-max-message-size-exceeded)
max_message_size_exceeded | Message too large | A message was rejected because it exceeded the maximum permitted size. When several messages are published in a single call, the limit applies to their combined size rather than to each one individually. | +|
[40010](/docs/platform/errors/codes/40010-invalid-channel-name)
invalid_channel_name | Invalid channel name | The channel name in the request was not valid, for example because it was empty, contained characters that are not permitted, or used an unknown square-bracketed prefix. | +|
[40011](/docs/platform/errors/codes/40011-pagination-sequence-no-longer-valid)
pagination_sequence_no_longer_valid | Pagination sequence no longer valid | An enumeration query could not continue because the underlying set of results shifted between pages, so the pagination sequence was no longer valid. | +|
[40012](/docs/platform/errors/codes/40012-invalid-client-id)
invalid_client_id | Invalid client ID | The client ID supplied was not acceptable, for example because it was empty, a wildcard, not a string, or did not match the client ID permitted by the credentials in use. | +|
[40013](/docs/platform/errors/codes/40013-invalid-data-or-encoding)
invalid_data_or_encoding | Invalid message data or encoding | A message was rejected because its data was of an unsupported type, or because the encoding declared for the data could not be applied or reversed. | +|
[40014](/docs/platform/errors/codes/40014-resource-disposed)
resource_disposed | Resource disposed | The operation could not complete because an internal Ably resource it targeted was temporarily unavailable, typically during routine changes on Ably's side such as failover or rebalancing. | +|
[40015](/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. | +|
[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. | +|
[40022](/docs/platform/errors/codes/40022-api-streamer-no-longer-offered)
api_streamer_no_longer_offered | API Streamer no longer offered | The request targeted API Streamer, which has been shut down and is no longer available. Requests that depend on it can no longer be served. | +|
[40023](/docs/platform/errors/codes/40023-operation-requires-a-newer-sdk-version)
operation_requires_a_newer_sdk_version | Operation requires a newer SDK version | The requested operation is not supported by the Ably SDK version in use, because it relies on a capability available only in a more recent version. | +|
[40024](/docs/platform/errors/codes/40024-incompatible-site-for-history)
incompatible_site_for_history | untilAttach history request not served by attach region | A history request using untilAttach was handled by a different Ably region from the one the channel attached in. The attach point is specific to that region, so the request could not be served and no messages were returned. | +|
[40025](/docs/platform/errors/codes/40025-api-no-longer-supported)
api_no_longer_supported | API no longer supported | A method or feature that Ably no longer supports was called. It has been removed or replaced by a newer API, so the call is rejected instead of being performed. | +|
[40030](/docs/platform/errors/codes/40030-invalid-publish-request)
invalid_publish_request | Invalid publish request | A publish request was rejected because it was invalid. | +|
[40031](/docs/platform/errors/codes/40031-invalid-client-specified-message-id)
invalid_client_specified_message_id | Invalid client-specified message id | A publish was rejected because a client-supplied message id was missing, empty, or not in the required format. When several messages are published together, every message must carry a valid id following the expected pattern. | +|
[40032](/docs/platform/errors/codes/40032-invalid-message-extras-field)
invalid_message_extras_field | Invalid message extras field | A publish was rejected because a message included an extras field that is not permitted, or one whose value was the wrong type. Only recognized extras keys with values of the expected shape are accepted. | +|
[40033](/docs/platform/errors/codes/40033-operation-canceled)
operation_canceled | Operation canceled | An operation was stopped before completing, so its result was discarded. This usually happens when the connection or request that triggered the operation ends first. | +|
[40034](/docs/platform/errors/codes/40034-too-many-messages-in-one-publish)
too_many_messages_in_one_publish | Too many messages in one publish | A publish was rejected because it contained more messages than the maximum permitted count. This is about the number of messages, not their combined size, which is limited separately. | +|
[40035](/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. | +|
[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. | +|
[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. | +|
[40113](/docs/platform/errors/codes/40113-account-blocked)
account_blocked | Account blocked | The request was rejected because the Ably account it belongs to is blocked. | +|
[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. | +|
[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. | +|
[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. | +|
[40141](/docs/platform/errors/codes/40141-token-revoked)
token_revoked | Token revoked | A connection or request was rejected because the authentication token it used has been revoked. A revoked token is invalidated before its normal expiry and can no longer authenticate. | +|
[40142](/docs/platform/errors/codes/40142-token-expired)
token_expired | Token expired | The client's connection or request was rejected because the authentication token had expired. Each token has an expiry time that is set when it is issued. | +|
[40143](/docs/platform/errors/codes/40143-token-unrecognized)
token_unrecognized | Token not recognized | A connection or request was rejected because Ably could not find a record of the token presented. Ably stores a record of certain tokens only while they remain valid, so this often means the token had already expired. | +|
[40144](/docs/platform/errors/codes/40144-invalid-jwt)
invalid_jwt | Invalid JWT token | A JWT presented for authentication could not be parsed. The token was not well-formed, so it could not be read as a valid JSON Web Token. | +|
[40145](/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. | +|
[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. | +|
[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. | +|
[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. | +|
[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. | +|
[40320](/docs/platform/errors/codes/40320-authentication-required)
authentication_required | Authentication required | The request was rejected because it carried no authentication credentials. | +|
[40330](/docs/platform/errors/codes/40330-account-not-permitted-in-cluster-or-region)
account_not_permitted_in_cluster_or_region | Account not permitted in this cluster or region | The request reached a cluster or region the account is not permitted to use; the accompanying error message gives the specific reason. | +|
[40331](/docs/platform/errors/codes/40331-account-not-permitted-in-cluster)
account_not_permitted_in_cluster | Account not permitted in this cluster | The request reached an Ably cluster the account is not permitted to use. | +|
[40332](/docs/platform/errors/codes/40332-account-not-permitted-in-region)
account_not_permitted_in_region | Account not permitted in this region | The request reached a region the account is not permitted to use. | +|
[40400](/docs/platform/errors/codes/40400-not-found)
not_found | Resource not found | The requested resource does not exist, often because it has been deleted or the path or identifier used to reference it is incorrect. | +|
[40500](/docs/platform/errors/codes/40500-method-not-allowed)
method_not_allowed | HTTP method not allowed | The request used an HTTP method that the endpoint does not support. | +|
[40900](/docs/platform/errors/codes/40900-conflict)
conflict | Conflict | The request conflicted with the current state of the target, so it could not be completed. | + +## 41xxx + +| Code | Title | Summary | +| --- | --- | --- | +|
[41001](/docs/platform/errors/codes/41001-push-device-registration-expired)
push_device_registration_expired | Push device registration expired | The push notification could not be delivered because the target device's registration is no longer valid. Registrations expire over time, and the device must register again before it can receive notifications. | + +## 42xxx + +| 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. | +|
[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. | +|
[42910](/docs/platform/errors/codes/42910-rate-limit-exceeded-generic)
rate_limit_exceeded_generic | System rate limit exceeded | An operation was rejected because a system rate limit was exceeded. The limit protects Ably against overload; the operation can be retried. | +|
[42911](/docs/platform/errors/codes/42911-rate-limit-exceeded-per-connection-inbound)
rate_limit_exceeded_per_connection_inbound | Per-connection publish rate exceeded | A message was rejected because the connection published messages faster than the per-connection publish rate limit allows. Publishing far above the limit can escalate to the connection being closed. | +|
[42912](/docs/platform/errors/codes/42912-rate-limit-channel-iteration-in-progress)
rate_limit_channel_iteration_in_progress | Channel enumeration already in progress | A request to enumerate the channels active in an app was rejected because another enumeration was already running. Only one channel enumeration can run at a time for an app. | +|
[42913](/docs/platform/errors/codes/42913-rate-limit-exceeded-per-channel-inbound)
rate_limit_exceeded_per_channel_inbound | Per-channel publish rate exceeded | A message was rejected because the rate of messages published to the channel exceeded its configured limit. The limit applies to all publishers to the channel combined, so it can be reached even when no single publisher is publishing quickly. | +|
[42914](/docs/platform/errors/codes/42914-rate-limit-exceeded-per-channel-bandwidth)
rate_limit_exceeded_per_channel_bandwidth | Per-channel publish bandwidth exceeded | A message was rejected because the rate of data published to the channel exceeded its configured bandwidth limit. The limit applies to all publishers to the channel combined, so large messages can reach it even at a low message rate. | +|
[42915](/docs/platform/errors/codes/42915-rate-limit-exceeded-per-connection-outbound)
rate_limit_exceeded_per_connection_outbound | Per-connection outbound message rate exceeded | Messages were not delivered to a connection because the rate of messages being sent to it exceeded its per-connection outbound limit. The client is notified of the gap by a channel continuity loss, which it receives as error 80020. | +|
[42916](/docs/platform/errors/codes/42916-rate-limit-exceeded-per-connection-backlog)
rate_limit_exceeded_per_connection_backlog | Per-connection outbound resume rate exceeded | Backlog messages were not delivered to a connection because the rate of delivering them exceeded its per-connection outbound limit. The client is notified of the gap by a channel continuity loss, which it receives as error 80020. | +|
[42917](/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. | +|
[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. | +|
[42925](/docs/platform/errors/codes/42925-rate-limit-exceeded-account-integrations)
rate_limit_exceeded_account_integrations | Account-wide integration invocation rate exceeded | An integration invocation was dropped because the invocation rate across the account exceeded the configured account-wide limit. A proportion of invocations are dropped to bring the account back within its limit. | +|
[42926](/docs/platform/errors/codes/42926-rate-limit-exceeded-account-push-notifications)
rate_limit_exceeded_account_push_notifications | Account-wide push notification rate exceeded | A push notification was dropped because the publish rate of push notifications across the account exceeded the configured account-wide limit. A proportion of push notifications are dropped to bring the account back within its limit. | + +## 50xxx + +| Code | Title | Summary | +| --- | --- | --- | +|
[50000](/docs/platform/errors/codes/50000-internal-error)
internal_error | Internal server error | The request could not be completed because of an unexpected error inside the Ably platform. | +|
[50001](/docs/platform/errors/codes/50001-internal-channel-error)
internal_channel_error | Internal channel error | An operation on a channel failed because of an unexpected error inside the Ably platform. | +|
[50002](/docs/platform/errors/codes/50002-internal-connection-error)
internal_connection_error | Internal connection error | An operation on a connection failed because of an unexpected error inside the Ably platform. | +|
[50003](/docs/platform/errors/codes/50003-timeout-error)
timeout_error | Request timed out server-side | The Ably platform did not finish handling the request within the time allowed, so the request was abandoned. This usually reflects a transient server-side delay rather than a problem with the request. | +|
[50004](/docs/platform/errors/codes/50004-server-temporarily-busy)
server_temporarily_busy | Server temporarily busy | The request was rejected because the server handling it could not accept it at that moment. The condition is transient. | +|
[50005](/docs/platform/errors/codes/50005-service-temporarily-unavailable)
service_temporarily_unavailable | Service temporarily unavailable | The request could not be served because the service was temporarily in a locked-down state, during which requests are not accepted. The condition is temporary and expected to clear. | +|
[50006](/docs/platform/errors/codes/50006-connection-superseded-by-a-newer-connection)
connection_superseded_by_a_newer_connection | Connection superseded by a newer connection | The connection's state was taken over by a more recent connection, typically a reconnection or resume. This only arises on a deprecated Ably protocol version; upgrade to a recent Ably SDK release to avoid it. | +|
[50010](/docs/platform/errors/codes/50010-edge-proxy-internal-error)
edge_proxy_internal_error | Edge proxy internal error | Ably's edge proxy service encountered an unknown internal error while handling the request and could not complete it. | +|
[50210](/docs/platform/errors/codes/50210-invalid-platform-response)
invalid_platform_response | Invalid response from the platform | Ably's edge proxy service received an invalid response from the Ably platform behind it and could not complete the request. The condition is usually transient. | +|
[50310](/docs/platform/errors/codes/50310-platform-temporarily-unavailable)
platform_temporarily_unavailable | Platform temporarily unavailable | Ably's edge proxy service received a service-unavailable response from the Ably platform behind it and could not complete the request. The condition is usually transient. | +|
[50320](/docs/platform/errors/codes/50320-traffic-temporarily-redirected)
traffic_temporarily_redirected | Traffic temporarily redirected | Ably's Active Traffic Management temporarily redirected traffic away from its normal path, and the request was affected while that redirection was in place. The condition is temporary. | +|
[50330](/docs/platform/errors/codes/50330-request-reached-the-wrong-cluster)
request_reached_the_wrong_cluster | Request reached the wrong cluster | The request arrived at a cluster that was not the one meant to handle it and should be retried. This can happen briefly during DNS changes while traffic is being migrated between clusters. | +|
[50410](/docs/platform/errors/codes/50410-edge-proxy-timed-out-waiting-for-platform)
edge_proxy_timed_out_waiting_for_platform | Edge proxy timed out waiting for platform | Ably's edge proxy service did not receive a response from the Ably platform behind it within the time allowed, so the request was abandoned. The condition is usually transient. | + +## 70xxx + +| Code | Title | Summary | +| --- | --- | --- | +|
[70000](/docs/platform/errors/codes/70000-integration-operation-failed)
integration_operation_failed | Integration operation failed | An integration could not complete an operation against its configured target. | +|
[70001](/docs/platform/errors/codes/70001-integration-invocation-failed)
integration_invocation_failed | Integration invocation failed | An integration could not invoke its configured target: Ably either could not reach the target, or reached it but could not deliver the data. The specific failure depends on the integration type and is named in the error message. | +|
[70002](/docs/platform/errors/codes/70002-integration-target-returned-an-error-status)
integration_target_returned_an_error_status | Integration target returned an error status | An integration invoked an HTTP target, such as a webhook, which replied with an HTTP status outside the successful 2xx range. Ably treats any non-2xx response as a failed delivery. | +|
[70003](/docs/platform/errors/codes/70003-too-many-concurrent-integration-requests)
too_many_concurrent_integration_requests | Too many concurrent integration requests | An integration was not invoked because the number of requests already in flight for it had reached the permitted maximum. This usually happens when a target responds more slowly than the rate at which matching messages arrive. | +|
[70004](/docs/platform/errors/codes/70004-integration-refused-to-process-a-message)
integration_refused_to_process_a_message | Integration refused to process a message | An integration reached its configured target, but the target did not accept the message because its contents were invalid or unsupported for that target type. | +|
[70005](/docs/platform/errors/codes/70005-amqp-message-delivery-timed-out)
amqp_message_delivery_timed_out | AMQP message delivery timed out | A message could not be delivered to an Ably message queue integration because the delivery did not complete within the allowed time. This usually points to the queue being unavailable or slow to accept the message. | +|
[70006](/docs/platform/errors/codes/70006-amqp-message-queue-busy)
amqp_message_queue_busy | AMQP message queue busy | A message could not be delivered to an Ably message queue integration because the message queue was too busy to accept it. This is usually transient and eases as load falls. | + +## 71xxx + +| Code | Title | Summary | +| --- | --- | --- | +|
[71000](/docs/platform/errors/codes/71000-exchange-error)
exchange_error | Exchange error | A request involving Ably Exchange failed for a reason that could not be attributed to a more specific cause. Exchange lets a publisher expose channels as a product that subscribers can receive. | +|
[71001](/docs/platform/errors/codes/71001-forced-re-attachment-after-permissions-change)
forced_re_attachment_after_permissions_change | Forced re-attachment after permissions change | An Exchange channel was detached and re-attached because the permissions governing access to it changed, so the existing attachment no longer reflected what the client was entitled to receive. | +|
[71100](/docs/platform/errors/codes/71100-exchange-publisher-error)
exchange_publisher_error | Exchange publisher error | A request involving an Exchange publisher failed for a reason that could not be attributed to a more specific cause. A publisher is the party that exposes channels as an Exchange product. | +|
[71101](/docs/platform/errors/codes/71101-publisher-not-found)
publisher_not_found | Publisher not found | The Exchange request referred to a publisher that does not exist. This usually means the publisher identifier was incorrect or the publisher is no longer available. | +|
[71102](/docs/platform/errors/codes/71102-publisher-not-enabled-for-exchange)
publisher_not_enabled_for_exchange | Publisher not enabled for Exchange | The request referred to a party that exists but has not been enabled as an Exchange publisher, so it cannot expose channels as a product for subscribers to receive. | +|
[71200](/docs/platform/errors/codes/71200-exchange-product-error)
exchange_product_error | Exchange product error | A request involving an Exchange product failed for a reason that could not be attributed to a more specific cause. A product is the set of channels a publisher exposes for subscribers to receive. | +|
[71201](/docs/platform/errors/codes/71201-product-not-found)
product_not_found | Product not found | The Exchange request referred to a product that does not exist. This usually means the product identifier was incorrect or the product is no longer available from the publisher. | +|
[71202](/docs/platform/errors/codes/71202-product-disabled)
product_disabled | Product disabled | The Exchange product exists but has been disabled by the publisher, so its channels are not currently available to subscribers. | +|
[71203](/docs/platform/errors/codes/71203-channel-not-part-of-product)
channel_not_part_of_product | Channel not part of product | The requested channel is not one of the channels that the Exchange product exposes, so it cannot be received through that product. | +|
[71204](/docs/platform/errors/codes/71204-forced-re-attachment-after-product-remapping)
forced_re_attachment_after_product_remapping | Forced re-attachment after product remapping | An Exchange channel was detached and re-attached because the product was remapped to a different channel namespace, so the existing attachment no longer pointed at the channel the product now exposes. | +|
[71300](/docs/platform/errors/codes/71300-exchange-subscription-error)
exchange_subscription_error | Exchange subscription error | A request involving an Exchange subscription failed for a reason that could not be attributed to a more specific cause. A subscription is what grants a subscriber access to a publisher's product. | +|
[71301](/docs/platform/errors/codes/71301-subscription-disabled)
subscription_disabled | Subscription disabled | The subscription to the Exchange product exists but has been disabled, so its channels are not currently available to the subscriber. | +|
[71302](/docs/platform/errors/codes/71302-no-subscription-to-product)
no_subscription_to_product | No subscription to product | The requester attempted to receive an Exchange product they are not subscribed to. Access to a product's channels requires an active subscription to that product. | +|
[71303](/docs/platform/errors/codes/71303-channel-outside-subscription-filter)
channel_outside_subscription_filter | Channel outside subscription filter | The requested channel does not match the channel filter defined for the subscription to the Exchange product, so it falls outside the set of channels that subscription grants access to. | + +## 72xxx + +| Code | Title | Summary | +| --- | --- | --- | +|
[72000](/docs/platform/errors/codes/72000-livesync-operation-failed)
livesync_operation_failed | LiveSync connector operation failed | A LiveSync database connector hit an unexpected error while running, so the operation it was attempting did not complete. | +|
[72001](/docs/platform/errors/codes/72001-livesync-publish-failed)
livesync_publish_failed | LiveSync connector could not publish | A LiveSync database connector read a change from the database but could not publish the resulting message to Ably. The change may not have reached the channel it was destined for. | +|
[72002](/docs/platform/errors/codes/72002-livesync-table-unhealthy)
livesync_table_unhealthy | LiveSync database connector is unhealthy | A LiveSync database connector could not read from the table or collection it is configured to use, because that table or collection is missing, renamed, or no longer accessible to the connector. | +|
[72003](/docs/platform/errors/codes/72003-livesync-cannot-connect-db)
livesync_cannot_connect_db | LiveSync connector cannot reach the database | A LiveSync database connector could not establish a connection to the database it reads from. This often points to the database being unreachable, or to incorrect connection details or credentials in the connector configuration. | +|
[72004](/docs/platform/errors/codes/72004-livesync-no-channel-key)
livesync_no_channel_key | LiveSync connector could not identify target channel | A LiveSync database connector read a change but could not determine which channel to publish it to, because the change had no _ablyChannel field. Only changes that specify a channel can be published. | +|
[72005](/docs/platform/errors/codes/72005-livesync-invalid-pipeline)
livesync_invalid_pipeline | LiveSync MongoDB pipeline is invalid | A LiveSync MongoDB connector could not start because the aggregation pipeline in its configuration was not accepted by MongoDB, for example because it references a stage or field that is not allowed. | +|
[72006](/docs/platform/errors/codes/72006-livesync-cannot-resume)
livesync_cannot_resume | LiveSync connector failed to resume | A LiveSync MongoDB connector could not resume its change stream from where it left off. It stores a resume token to continue after a restart, and this arises when that stored position cannot be read back. | +|
[72007](/docs/platform/errors/codes/72007-livesync-cannot-store-resume-token)
livesync_cannot_store_resume_token | LiveSync connector failed to track its position | A LiveSync MongoDB connector could not save its change-stream resume token to the database. The token records how far the connector has read, so that it can continue from the same point after a restart. | +|
[72008](/docs/platform/errors/codes/72008-livesync-change-stream-history-lost)
livesync_change_stream_history_lost | LiveSync connector failed to read history | A LiveSync MongoDB connector's change stream could no longer continue from its last recorded position, because the history it needed was no longer available in the database. Changes made in the intervening period may have been missed. | + +## 80xxx + +| Code | Title | Summary | +| --- | --- | --- | +|
[80000](/docs/platform/errors/codes/80000-connection-failed)
connection_failed | Connection failed | The connection moved to the failed state, a terminal condition from which the SDK does not automatically reconnect. It differs from a temporary disconnection, where the SDK keeps retrying to restore the connection on its own. | +|
[80001](/docs/platform/errors/codes/80001-connection-failed-no-transport)
connection_failed_no_transport | Connection failed as no usable transport available | No usable transport could be established to carry the connection, for example when the network blocks both WebSocket and the HTTP-based fallbacks. | +|
[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. | +|
[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. | +|
[80009](/docs/platform/errors/codes/80009-connection-not-established)
connection_not_established | Connection not established | An operation that requires an open connection was attempted while the client was not connected. | +|
[80010](/docs/platform/errors/codes/80010-invalid-operation-on-the-connection)
invalid_operation_on_the_connection | Invalid operation on the connection | An operation was attempted on a connection that was not in a valid state to carry it, such as one that had already been closed or replaced. | +|
[80011](/docs/platform/errors/codes/80011-connection-incompatible-auth-params)
connection_incompatible_auth_params | Connection state recovery failed due to incompatible auth | A dropped connection could not be recovered because the authentication details presented on the new connection did not match those of the original, so the previous connection could not be continued. | +|
[80012](/docs/platform/errors/codes/80012-connection-invalid-serial)
connection_invalid_serial | Connection continuity not guaranteed as serial was invalid | A connection was resumed without a valid connection serial to identify the point it had reached, so there was no reliable position to continue from. The connection continues, but continuity across the gap is not guaranteed. | +|
[80013](/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. | +|
[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. | +|
[80020](/docs/platform/errors/codes/80020-connection-discontinuity-message-rate-exceeded)
connection_discontinuity_message_rate_exceeded | Continuity lost as message delivery rate exceeded | Messages were dropped because they were being delivered to the connection faster than its per-connection rate limit allows. Continuity is lost on the affected channels: they keep receiving new messages, but the dropped ones are not redelivered. | +|
[80021](/docs/platform/errors/codes/80021-rate-limit-exceeded-account-connection-creation)
rate_limit_exceeded_account_connection_creation | Account-wide connection creation rate exceeded | A connection was refused because new connections were being opened across the account faster than the permitted rate. The limit applies to the account as a whole rather than to any single connection. | +|
[80022](/docs/platform/errors/codes/80022-connection-not-found)
connection_not_found | Connection not found | A request referred to a connection that the server could not find, so the exchange could not continue and the client is signaled to reconnect. This is a lookup failure, not a loss of message continuity. | +|
[80023](/docs/platform/errors/codes/80023-connection-re-established-in-a-different-region)
connection_re_established_in_a_different_region | Connection re-established in a different region | The client reconnected to a different Ably region from the one it was using, so it could not keep its connection ID and was given a new one. | +|
[80024](/docs/platform/errors/codes/80024-outdated-ably-sdk-version)
outdated_ably_sdk_version | Outdated Ably SDK version | The connecting Ably SDK is an old version, and the way it connects to Ably is being retired. Connections from these SDK versions increasingly fail until they can no longer connect. | +|
[80030](/docs/platform/errors/codes/80030-client-restriction-not-satisfied)
client_restriction_not_satisfied | Connection failed due to a client restriction | The connection was refused because a restriction placed on the client was not met. Restrictions can limit which clients are allowed to connect based on conditions set for the application. | + +## 90xxx + +| Code | Title | Summary | +| --- | --- | --- | +|
[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. | +|
[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. | +|
[90006](/docs/platform/errors/codes/90006-channel-history-request-had-no-limit)
channel_history_request_had_no_limit | Channel history request had no limit | A request for a channel's message history could not be served because it asked for the complete history with no limit on how many messages to return. | +|
[90007](/docs/platform/errors/codes/90007-channel-operation-timed-out)
channel_operation_timed_out | Channel operation timed out | A channel attach or detach did not complete within the expected time because no response was received from Ably. The operation may not have taken effect, and is usually the result of a transient interruption. | +|
[90008](/docs/platform/errors/codes/90008-attach-point-not-found)
attach_point_not_found | Attach point too old for untilAttach history | A history request using untilAttach relies on the channel's attach point still being among recent messages. In this case it was not, so the request could not be served and no messages were returned. | +|
[90009](/docs/platform/errors/codes/90009-subscribe-mode-not-enabled)
subscribe_mode_not_enabled | Subscribe operation failed as subscribe mode not enabled | Messages could not be delivered to a subscriber because the channel had not requested the subscribe mode in its channel options. Messages are only delivered to clients that request that mode, so the listener never fires. | +|
[90010](/docs/platform/errors/codes/90010-too-many-channels)
too_many_channels | Too many channels | An operation was rejected because it would exceed the maximum number of channels permitted, either the channels attached to a single connection or those included in a single batch request. | +|
[90021](/docs/platform/errors/codes/90021-rate-limit-exceeded-account-channel-creation)
rate_limit_exceeded_account_channel_creation | Account-wide channel creation rate exceeded | 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. | + +## 91xxx + +| Code | Title | Summary | +| --- | --- | --- | +|
[91000](/docs/platform/errors/codes/91000-cannot-enter-presence-without-a-client-id)
cannot_enter_presence_without_a_client_id | Cannot enter presence without a clientId | A request to enter the presence set was rejected because the connection had no clientId. Presence members are identified by their clientId, so one is required to enter. | +|
[91001](/docs/platform/errors/codes/91001-cannot-enter-presence-in-the-channels-current-state)
cannot_enter_presence_in_the_channels_current_state | Cannot enter presence in the channel's current state | A request to enter the presence set was rejected because the channel was not in a state that permits presence operations, such as a channel that is detached, suspended, or failed. | +|
[91002](/docs/platform/errors/codes/91002-cannot-leave-presence-that-was-never-entered)
cannot_leave_presence_that_was_never_entered | Cannot leave presence that was never entered | A request to leave the presence set was rejected because the clientId was not a member of it. | +|
[91003](/docs/platform/errors/codes/91003-too-many-presence-members)
too_many_presence_members | Too many presence members | A request to enter the presence set was rejected because the channel already held the maximum number of presence members permitted. The limit counts the members present on a single channel. | +|
[91004](/docs/platform/errors/codes/91004-unable-to-automatically-re-enter-presence)
unable_to_automatically_re_enter_presence | Unable to automatically re-enter presence | After reconnecting, the Ably SDK tried to re-enter the presence set on the client's behalf but the attempt did not succeed, so the member was not restored to the presence set. | +|
[91005](/docs/platform/errors/codes/91005-presence-state-out-of-sync)
presence_state_out_of_sync | Presence state out of sync | The presence set held by the client no longer matched the state on Ably. The presence members are re-synchronized so the two are brought back into agreement. | +|
[91006](/docs/platform/errors/codes/91006-total-presence-set-data-too-large)
total_presence_set_data_too_large | Total presence set data too large | A request to enter the presence set was rejected because the combined size of the data held by members on the channel would exceed the maximum permitted for the presence set. | +|
[91007](/docs/platform/errors/codes/91007-unexpected-loss-of-presence-membership)
unexpected_loss_of_presence_membership | Unexpected loss of presence membership | The connection was removed from the presence set despite still being active, so the channel was detached to prompt the Ably SDK to automatically re-enter presence. The condition is usually transient. | +|
[91008](/docs/platform/errors/codes/91008-presence-subscribe-mode-not-enabled)
presence_subscribe_mode_not_enabled | Presence operation failed as presence_subscribe mode not enabled | The presence members of a channel could not be retrieved because the channel had not requested the presence_subscribe mode in its channel options. Presence state is only delivered to clients that request that mode. | +|
[91100](/docs/platform/errors/codes/91100-presence-member-left-as-their-connection-closed)
presence_member_left_as_their_connection_closed | Presence member left as their connection closed | A presence member was removed from the presence set because it was no longer present, usually because the connection it entered on was closed. | + +## 92xxx + +| 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. | +|
[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. | +|
[92005](/docs/platform/errors/codes/92005-no-objects-at-path)
no_objects_at_path | LiveObjects path matched no objects | A LiveObjects operation specified a path within an object tree that did not resolve to any object. The path may be incorrect, or the objects it points to may not exist. | +|
[92006](/docs/platform/errors/codes/92006-object-operation-missing-identifier-or-path)
object_operation_missing_identifier_or_path | LiveObjects operation missing object reference | A LiveObjects operation could not be performed because it specified neither an object identifier nor a path. | +|
[92007](/docs/platform/errors/codes/92007-object-operation-path-not-processable)
object_operation_path_not_processable | LiveObjects operation not valid for the path | A LiveObjects operation could not be applied to the object at the specified path, because the operation is not compatible with the kind of object found there. | +|
[92008](/docs/platform/errors/codes/92008-objects-sync-did-not-complete)
objects_sync_did_not_complete | LiveObjects sync did not complete | A LiveObjects operation could not be applied because the channel had not finished synchronizing its objects. | + +## 93xxx + +| 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. | + +## 101xxx + +| Code | Title | Summary | +| --- | --- | --- | +|
[101000](/docs/platform/errors/codes/101000-space-name-is-empty)
space_name_is_empty | Space name is empty | A space could not be created or referenced because no name was supplied. | +|
[101001](/docs/platform/errors/codes/101001-space-must-be-entered-first)
space_must_be_entered_first | Space must be entered first | An operation was attempted that requires having first entered the space. In Ably Spaces, actions such as updating a member's location or profile are only available once the space has been entered. | +|
[101002](/docs/platform/errors/codes/101002-lock-request-already-pending)
lock_request_already_pending | Lock request already pending | A lock could not be requested because a request for the same lock is already in progress. In Ably Spaces, a member may only have one outstanding request for a given lock at a time. | +|
[101003](/docs/platform/errors/codes/101003-lock-already-held)
lock_already_held | Lock already held | A lock could not be acquired because it is currently held by another member. In Ably Spaces, only one member can hold a given lock at a time, and it must be released before another can take it. | +|
[101004](/docs/platform/errors/codes/101004-lock-invalidated-by-concurrent-request)
lock_invalidated_by_concurrent_request | Lock invalidated by concurrent request | A lock that appeared to be acquired was invalidated because another member requested the same lock concurrently and now holds it. | + +## 102xxx + +| Code | Title | Summary | +| --- | --- | --- | +|
[102000](/docs/platform/errors/codes/102000-invalid-chat-room-name)
invalid_chat_room_name | Invalid chat room name | A Chat room could not be used because the name supplied for it was not valid. | +|
[102001](/docs/platform/errors/codes/102001-room-attach-failed-for-messages)
room_attach_failed_for_messages | Room attach failed for messages | Attaching a Chat room failed because its messages feature could not be attached. | +|
[102002](/docs/platform/errors/codes/102002-room-attach-failed-for-presence)
room_attach_failed_for_presence | Room attach failed for presence | Attaching a Chat room failed because its presence feature could not be attached. | +|
[102003](/docs/platform/errors/codes/102003-room-attach-failed-for-reactions)
room_attach_failed_for_reactions | Room attach failed for reactions | Attaching a Chat room failed because its reactions feature could not be attached. | +|
[102004](/docs/platform/errors/codes/102004-room-attach-failed-for-occupancy)
room_attach_failed_for_occupancy | Room attach failed for occupancy | Attaching a Chat room failed because its occupancy feature could not be attached. | +|
[102005](/docs/platform/errors/codes/102005-room-attach-failed-for-typing)
room_attach_failed_for_typing | Room attach failed for typing | Attaching a Chat room failed because its typing feature could not be attached. | +|
[102050](/docs/platform/errors/codes/102050-room-detach-failed-for-messages)
room_detach_failed_for_messages | Room detach failed for messages | Detaching a Chat room failed because its messages feature could not be detached. | +|
[102051](/docs/platform/errors/codes/102051-room-detach-failed-for-presence)
room_detach_failed_for_presence | Room detach failed for presence | Detaching a Chat room failed because its presence feature could not be detached. | +|
[102052](/docs/platform/errors/codes/102052-room-detach-failed-for-reactions)
room_detach_failed_for_reactions | Room detach failed for reactions | Detaching a Chat room failed because its reactions feature could not be detached. | +|
[102053](/docs/platform/errors/codes/102053-room-detach-failed-for-occupancy)
room_detach_failed_for_occupancy | Room detach failed for occupancy | Detaching a Chat room failed because its occupancy feature could not be detached. | +|
[102054](/docs/platform/errors/codes/102054-room-detach-failed-for-typing)
room_detach_failed_for_typing | Room detach failed for typing | Detaching a Chat room failed because its typing feature could not be detached. | +|
[102100](/docs/platform/errors/codes/102100-room-continuity-not-guaranteed)
room_continuity_not_guaranteed | Room continuity not guaranteed | A discontinuity was detected on the Chat room, so the continuity of messages could not be guaranteed. This usually follows a disconnection long enough that the room could not resume from where it left off. | +|
[102101](/docs/platform/errors/codes/102101-room-is-in-the-failed-state)
room_is_in_the_failed_state | Room is in the failed state | The operation could not be performed because the Chat room is in the failed state. A room enters this state when an earlier operation on it failed and could not recover. | +|
[102102](/docs/platform/errors/codes/102102-room-is-being-released)
room_is_being_released | Room is being released | The operation could not be performed because the Chat room is in the process of being released. | +|
[102103](/docs/platform/errors/codes/102103-room-has-been-released)
room_has_been_released | Room has been released | The operation could not be performed because the Chat room has already been released. | +|
[102104](/docs/platform/errors/codes/102104-room-operation-failed-after-earlier-attempt)
room_operation_failed_after_earlier_attempt | Room operation failed after earlier attempt | The operation failed because a preceding attempt to perform it had already failed. | +|
[102105](/docs/platform/errors/codes/102105-unknown-room-lifecycle-error)
unknown_room_lifecycle_error | Unknown room lifecycle error | An unexpected error occurred in the Chat room lifecycle that does not correspond to a known condition. | +|
[102106](/docs/platform/errors/codes/102106-room-released-before-operation-completed)
room_released_before_operation_completed | Room released before operation completed | The operation could not complete because the Chat room was released while it was still in progress. | +|
[102107](/docs/platform/errors/codes/102107-room-already-exists-with-different-options)
room_already_exists_with_different_options | Room already exists with different options | A Chat room with the same name already exists but was created with different options. A room must be released before it can be requested again with a different configuration. | +|
[102108](/docs/platform/errors/codes/102108-feature-not-enabled-in-room-options)
feature_not_enabled_in_room_options | Feature not enabled in room options | The operation required a feature that was not enabled when the Chat room was created. Features such as presence or typing indicators must be enabled in the room options to be used. | +|
[102109](/docs/platform/errors/codes/102109-history-requested-for-an-unsubscribed-listener)
history_requested_for_an_unsubscribed_listener | History requested for an unsubscribed listener | A request for the messages published before a listener's subscription point was rejected because that listener was not subscribed. This history is only available while the listener is subscribed to the room. | +|
[102110](/docs/platform/errors/codes/102110-channel-serial-not-defined)
channel_serial_not_defined | Channel serial not defined | A channel serial was expected but was not defined at the point it was needed. | +|
[102111](/docs/platform/errors/codes/102111-channel-options-modified-after-request)
channel_options_modified_after_request | Channel options modified after request | Channel options could not be changed because the underlying channel had already been requested. | +|
[102112](/docs/platform/errors/codes/102112-room-is-in-an-invalid-state)
room_is_in_an_invalid_state | Room is in an invalid state | The operation could not be performed because the Chat room was in a state that does not permit it. | +|
[102113](/docs/platform/errors/codes/102113-sequential-execution-could-not-be-enforced)
sequential_execution_could_not_be_enforced | Sequential execution could not be enforced | The operation failed because its sequential execution could not be enforced. Chat room lifecycle operations are expected to run one at a time, and that ordering could not be guaranteed. | +|
[102200](/docs/platform/errors/codes/102200-hook-used-outside-its-provider)
hook_used_outside_its_provider | Hook used outside its provider | An Ably Chat React hook was used in a component that is not wrapped in the required provider. The hooks depend on context supplied by a provider higher in the component tree. | +|
[102201](/docs/platform/errors/codes/102201-component-unmounted-before-completion)
component_unmounted_before_completion | Component unmounted before completion | An operation started by the Ably Chat React hooks could not finish because the React component was unmounted while it was still in progress. | +|
[102202](/docs/platform/errors/codes/102202-presence-data-could-not-be-fetched)
presence_data_could_not_be_fetched | Presence data could not be fetched | The Ably Chat React hooks could not retrieve presence data after the maximum number of retries. This usually points to a persistent problem reaching presence rather than a transient one. | + +## 103xxx + +| 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. | +|
[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. | +|
[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 new file mode 100644 index 0000000000..cc8d5e9fc6 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/10000-no-error.mdx @@ -0,0 +1,11 @@ +--- +title: "10000: No error" +meta_description: "A placeholder code indicating success, used where an error code is expected but the operation completed normally. It does not represent a failure." +identifier: "no_error" +redirect_from: + - "/docs/platform/errors/codes/10000" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..14e34b405e --- /dev/null +++ b/src/pages/docs/platform/errors/codes/101000-space-name-is-empty.mdx @@ -0,0 +1,11 @@ +--- +title: "101000: Space name is empty" +meta_description: "A space could not be created or referenced because no name was supplied." +identifier: "space_name_is_empty" +redirect_from: + - "/docs/platform/errors/codes/101000" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..269d885057 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/101001-space-must-be-entered-first.mdx @@ -0,0 +1,11 @@ +--- +title: "101001: Space must be entered first" +meta_description: "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." +identifier: "space_must_be_entered_first" +redirect_from: + - "/docs/platform/errors/codes/101001" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..1cc900f933 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/101002-lock-request-already-pending.mdx @@ -0,0 +1,11 @@ +--- +title: "101002: Lock request already pending" +meta_description: "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." +identifier: "lock_request_already_pending" +redirect_from: + - "/docs/platform/errors/codes/101002" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..415e3e68ef --- /dev/null +++ b/src/pages/docs/platform/errors/codes/101003-lock-already-held.mdx @@ -0,0 +1,11 @@ +--- +title: "101003: Lock already held" +meta_description: "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." +identifier: "lock_already_held" +redirect_from: + - "/docs/platform/errors/codes/101003" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..4e08820b47 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/101004-lock-invalidated-by-concurrent-request.mdx @@ -0,0 +1,11 @@ +--- +title: "101004: Lock invalidated by concurrent request" +meta_description: "A lock that appeared to be acquired was invalidated because another member requested the same lock concurrently and now holds it." +identifier: "lock_invalidated_by_concurrent_request" +redirect_from: + - "/docs/platform/errors/codes/101004" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/102000-invalid-chat-room-name.mdx b/src/pages/docs/platform/errors/codes/102000-invalid-chat-room-name.mdx new file mode 100644 index 0000000000..e0680f2bb7 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102000-invalid-chat-room-name.mdx @@ -0,0 +1,11 @@ +--- +title: "102000: Invalid chat room name" +meta_description: "A Chat room could not be used because the name supplied for it was not valid." +identifier: "invalid_chat_room_name" +redirect_from: + - "/docs/platform/errors/codes/102000" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102000.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A Chat room could not be used because the name supplied for it was not valid. diff --git a/src/pages/docs/platform/errors/codes/102001-room-attach-failed-for-messages.mdx b/src/pages/docs/platform/errors/codes/102001-room-attach-failed-for-messages.mdx new file mode 100644 index 0000000000..9a8f9e4922 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102001-room-attach-failed-for-messages.mdx @@ -0,0 +1,11 @@ +--- +title: "102001: Room attach failed for messages" +meta_description: "Attaching a Chat room failed because its messages feature could not be attached." +identifier: "room_attach_failed_for_messages" +redirect_from: + - "/docs/platform/errors/codes/102001" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102001.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +Attaching a Chat room failed because its messages feature could not be attached. diff --git a/src/pages/docs/platform/errors/codes/102002-room-attach-failed-for-presence.mdx b/src/pages/docs/platform/errors/codes/102002-room-attach-failed-for-presence.mdx new file mode 100644 index 0000000000..2980622cd1 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102002-room-attach-failed-for-presence.mdx @@ -0,0 +1,11 @@ +--- +title: "102002: Room attach failed for presence" +meta_description: "Attaching a Chat room failed because its presence feature could not be attached." +identifier: "room_attach_failed_for_presence" +redirect_from: + - "/docs/platform/errors/codes/102002" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102002.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +Attaching a Chat room failed because its presence feature could not be attached. diff --git a/src/pages/docs/platform/errors/codes/102003-room-attach-failed-for-reactions.mdx b/src/pages/docs/platform/errors/codes/102003-room-attach-failed-for-reactions.mdx new file mode 100644 index 0000000000..3d1b8894f7 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102003-room-attach-failed-for-reactions.mdx @@ -0,0 +1,11 @@ +--- +title: "102003: Room attach failed for reactions" +meta_description: "Attaching a Chat room failed because its reactions feature could not be attached." +identifier: "room_attach_failed_for_reactions" +redirect_from: + - "/docs/platform/errors/codes/102003" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102003.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +Attaching a Chat room failed because its reactions feature could not be attached. diff --git a/src/pages/docs/platform/errors/codes/102004-room-attach-failed-for-occupancy.mdx b/src/pages/docs/platform/errors/codes/102004-room-attach-failed-for-occupancy.mdx new file mode 100644 index 0000000000..e3ea57b588 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102004-room-attach-failed-for-occupancy.mdx @@ -0,0 +1,11 @@ +--- +title: "102004: Room attach failed for occupancy" +meta_description: "Attaching a Chat room failed because its occupancy feature could not be attached." +identifier: "room_attach_failed_for_occupancy" +redirect_from: + - "/docs/platform/errors/codes/102004" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102004.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +Attaching a Chat room failed because its occupancy feature could not be attached. diff --git a/src/pages/docs/platform/errors/codes/102005-room-attach-failed-for-typing.mdx b/src/pages/docs/platform/errors/codes/102005-room-attach-failed-for-typing.mdx new file mode 100644 index 0000000000..cfe00baaa3 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102005-room-attach-failed-for-typing.mdx @@ -0,0 +1,11 @@ +--- +title: "102005: Room attach failed for typing" +meta_description: "Attaching a Chat room failed because its typing feature could not be attached." +identifier: "room_attach_failed_for_typing" +redirect_from: + - "/docs/platform/errors/codes/102005" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102005.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +Attaching a Chat room failed because its typing feature could not be attached. diff --git a/src/pages/docs/platform/errors/codes/102050-room-detach-failed-for-messages.mdx b/src/pages/docs/platform/errors/codes/102050-room-detach-failed-for-messages.mdx new file mode 100644 index 0000000000..95714c645c --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102050-room-detach-failed-for-messages.mdx @@ -0,0 +1,11 @@ +--- +title: "102050: Room detach failed for messages" +meta_description: "Detaching a Chat room failed because its messages feature could not be detached." +identifier: "room_detach_failed_for_messages" +redirect_from: + - "/docs/platform/errors/codes/102050" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102050.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +Detaching a Chat room failed because its messages feature could not be detached. diff --git a/src/pages/docs/platform/errors/codes/102051-room-detach-failed-for-presence.mdx b/src/pages/docs/platform/errors/codes/102051-room-detach-failed-for-presence.mdx new file mode 100644 index 0000000000..e1f2ac1d4b --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102051-room-detach-failed-for-presence.mdx @@ -0,0 +1,11 @@ +--- +title: "102051: Room detach failed for presence" +meta_description: "Detaching a Chat room failed because its presence feature could not be detached." +identifier: "room_detach_failed_for_presence" +redirect_from: + - "/docs/platform/errors/codes/102051" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102051.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +Detaching a Chat room failed because its presence feature could not be detached. diff --git a/src/pages/docs/platform/errors/codes/102052-room-detach-failed-for-reactions.mdx b/src/pages/docs/platform/errors/codes/102052-room-detach-failed-for-reactions.mdx new file mode 100644 index 0000000000..5b4926f3e7 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102052-room-detach-failed-for-reactions.mdx @@ -0,0 +1,11 @@ +--- +title: "102052: Room detach failed for reactions" +meta_description: "Detaching a Chat room failed because its reactions feature could not be detached." +identifier: "room_detach_failed_for_reactions" +redirect_from: + - "/docs/platform/errors/codes/102052" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102052.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +Detaching a Chat room failed because its reactions feature could not be detached. diff --git a/src/pages/docs/platform/errors/codes/102053-room-detach-failed-for-occupancy.mdx b/src/pages/docs/platform/errors/codes/102053-room-detach-failed-for-occupancy.mdx new file mode 100644 index 0000000000..43d6c42ec7 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102053-room-detach-failed-for-occupancy.mdx @@ -0,0 +1,11 @@ +--- +title: "102053: Room detach failed for occupancy" +meta_description: "Detaching a Chat room failed because its occupancy feature could not be detached." +identifier: "room_detach_failed_for_occupancy" +redirect_from: + - "/docs/platform/errors/codes/102053" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102053.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +Detaching a Chat room failed because its occupancy feature could not be detached. diff --git a/src/pages/docs/platform/errors/codes/102054-room-detach-failed-for-typing.mdx b/src/pages/docs/platform/errors/codes/102054-room-detach-failed-for-typing.mdx new file mode 100644 index 0000000000..ae67f2583e --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102054-room-detach-failed-for-typing.mdx @@ -0,0 +1,11 @@ +--- +title: "102054: Room detach failed for typing" +meta_description: "Detaching a Chat room failed because its typing feature could not be detached." +identifier: "room_detach_failed_for_typing" +redirect_from: + - "/docs/platform/errors/codes/102054" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102054.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +Detaching a Chat room failed because its typing feature could not be detached. diff --git a/src/pages/docs/platform/errors/codes/102100-room-continuity-not-guaranteed.mdx b/src/pages/docs/platform/errors/codes/102100-room-continuity-not-guaranteed.mdx new file mode 100644 index 0000000000..3a34942d22 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102100-room-continuity-not-guaranteed.mdx @@ -0,0 +1,11 @@ +--- +title: "102100: Room continuity not guaranteed" +meta_description: "A discontinuity was detected on the Chat room, so the continuity of messages could not be guaranteed. This usually follows a disconnection long enough that the room could not resume from where it left off." +identifier: "room_continuity_not_guaranteed" +redirect_from: + - "/docs/platform/errors/codes/102100" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102100.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A discontinuity was detected on the Chat room, so the continuity of messages could not be guaranteed. This usually follows a disconnection long enough that the room could not resume from where it left off. diff --git a/src/pages/docs/platform/errors/codes/102101-room-is-in-the-failed-state.mdx b/src/pages/docs/platform/errors/codes/102101-room-is-in-the-failed-state.mdx new file mode 100644 index 0000000000..0ecccb7923 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102101-room-is-in-the-failed-state.mdx @@ -0,0 +1,11 @@ +--- +title: "102101: Room is in the failed state" +meta_description: "The operation could not be performed because the Chat room is in the failed state. A room enters this state when an earlier operation on it failed and could not recover." +identifier: "room_is_in_the_failed_state" +redirect_from: + - "/docs/platform/errors/codes/102101" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102101.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The operation could not be performed because the Chat room is in the failed state. A room enters this state when an earlier operation on it failed and could not recover. diff --git a/src/pages/docs/platform/errors/codes/102102-room-is-being-released.mdx b/src/pages/docs/platform/errors/codes/102102-room-is-being-released.mdx new file mode 100644 index 0000000000..7858897b29 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102102-room-is-being-released.mdx @@ -0,0 +1,11 @@ +--- +title: "102102: Room is being released" +meta_description: "The operation could not be performed because the Chat room is in the process of being released." +identifier: "room_is_being_released" +redirect_from: + - "/docs/platform/errors/codes/102102" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102102.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The operation could not be performed because the Chat room is in the process of being released. diff --git a/src/pages/docs/platform/errors/codes/102103-room-has-been-released.mdx b/src/pages/docs/platform/errors/codes/102103-room-has-been-released.mdx new file mode 100644 index 0000000000..bd96e5ee67 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102103-room-has-been-released.mdx @@ -0,0 +1,11 @@ +--- +title: "102103: Room has been released" +meta_description: "The operation could not be performed because the Chat room has already been released." +identifier: "room_has_been_released" +redirect_from: + - "/docs/platform/errors/codes/102103" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102103.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The operation could not be performed because the Chat room has already been released. diff --git a/src/pages/docs/platform/errors/codes/102104-room-operation-failed-after-earlier-attempt.mdx b/src/pages/docs/platform/errors/codes/102104-room-operation-failed-after-earlier-attempt.mdx new file mode 100644 index 0000000000..1ce148ead7 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102104-room-operation-failed-after-earlier-attempt.mdx @@ -0,0 +1,11 @@ +--- +title: "102104: Room operation failed after earlier attempt" +meta_description: "The operation failed because a preceding attempt to perform it had already failed." +identifier: "room_operation_failed_after_earlier_attempt" +redirect_from: + - "/docs/platform/errors/codes/102104" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102104.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The operation failed because a preceding attempt to perform it had already failed. diff --git a/src/pages/docs/platform/errors/codes/102105-unknown-room-lifecycle-error.mdx b/src/pages/docs/platform/errors/codes/102105-unknown-room-lifecycle-error.mdx new file mode 100644 index 0000000000..c0f8c6da11 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102105-unknown-room-lifecycle-error.mdx @@ -0,0 +1,11 @@ +--- +title: "102105: Unknown room lifecycle error" +meta_description: "An unexpected error occurred in the Chat room lifecycle that does not correspond to a known condition." +identifier: "unknown_room_lifecycle_error" +redirect_from: + - "/docs/platform/errors/codes/102105" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102105.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +An unexpected error occurred in the Chat room lifecycle that does not correspond to a known condition. diff --git a/src/pages/docs/platform/errors/codes/102106-room-released-before-operation-completed.mdx b/src/pages/docs/platform/errors/codes/102106-room-released-before-operation-completed.mdx new file mode 100644 index 0000000000..ba5a19a727 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102106-room-released-before-operation-completed.mdx @@ -0,0 +1,11 @@ +--- +title: "102106: Room released before operation completed" +meta_description: "The operation could not complete because the Chat room was released while it was still in progress." +identifier: "room_released_before_operation_completed" +redirect_from: + - "/docs/platform/errors/codes/102106" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102106.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The operation could not complete because the Chat room was released while it was still in progress. diff --git a/src/pages/docs/platform/errors/codes/102107-room-already-exists-with-different-options.mdx b/src/pages/docs/platform/errors/codes/102107-room-already-exists-with-different-options.mdx new file mode 100644 index 0000000000..b34c8030d8 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102107-room-already-exists-with-different-options.mdx @@ -0,0 +1,11 @@ +--- +title: "102107: Room already exists with different options" +meta_description: "A Chat room with the same name already exists but was created with different options. A room must be released before it can be requested again with a different configuration." +identifier: "room_already_exists_with_different_options" +redirect_from: + - "/docs/platform/errors/codes/102107" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102107.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A Chat room with the same name already exists but was created with different options. A room must be released before it can be requested again with a different configuration. diff --git a/src/pages/docs/platform/errors/codes/102108-feature-not-enabled-in-room-options.mdx b/src/pages/docs/platform/errors/codes/102108-feature-not-enabled-in-room-options.mdx new file mode 100644 index 0000000000..039a78a0fa --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102108-feature-not-enabled-in-room-options.mdx @@ -0,0 +1,11 @@ +--- +title: "102108: Feature not enabled in room options" +meta_description: "The operation required a feature that was not enabled when the Chat room was created. Features such as presence or typing indicators must be enabled in the room options to be used." +identifier: "feature_not_enabled_in_room_options" +redirect_from: + - "/docs/platform/errors/codes/102108" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102108.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The operation required a feature that was not enabled when the Chat room was created. Features such as presence or typing indicators must be enabled in the room options to be used. diff --git a/src/pages/docs/platform/errors/codes/102109-history-requested-for-an-unsubscribed-listener.mdx b/src/pages/docs/platform/errors/codes/102109-history-requested-for-an-unsubscribed-listener.mdx new file mode 100644 index 0000000000..cdb6072d60 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102109-history-requested-for-an-unsubscribed-listener.mdx @@ -0,0 +1,11 @@ +--- +title: "102109: History requested for an unsubscribed listener" +meta_description: "A request for the messages published before a listener's subscription point was rejected because that listener was not subscribed. This history is only available while the listener is subscribed to the room." +identifier: "history_requested_for_an_unsubscribed_listener" +redirect_from: + - "/docs/platform/errors/codes/102109" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102109.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A request for the messages published before a listener's subscription point was rejected because that listener was not subscribed. This history is only available while the listener is subscribed to the room. diff --git a/src/pages/docs/platform/errors/codes/102110-channel-serial-not-defined.mdx b/src/pages/docs/platform/errors/codes/102110-channel-serial-not-defined.mdx new file mode 100644 index 0000000000..a40315a880 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102110-channel-serial-not-defined.mdx @@ -0,0 +1,11 @@ +--- +title: "102110: Channel serial not defined" +meta_description: "A channel serial was expected but was not defined at the point it was needed." +identifier: "channel_serial_not_defined" +redirect_from: + - "/docs/platform/errors/codes/102110" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102110.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A channel serial was expected but was not defined at the point it was needed. diff --git a/src/pages/docs/platform/errors/codes/102111-channel-options-modified-after-request.mdx b/src/pages/docs/platform/errors/codes/102111-channel-options-modified-after-request.mdx new file mode 100644 index 0000000000..19b9d8ae08 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102111-channel-options-modified-after-request.mdx @@ -0,0 +1,11 @@ +--- +title: "102111: Channel options modified after request" +meta_description: "Channel options could not be changed because the underlying channel had already been requested." +identifier: "channel_options_modified_after_request" +redirect_from: + - "/docs/platform/errors/codes/102111" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102111.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +Channel options could not be changed because the underlying channel had already been requested. diff --git a/src/pages/docs/platform/errors/codes/102112-room-is-in-an-invalid-state.mdx b/src/pages/docs/platform/errors/codes/102112-room-is-in-an-invalid-state.mdx new file mode 100644 index 0000000000..1e05c391fe --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102112-room-is-in-an-invalid-state.mdx @@ -0,0 +1,11 @@ +--- +title: "102112: Room is in an invalid state" +meta_description: "The operation could not be performed because the Chat room was in a state that does not permit it." +identifier: "room_is_in_an_invalid_state" +redirect_from: + - "/docs/platform/errors/codes/102112" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102112.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The operation could not be performed because the Chat room was in a state that does not permit it. diff --git a/src/pages/docs/platform/errors/codes/102113-sequential-execution-could-not-be-enforced.mdx b/src/pages/docs/platform/errors/codes/102113-sequential-execution-could-not-be-enforced.mdx new file mode 100644 index 0000000000..b6a0b1b4b1 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102113-sequential-execution-could-not-be-enforced.mdx @@ -0,0 +1,11 @@ +--- +title: "102113: Sequential execution could not be enforced" +meta_description: "The operation failed because its sequential execution could not be enforced. Chat room lifecycle operations are expected to run one at a time, and that ordering could not be guaranteed." +identifier: "sequential_execution_could_not_be_enforced" +redirect_from: + - "/docs/platform/errors/codes/102113" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102113.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The operation failed because its sequential execution could not be enforced. Chat room lifecycle operations are expected to run one at a time, and that ordering could not be guaranteed. diff --git a/src/pages/docs/platform/errors/codes/102200-hook-used-outside-its-provider.mdx b/src/pages/docs/platform/errors/codes/102200-hook-used-outside-its-provider.mdx new file mode 100644 index 0000000000..b9a41d7a0c --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102200-hook-used-outside-its-provider.mdx @@ -0,0 +1,11 @@ +--- +title: "102200: Hook used outside its provider" +meta_description: "An Ably Chat React hook was used in a component that is not wrapped in the required provider. The hooks depend on context supplied by a provider higher in the component tree." +identifier: "hook_used_outside_its_provider" +redirect_from: + - "/docs/platform/errors/codes/102200" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102200.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +An Ably Chat React hook was used in a component that is not wrapped in the required provider. The hooks depend on context supplied by a provider higher in the component tree. diff --git a/src/pages/docs/platform/errors/codes/102201-component-unmounted-before-completion.mdx b/src/pages/docs/platform/errors/codes/102201-component-unmounted-before-completion.mdx new file mode 100644 index 0000000000..d5c68320e9 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102201-component-unmounted-before-completion.mdx @@ -0,0 +1,11 @@ +--- +title: "102201: Component unmounted before completion" +meta_description: "An operation started by the Ably Chat React hooks could not finish because the React component was unmounted while it was still in progress." +identifier: "component_unmounted_before_completion" +redirect_from: + - "/docs/platform/errors/codes/102201" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102201.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +An operation started by the Ably Chat React hooks could not finish because the React component was unmounted while it was still in progress. diff --git a/src/pages/docs/platform/errors/codes/102202-presence-data-could-not-be-fetched.mdx b/src/pages/docs/platform/errors/codes/102202-presence-data-could-not-be-fetched.mdx new file mode 100644 index 0000000000..376bb14364 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/102202-presence-data-could-not-be-fetched.mdx @@ -0,0 +1,11 @@ +--- +title: "102202: Presence data could not be fetched" +meta_description: "The Ably Chat React hooks could not retrieve presence data after the maximum number of retries. This usually points to a persistent problem reaching presence rather than a transient one." +identifier: "presence_data_could_not_be_fetched" +redirect_from: + - "/docs/platform/errors/codes/102202" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/102202.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The Ably Chat React hooks could not retrieve presence data after the maximum number of retries. This usually points to a persistent problem reaching presence rather than a transient one. diff --git a/src/pages/docs/platform/errors/codes/103000-unable-to-publish-push-notification.mdx b/src/pages/docs/platform/errors/codes/103000-unable-to-publish-push-notification.mdx new file mode 100644 index 0000000000..358fd5a879 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/103000-unable-to-publish-push-notification.mdx @@ -0,0 +1,11 @@ +--- +title: "103000: Push notification internal error" +meta_description: "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." +identifier: "unable_to_publish_push_notification" +redirect_from: + - "/docs/platform/errors/codes/103000" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/103000.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. 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 new file mode 100644 index 0000000000..1edba75dc4 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/103001-push-publish-retries-exhausted.mdx @@ -0,0 +1,11 @@ +--- +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." +identifier: "push_publish_retries_exhausted" +redirect_from: + - "/docs/platform/errors/codes/103001" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/103002-push-direct-publish-no-recipient.mdx b/src/pages/docs/platform/errors/codes/103002-push-direct-publish-no-recipient.mdx new file mode 100644 index 0000000000..9e63729f4f --- /dev/null +++ b/src/pages/docs/platform/errors/codes/103002-push-direct-publish-no-recipient.mdx @@ -0,0 +1,11 @@ +--- +title: "103002: Push notification recipient missing" +meta_description: "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." +identifier: "push_direct_publish_no_recipient" +redirect_from: + - "/docs/platform/errors/codes/103002" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/103002.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. diff --git a/src/pages/docs/platform/errors/codes/103003-push-cannot-handle-body.mdx b/src/pages/docs/platform/errors/codes/103003-push-cannot-handle-body.mdx new file mode 100644 index 0000000000..f16cacaa57 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/103003-push-cannot-handle-body.mdx @@ -0,0 +1,11 @@ +--- +title: "103003: Push notification body invalid" +meta_description: "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." +identifier: "push_cannot_handle_body" +redirect_from: + - "/docs/platform/errors/codes/103003" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/103003.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. 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 new file mode 100644 index 0000000000..094859236b --- /dev/null +++ b/src/pages/docs/platform/errors/codes/103004-push-notification-rejected-by-provider.mdx @@ -0,0 +1,11 @@ +--- +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." +identifier: "push_notification_rejected_by_provider" +redirect_from: + - "/docs/platform/errors/codes/103004" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..05a20c0761 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/103005-push-device-token-invalid.mdx @@ -0,0 +1,11 @@ +--- +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." +identifier: "push_device_token_invalid" +redirect_from: + - "/docs/platform/errors/codes/103005" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..c6d018106d --- /dev/null +++ b/src/pages/docs/platform/errors/codes/103006-push-transport-not-configured.mdx @@ -0,0 +1,11 @@ +--- +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." +identifier: "push_transport_not_configured" +redirect_from: + - "/docs/platform/errors/codes/103006" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..046fd3093a --- /dev/null +++ b/src/pages/docs/platform/errors/codes/103007-push-notification-provider-unreachable.mdx @@ -0,0 +1,11 @@ +--- +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." +identifier: "push_notification_provider_unreachable" +redirect_from: + - "/docs/platform/errors/codes/103007" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/103008-push-transport-credentials-invalid.mdx b/src/pages/docs/platform/errors/codes/103008-push-transport-credentials-invalid.mdx new file mode 100644 index 0000000000..2800b720bc --- /dev/null +++ b/src/pages/docs/platform/errors/codes/103008-push-transport-credentials-invalid.mdx @@ -0,0 +1,11 @@ +--- +title: "103008: Push transport credentials invalid" +meta_description: "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." +identifier: "push_transport_credentials_invalid" +redirect_from: + - "/docs/platform/errors/codes/103008" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/103008.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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/20000-general-error.mdx b/src/pages/docs/platform/errors/codes/20000-general-error.mdx new file mode 100644 index 0000000000..e2d89f82f8 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/20000-general-error.mdx @@ -0,0 +1,11 @@ +--- +title: "20000: General error" +meta_description: "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." +identifier: "general_error" +redirect_from: + - "/docs/platform/errors/codes/20000" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40000-bad-request.mdx b/src/pages/docs/platform/errors/codes/40000-bad-request.mdx new file mode 100644 index 0000000000..02ba225951 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40000-bad-request.mdx @@ -0,0 +1,11 @@ +--- +title: "40000: Bad request" +meta_description: "The request was rejected because it was invalid and could not be processed." +identifier: "bad_request" +redirect_from: + - "/docs/platform/errors/codes/40000" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..28b871880c --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40001-invalid-request-body.mdx @@ -0,0 +1,11 @@ +--- +title: "40001: Invalid request body" +meta_description: "The body of the request could not be processed because it was invalid, missing required fields, or not in the expected format." +identifier: "invalid_request_body" +redirect_from: + - "/docs/platform/errors/codes/40001" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40002-invalid-request-parameter-name.mdx b/src/pages/docs/platform/errors/codes/40002-invalid-request-parameter-name.mdx new file mode 100644 index 0000000000..75ea552241 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40002-invalid-request-parameter-name.mdx @@ -0,0 +1,11 @@ +--- +title: "40002: Invalid request parameter name" +meta_description: "The request included a parameter that is not recognized or not permitted for the operation being performed." +identifier: "invalid_request_parameter_name" +redirect_from: + - "/docs/platform/errors/codes/40002" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40002.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The request included a parameter that is not recognized or not permitted for the operation being performed. 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 new file mode 100644 index 0000000000..85cbbc9ce6 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40003-invalid-parameter-value.mdx @@ -0,0 +1,11 @@ +--- +title: "40003: Invalid request parameter value" +meta_description: "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." +identifier: "invalid_parameter_value" +redirect_from: + - "/docs/platform/errors/codes/40003" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40004-invalid-request-header.mdx b/src/pages/docs/platform/errors/codes/40004-invalid-request-header.mdx new file mode 100644 index 0000000000..6efc6858f8 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40004-invalid-request-header.mdx @@ -0,0 +1,11 @@ +--- +title: "40004: Invalid request header" +meta_description: "A header supplied with the request was missing, invalid, or held a value that was not accepted for the operation." +identifier: "invalid_request_header" +redirect_from: + - "/docs/platform/errors/codes/40004" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40004.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A header supplied with the request was missing, invalid, or held a value that was not accepted for the operation. diff --git a/src/pages/docs/platform/errors/codes/40005-invalid-credential.mdx b/src/pages/docs/platform/errors/codes/40005-invalid-credential.mdx new file mode 100644 index 0000000000..45a7e1f793 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40005-invalid-credential.mdx @@ -0,0 +1,11 @@ +--- +title: "40005: Invalid API key or token" +meta_description: "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." +identifier: "invalid_credential" +redirect_from: + - "/docs/platform/errors/codes/40005" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..3d5d33f7b8 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40006-message-contains-invalid-connection-id.mdx @@ -0,0 +1,11 @@ +--- +title: "40006: Message contains invalid connection ID" +meta_description: "A published message referenced a connection by an ID or key that was invalid or did not match, so the message was rejected." +identifier: "message_contains_invalid_connection_id" +redirect_from: + - "/docs/platform/errors/codes/40006" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40007-invalid-connection-serial.mdx b/src/pages/docs/platform/errors/codes/40007-invalid-connection-serial.mdx new file mode 100644 index 0000000000..ad0daaae66 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40007-invalid-connection-serial.mdx @@ -0,0 +1,11 @@ +--- +title: "40007: Invalid connection serial" +meta_description: "An older Ably SDK attempted to resume a connection using an invalid connection serial." +identifier: "invalid_connection_serial" +redirect_from: + - "/docs/platform/errors/codes/40007" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40007.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +An older Ably SDK attempted to resume a connection using an invalid connection serial. diff --git a/src/pages/docs/platform/errors/codes/40008-invalid-content-length.mdx b/src/pages/docs/platform/errors/codes/40008-invalid-content-length.mdx new file mode 100644 index 0000000000..25e7272a0a --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40008-invalid-content-length.mdx @@ -0,0 +1,11 @@ +--- +title: "40008: Invalid content length" +meta_description: "More data arrived in the request body than its Content-Length header declared, so the request was rejected." +identifier: "invalid_content_length" +redirect_from: + - "/docs/platform/errors/codes/40008" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40008.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +More data arrived in the request body than its Content-Length header declared, so the request was rejected. 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 new file mode 100644 index 0000000000..da75f72d09 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40009-max-message-size-exceeded.mdx @@ -0,0 +1,27 @@ +--- +title: "40009: Message too large" +meta_description: "A message was rejected because it exceeded the maximum permitted size. When several messages are published in a single call, the limit applies to their combined size rather than to each one individually." +identifier: "max_message_size_exceeded" +redirect_from: + - "/docs/platform/errors/codes/40009" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40009.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A message was rejected because it exceeded the maximum permitted size. When several messages are published in a single call, the limit applies to their combined size rather than to each one individually. + +## What you should do + +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. + +## Why it happens + +Every published message has a maximum size, set by your account's limits, and this error means the payload exceeded it. The size counts the message's data together with its name, client ID, and any extras, so all of these contribute to the total. Publishing an array of messages in one call is measured as a single payload, so a batch of individually small messages can still exceed the limit in aggregate. + +This is about total size in bytes. A publish rejected for containing too many messages, rather than too large a payload, is reported as 40034 instead. + +## What you'll see + +The publish is rejected and the message is not delivered. The error is reported with code 40009 and HTTP status 413, with a message of the form `Maximum message length exceeded (size was bytes, limit is bytes)`. 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 new file mode 100644 index 0000000000..7e1e322c59 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40010-invalid-channel-name.mdx @@ -0,0 +1,11 @@ +--- +title: "40010: Invalid channel name" +meta_description: "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." +identifier: "invalid_channel_name" +redirect_from: + - "/docs/platform/errors/codes/40010" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..6c532b1c05 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40011-pagination-sequence-no-longer-valid.mdx @@ -0,0 +1,11 @@ +--- +title: "40011: Pagination sequence no longer valid" +meta_description: "An enumeration query could not continue because the underlying set of results shifted between pages, so the pagination sequence was no longer valid." +identifier: "pagination_sequence_no_longer_valid" +redirect_from: + - "/docs/platform/errors/codes/40011" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..ba86e834d9 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40012-invalid-client-id.mdx @@ -0,0 +1,11 @@ +--- +title: "40012: Invalid client ID" +meta_description: "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." +identifier: "invalid_client_id" +redirect_from: + - "/docs/platform/errors/codes/40012" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..db1d939663 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40013-invalid-data-or-encoding.mdx @@ -0,0 +1,11 @@ +--- +title: "40013: Invalid message data or encoding" +meta_description: "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." +identifier: "invalid_data_or_encoding" +redirect_from: + - "/docs/platform/errors/codes/40013" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40014-resource-disposed.mdx b/src/pages/docs/platform/errors/codes/40014-resource-disposed.mdx new file mode 100644 index 0000000000..cdd90a4117 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40014-resource-disposed.mdx @@ -0,0 +1,11 @@ +--- +title: "40014: Resource disposed" +meta_description: "The operation could not complete because an internal Ably resource it targeted was temporarily unavailable, typically during routine changes on Ably's side such as failover or rebalancing." +identifier: "resource_disposed" +redirect_from: + - "/docs/platform/errors/codes/40014" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40014.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The operation could not complete because an internal Ably resource it targeted was temporarily unavailable, typically during routine changes on Ably's side such as failover or rebalancing. 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 new file mode 100644 index 0000000000..ea56c7a495 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40015-invalid-device-id.mdx @@ -0,0 +1,11 @@ +--- +title: "40015: Invalid device ID" +meta_description: "The device ID supplied for a push notification operation was missing or not in an acceptable form, so the request was rejected." +identifier: "invalid_device_id" +redirect_from: + - "/docs/platform/errors/codes/40015" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..dee26c3ac7 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40016-invalid-message-name.mdx @@ -0,0 +1,11 @@ +--- +title: "40016: Invalid message name" +meta_description: "A message supplied a name that was invalid, so the message was rejected." +identifier: "invalid_message_name" +redirect_from: + - "/docs/platform/errors/codes/40016" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..d15bc9ed7a --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40017-unsupported-protocol-version.mdx @@ -0,0 +1,11 @@ +--- +title: "40017: Unsupported protocol version" +meta_description: "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." +identifier: "unsupported_protocol_version" +redirect_from: + - "/docs/platform/errors/codes/40017" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..980940f939 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40018-delta-decoding-failed.mdx @@ -0,0 +1,11 @@ +--- +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." +identifier: "delta_decoding_failed" +redirect_from: + - "/docs/platform/errors/codes/40018" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40019-missing-plugin.mdx b/src/pages/docs/platform/errors/codes/40019-missing-plugin.mdx new file mode 100644 index 0000000000..9ae715c318 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40019-missing-plugin.mdx @@ -0,0 +1,11 @@ +--- +title: "40019: Required SDK plugin not present" +meta_description: "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." +identifier: "missing_plugin" +redirect_from: + - "/docs/platform/errors/codes/40019" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40019.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. 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 new file mode 100644 index 0000000000..7fc20d6da5 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40020-batch-request-error.mdx @@ -0,0 +1,11 @@ +--- +title: "40020: Batch request error" +meta_description: "A batch request completed with one or more of its items failing. Each failing item carries its own error, reported alongside this one." +identifier: "batch_request_error" +redirect_from: + - "/docs/platform/errors/codes/40020" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40021-feature-requires-a-newer-platform-version.mdx b/src/pages/docs/platform/errors/codes/40021-feature-requires-a-newer-platform-version.mdx new file mode 100644 index 0000000000..82de58eeff --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40021-feature-requires-a-newer-platform-version.mdx @@ -0,0 +1,11 @@ +--- +title: "40021: Feature requires a newer platform version" +meta_description: "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." +identifier: "feature_requires_a_newer_platform_version" +redirect_from: + - "/docs/platform/errors/codes/40021" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40021.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. 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 new file mode 100644 index 0000000000..9744243c9d --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40022-api-streamer-no-longer-offered.mdx @@ -0,0 +1,11 @@ +--- +title: "40022: API Streamer no longer offered" +meta_description: "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." +identifier: "api_streamer_no_longer_offered" +redirect_from: + - "/docs/platform/errors/codes/40022" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40023-operation-requires-a-newer-sdk-version.mdx b/src/pages/docs/platform/errors/codes/40023-operation-requires-a-newer-sdk-version.mdx new file mode 100644 index 0000000000..1e33a6f06e --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40023-operation-requires-a-newer-sdk-version.mdx @@ -0,0 +1,11 @@ +--- +title: "40023: Operation requires a newer SDK version" +meta_description: "The requested operation is not supported by the Ably SDK version in use, because it relies on a capability available only in a more recent version." +identifier: "operation_requires_a_newer_sdk_version" +redirect_from: + - "/docs/platform/errors/codes/40023" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40023.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The requested operation is not supported by the Ably SDK version in use, because it relies on a capability available only in a more recent version. 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 new file mode 100644 index 0000000000..cf2d757516 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40024-incompatible-site-for-history.mdx @@ -0,0 +1,31 @@ +--- +title: "40024: untilAttach history request not served by attach region" +meta_description: "A history request using untilAttach was handled by a different Ably region from the one the channel attached in. The attach point is specific to that region, so the request could not be served and no messages were returned." +identifier: "incompatible_site_for_history" +redirect_from: + - "/docs/platform/errors/codes/40024" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40024.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A history request using untilAttach was handled by a different Ably region from the one the channel attached in. The attach point is specific to that region, so the request could not be served and no messages were returned. + +## What you should do + +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. +- **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. + +## Why it happens + +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. + +## 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. diff --git a/src/pages/docs/platform/errors/codes/40025-api-no-longer-supported.mdx b/src/pages/docs/platform/errors/codes/40025-api-no-longer-supported.mdx new file mode 100644 index 0000000000..738faf4235 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40025-api-no-longer-supported.mdx @@ -0,0 +1,11 @@ +--- +title: "40025: API no longer supported" +meta_description: "A method or feature that Ably no longer supports was called. It has been removed or replaced by a newer API, so the call is rejected instead of being performed." +identifier: "api_no_longer_supported" +redirect_from: + - "/docs/platform/errors/codes/40025" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40025.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A method or feature that Ably no longer supports was called. It has been removed or replaced by a newer API, so the call is rejected instead of being performed. 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 new file mode 100644 index 0000000000..7bdbfeed4e --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40030-invalid-publish-request.mdx @@ -0,0 +1,11 @@ +--- +title: "40030: Invalid publish request" +meta_description: "A publish request was rejected because it was invalid." +identifier: "invalid_publish_request" +redirect_from: + - "/docs/platform/errors/codes/40030" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..1c98961a4e --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40031-invalid-client-specified-message-id.mdx @@ -0,0 +1,11 @@ +--- +title: "40031: Invalid client-specified message id" +meta_description: "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." +identifier: "invalid_client_specified_message_id" +redirect_from: + - "/docs/platform/errors/codes/40031" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..b7158dea7a --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40032-invalid-message-extras-field.mdx @@ -0,0 +1,11 @@ +--- +title: "40032: Invalid message extras field" +meta_description: "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." +identifier: "invalid_message_extras_field" +redirect_from: + - "/docs/platform/errors/codes/40032" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40033-operation-canceled.mdx b/src/pages/docs/platform/errors/codes/40033-operation-canceled.mdx new file mode 100644 index 0000000000..5741ab3460 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40033-operation-canceled.mdx @@ -0,0 +1,23 @@ +--- +title: "40033: Operation canceled" +meta_description: "An operation was stopped before completing, so its result was discarded. This usually happens when the connection or request that triggered the operation ends first." +identifier: "operation_canceled" +redirect_from: + - "/docs/platform/errors/codes/40033" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40033.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +An operation was stopped before completing, so its result was discarded. This usually happens when the connection or request that triggered the operation ends first. + +## What you should do + +If you stopped the operation yourself, by closing the connection or abandoning the request before it returned, this is expected and there is nothing to do. Otherwise it did not complete, so if its result mattered, issue it again; it is not retried automatically. + +## Why it happens + +The operation, such as publishing a message, was stopped part-way rather than rejected on its own merits. The usual cause is that the connection or request driving the operation ended first: the connection closed, or the client stopped waiting for the response. Ably stopped processing at that point. + +## What you'll see + +The error is reported with code 40033 and HTTP status 400. The message is `operation canceled`; the spelling `operation canceled` appears on some paths. diff --git a/src/pages/docs/platform/errors/codes/40034-too-many-messages-in-one-publish.mdx b/src/pages/docs/platform/errors/codes/40034-too-many-messages-in-one-publish.mdx new file mode 100644 index 0000000000..7df6fe7ba2 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40034-too-many-messages-in-one-publish.mdx @@ -0,0 +1,11 @@ +--- +title: "40034: Too many messages in one publish" +meta_description: "A publish was rejected because it contained more messages than the maximum permitted count. This is about the number of messages, not their combined size, which is limited separately." +identifier: "too_many_messages_in_one_publish" +redirect_from: + - "/docs/platform/errors/codes/40034" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40034.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A publish was rejected because it contained more messages than the maximum permitted count. This is about the number of messages, not their combined size, which is limited separately. diff --git a/src/pages/docs/platform/errors/codes/40035-integration-message-filter-regex-not-re2-compatible.mdx b/src/pages/docs/platform/errors/codes/40035-integration-message-filter-regex-not-re2-compatible.mdx new file mode 100644 index 0000000000..5839992d46 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40035-integration-message-filter-regex-not-re2-compatible.mdx @@ -0,0 +1,11 @@ +--- +title: "40035: Integration message filter regex not RE2-compatible" +meta_description: "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." +identifier: "integration_message_filter_regex_not_re2_compatible" +redirect_from: + - "/docs/platform/errors/codes/40035" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40035.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. diff --git a/src/pages/docs/platform/errors/codes/40099-reserved-for-testing.mdx b/src/pages/docs/platform/errors/codes/40099-reserved-for-testing.mdx new file mode 100644 index 0000000000..dd7cdc0e95 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40099-reserved-for-testing.mdx @@ -0,0 +1,11 @@ +--- +title: "40099: Reserved for testing" +meta_description: "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." +identifier: "reserved_for_testing" +redirect_from: + - "/docs/platform/errors/codes/40099" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40099.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. diff --git a/src/pages/docs/platform/errors/codes/40100-unauthorized.mdx b/src/pages/docs/platform/errors/codes/40100-unauthorized.mdx new file mode 100644 index 0000000000..33d62be15a --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40100-unauthorized.mdx @@ -0,0 +1,11 @@ +--- +title: "40100: Unauthorized" +meta_description: "A connection or request was rejected because it was not authorized." +identifier: "unauthorized" +redirect_from: + - "/docs/platform/errors/codes/40100" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40101-invalid-credentials.mdx b/src/pages/docs/platform/errors/codes/40101-invalid-credentials.mdx new file mode 100644 index 0000000000..9781ac96be --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40101-invalid-credentials.mdx @@ -0,0 +1,11 @@ +--- +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." +identifier: "invalid_credentials" +redirect_from: + - "/docs/platform/errors/codes/40101" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40102-incompatible-credentials.mdx b/src/pages/docs/platform/errors/codes/40102-incompatible-credentials.mdx new file mode 100644 index 0000000000..5de388da23 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40102-incompatible-credentials.mdx @@ -0,0 +1,11 @@ +--- +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." +identifier: "incompatible_credentials" +redirect_from: + - "/docs/platform/errors/codes/40102" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..9fbab5ea17 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40103-invalid-use-of-basic-auth-over-non-tls-transport.mdx @@ -0,0 +1,11 @@ +--- +title: "40103: Basic authentication used over an insecure connection" +meta_description: "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." +identifier: "invalid_use_of_basic_auth_over_non_tls_transport" +redirect_from: + - "/docs/platform/errors/codes/40103" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..f50c24c0dd --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40104-token-request-timestamp-outside-permitted-window.mdx @@ -0,0 +1,11 @@ +--- +title: "40104: Token request timestamp outside permitted window" +meta_description: "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." +identifier: "token_request_timestamp_outside_permitted_window" +redirect_from: + - "/docs/platform/errors/codes/40104" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..6e4607c0c4 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40105-nonce-value-replayed.mdx @@ -0,0 +1,11 @@ +--- +title: "40105: Nonce value replayed" +meta_description: "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." +identifier: "nonce_value_replayed" +redirect_from: + - "/docs/platform/errors/codes/40105" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..a861ecb6a6 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40106-no-valid-authentication-method-provided.mdx @@ -0,0 +1,11 @@ +--- +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." +identifier: "no_valid_authentication_method_provided" +redirect_from: + - "/docs/platform/errors/codes/40106" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40110-account-disabled.mdx b/src/pages/docs/platform/errors/codes/40110-account-disabled.mdx new file mode 100644 index 0000000000..ff24239a6d --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40110-account-disabled.mdx @@ -0,0 +1,11 @@ +--- +title: "40110: Account disabled" +meta_description: "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." +identifier: "account_disabled" +redirect_from: + - "/docs/platform/errors/codes/40110" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40110.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. 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 new file mode 100644 index 0000000000..172b10afb7 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40111-account-connection-limit-exceeded.mdx @@ -0,0 +1,11 @@ +--- +title: "40111: Account connection limit exceeded" +meta_description: "A new connection was refused because the account had reached the maximum number of concurrent connections permitted by its limits." +identifier: "account_connection_limit_exceeded" +redirect_from: + - "/docs/platform/errors/codes/40111" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..958408848b --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40112-account-message-limit-exceeded.mdx @@ -0,0 +1,11 @@ +--- +title: "40112: Account message limit exceeded" +meta_description: "The request was rejected because the account had reached the maximum message volume permitted by its limits." +identifier: "account_message_limit_exceeded" +redirect_from: + - "/docs/platform/errors/codes/40112" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40113-account-blocked.mdx b/src/pages/docs/platform/errors/codes/40113-account-blocked.mdx new file mode 100644 index 0000000000..7520dd4777 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40113-account-blocked.mdx @@ -0,0 +1,11 @@ +--- +title: "40113: Account blocked" +meta_description: "The request was rejected because the Ably account it belongs to is blocked." +identifier: "account_blocked" +redirect_from: + - "/docs/platform/errors/codes/40113" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40113.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The request was rejected because the Ably account it belongs to is blocked. 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 new file mode 100644 index 0000000000..2e14ec6ebf --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40114-account-channel-limit-exceeded.mdx @@ -0,0 +1,11 @@ +--- +title: "40114: Account channel limit exceeded" +meta_description: "The request was refused because the account had reached the maximum number of concurrent channels permitted by its limits." +identifier: "account_channel_limit_exceeded" +redirect_from: + - "/docs/platform/errors/codes/40114" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..646882c49f --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40115-account-request-limit-exceeded.mdx @@ -0,0 +1,11 @@ +--- +title: "40115: Account request limit exceeded" +meta_description: "The request was refused because the account had reached its permitted limit on API and token requests." +identifier: "account_request_limit_exceeded" +redirect_from: + - "/docs/platform/errors/codes/40115" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40120-application-disabled.mdx b/src/pages/docs/platform/errors/codes/40120-application-disabled.mdx new file mode 100644 index 0000000000..8461b2af37 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40120-application-disabled.mdx @@ -0,0 +1,11 @@ +--- +title: "40120: Application disabled" +meta_description: "The request was rejected because the application it targets is disabled. While an application is disabled, it cannot authenticate or carry traffic." +identifier: "application_disabled" +redirect_from: + - "/docs/platform/errors/codes/40120" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40120.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The request was rejected because the application it targets is disabled. While an application is disabled, it cannot authenticate or carry traffic. 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 new file mode 100644 index 0000000000..daf7f76cf2 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40121-token-revocation-not-enabled.mdx @@ -0,0 +1,11 @@ +--- +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." +identifier: "token_revocation_not_enabled" +redirect_from: + - "/docs/platform/errors/codes/40121" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..484aa18ac4 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40125-application-integration-limit-exceeded.mdx @@ -0,0 +1,11 @@ +--- +title: "40125: Application integration limit exceeded" +meta_description: "An integration could not be created because the application had reached the maximum number of integrations permitted by its limits." +identifier: "application_integration_limit_exceeded" +redirect_from: + - "/docs/platform/errors/codes/40125" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40126-application-channel-rule-limit-exceeded.mdx b/src/pages/docs/platform/errors/codes/40126-application-channel-rule-limit-exceeded.mdx new file mode 100644 index 0000000000..93c304640e --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40126-application-channel-rule-limit-exceeded.mdx @@ -0,0 +1,11 @@ +--- +title: "40126: Application channel rule limit exceeded" +meta_description: "A channel rule could not be created because the application had reached the maximum number of channel rules permitted by its limits." +identifier: "application_channel_rule_limit_exceeded" +redirect_from: + - "/docs/platform/errors/codes/40126" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40126.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A channel rule could not be created because the application had reached the maximum number of channel rules permitted by its limits. 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 new file mode 100644 index 0000000000..ed861c3bb1 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40127-application-api-key-limit-exceeded.mdx @@ -0,0 +1,11 @@ +--- +title: "40127: Application API key limit exceeded" +meta_description: "A new API key could not be created because the application had reached the maximum number of keys permitted by its limits." +identifier: "application_api_key_limit_exceeded" +redirect_from: + - "/docs/platform/errors/codes/40127" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40128-account-application-limit-exceeded.mdx b/src/pages/docs/platform/errors/codes/40128-account-application-limit-exceeded.mdx new file mode 100644 index 0000000000..c2869f0042 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40128-account-application-limit-exceeded.mdx @@ -0,0 +1,11 @@ +--- +title: "40128: Account application limit exceeded" +meta_description: "A new application could not be created because the account had reached the maximum number of applications it is permitted." +identifier: "account_application_limit_exceeded" +redirect_from: + - "/docs/platform/errors/codes/40128" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40128.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A new application could not be created because the account had reached the maximum number of applications it is permitted. diff --git a/src/pages/docs/platform/errors/codes/40130-key-error.mdx b/src/pages/docs/platform/errors/codes/40130-key-error.mdx new file mode 100644 index 0000000000..d5055ebcf0 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40130-key-error.mdx @@ -0,0 +1,11 @@ +--- +title: "40130: API key not recognized" +meta_description: "Authentication failed because the API key presented was not recognized. This usually means the key does not exist or has been removed." +identifier: "key_error" +redirect_from: + - "/docs/platform/errors/codes/40130" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40130.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +Authentication failed because the API key presented was not recognized. This usually means the key does not exist or has been removed. diff --git a/src/pages/docs/platform/errors/codes/40131-key-revoked.mdx b/src/pages/docs/platform/errors/codes/40131-key-revoked.mdx new file mode 100644 index 0000000000..8b763b3199 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40131-key-revoked.mdx @@ -0,0 +1,11 @@ +--- +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." +identifier: "key_revoked" +redirect_from: + - "/docs/platform/errors/codes/40131" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40132-key-expired.mdx b/src/pages/docs/platform/errors/codes/40132-key-expired.mdx new file mode 100644 index 0000000000..bdaae347f9 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40132-key-expired.mdx @@ -0,0 +1,11 @@ +--- +title: "40132: API key expired" +meta_description: "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." +identifier: "key_expired" +redirect_from: + - "/docs/platform/errors/codes/40132" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40132.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 expired. Keys can be given an expiry time, after which they can no longer authenticate. 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 new file mode 100644 index 0000000000..c50a59c5e8 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40133-wrong-api-key-for-token-revocation.mdx @@ -0,0 +1,11 @@ +--- +title: "40133: Wrong API key for token revocation" +meta_description: "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." +identifier: "wrong_api_key_for_token_revocation" +redirect_from: + - "/docs/platform/errors/codes/40133" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40140-token-error-unspecified.mdx b/src/pages/docs/platform/errors/codes/40140-token-error-unspecified.mdx new file mode 100644 index 0000000000..2742bcc5f9 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40140-token-error-unspecified.mdx @@ -0,0 +1,11 @@ +--- +title: "40140: Token not accepted" +meta_description: "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." +identifier: "token_error_unspecified" +redirect_from: + - "/docs/platform/errors/codes/40140" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40140.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. diff --git a/src/pages/docs/platform/errors/codes/40141-token-revoked.mdx b/src/pages/docs/platform/errors/codes/40141-token-revoked.mdx new file mode 100644 index 0000000000..0dbba87c5e --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40141-token-revoked.mdx @@ -0,0 +1,11 @@ +--- +title: "40141: Token revoked" +meta_description: "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." +identifier: "token_revoked" +redirect_from: + - "/docs/platform/errors/codes/40141" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40142-token-expired.mdx b/src/pages/docs/platform/errors/codes/40142-token-expired.mdx new file mode 100644 index 0000000000..5ce4ebe3db --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40142-token-expired.mdx @@ -0,0 +1,30 @@ +--- +title: "40142: Token expired" +meta_description: "The client's connection or request was rejected because the authentication token had expired. Each token has an expiry time that is set when it is issued." +identifier: "token_expired" +redirect_from: + - "/docs/platform/errors/codes/40142" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40142.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The client's connection or request was rejected because the authentication token had expired. Each token has an expiry time that is set when it is issued. + +## What you should do + +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. + +## Why it happens + +When 40142 reaches your application instead of being handled silently, the cause is usually one of the following. + +- No renewal mechanism is configured. Without `authUrl` or `authCallback`, the SDK has no way to obtain a replacement when a token expires. [Configure one of these](https://ably.com/docs/auth/token) so renewal happens automatically. +- The auth endpoint is unreachable or slow. If the `authUrl` or `authCallback` fails or times out when the SDK tries to renew, the expired token is all that remains. Check that your token-issuing endpoint is reachable and returns a valid token promptly. +- The token was issued with a very short lifetime. A small `ttl` causes tokens to expire sooner than expected, sometimes before the SDK renews them. Review the `ttl` you request against how long your clients actually need it. +- The client clock is significantly skewed. A token can appear expired immediately after issue if the client's clock differs substantially from real time. Ensure the client clock is reasonably accurate. + +## What you'll see + +The error is reported with code 40142 and HTTP status 401. The message is typically `Token expired`; some server paths report `Access token expired`. diff --git a/src/pages/docs/platform/errors/codes/40143-token-unrecognized.mdx b/src/pages/docs/platform/errors/codes/40143-token-unrecognized.mdx new file mode 100644 index 0000000000..285cfc2463 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40143-token-unrecognized.mdx @@ -0,0 +1,25 @@ +--- +title: "40143: Token not recognized" +meta_description: "A connection or request was rejected because Ably could not find a record of the token presented. Ably stores a record of certain tokens only while they remain valid, so this often means the token had already expired." +identifier: "token_unrecognized" +redirect_from: + - "/docs/platform/errors/codes/40143" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40143.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A connection or request was rejected because Ably could not find a record of the token presented. Ably stores a record of certain tokens only while they remain valid, so this often means the token had already expired. + +## What you should do + +Usually nothing, when the client is configured to renew its own tokens. Such a client obtains a replacement when a token is rejected and recovers without intervention, so a 40143 that clears on its own needs no action. In practice it is often indistinguishable from ordinary token expiry. + +Act when it persists or reaches your application. The common cause is a client running on an expired token without renewing it, so confirm an `authUrl` or `authCallback` is [configured](https://ably.com/docs/auth/token) so the client can obtain fresh tokens. + +## Why it happens + +Ably keeps a stored record of some [tokens](https://ably.com/docs/auth/token), and only for as long as they remain valid. This error means a token of that kind was presented but no matching record was found, most often because it had expired and its record had already been removed. That is why such a token is reported as unrecognized rather than expired (40142). + +## What you'll see + +The error is reported with code 40143 and HTTP status 401. The message is `token unrecognized`; some paths include the token identifier, as `Token unrecognized: `. diff --git a/src/pages/docs/platform/errors/codes/40144-invalid-jwt.mdx b/src/pages/docs/platform/errors/codes/40144-invalid-jwt.mdx new file mode 100644 index 0000000000..51ba6dab20 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40144-invalid-jwt.mdx @@ -0,0 +1,11 @@ +--- +title: "40144: Invalid JWT token" +meta_description: "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." +identifier: "invalid_jwt" +redirect_from: + - "/docs/platform/errors/codes/40144" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40145-invalid-ably-token.mdx b/src/pages/docs/platform/errors/codes/40145-invalid-ably-token.mdx new file mode 100644 index 0000000000..be471035c3 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40145-invalid-ably-token.mdx @@ -0,0 +1,11 @@ +--- +title: "40145: Invalid Ably token" +meta_description: "An Ably token presented for authentication could not be parsed, so its contents could not be read." +identifier: "invalid_ably_token" +redirect_from: + - "/docs/platform/errors/codes/40145" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40145.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +An Ably token presented for authentication could not be parsed, so its contents could not be read. diff --git a/src/pages/docs/platform/errors/codes/40150-application-connection-limit-exceeded.mdx b/src/pages/docs/platform/errors/codes/40150-application-connection-limit-exceeded.mdx new file mode 100644 index 0000000000..c4cf575b73 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40150-application-connection-limit-exceeded.mdx @@ -0,0 +1,11 @@ +--- +title: "40150: Application connection limit exceeded" +meta_description: "A new connection was refused because the application had reached the maximum number of concurrent connections permitted for it." +identifier: "application_connection_limit_exceeded" +redirect_from: + - "/docs/platform/errors/codes/40150" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40150.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A new connection was refused because the application had reached the maximum number of concurrent connections permitted for it. diff --git a/src/pages/docs/platform/errors/codes/40151-token-connection-limit-exceeded.mdx b/src/pages/docs/platform/errors/codes/40151-token-connection-limit-exceeded.mdx new file mode 100644 index 0000000000..8c0c438b7f --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40151-token-connection-limit-exceeded.mdx @@ -0,0 +1,11 @@ +--- +title: "40151: Token connection limit exceeded" +meta_description: "A connection was refused because the number of concurrent connections using the same token had reached the maximum permitted for a single token." +identifier: "token_connection_limit_exceeded" +redirect_from: + - "/docs/platform/errors/codes/40151" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40151.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A connection was refused because the number of concurrent connections using the same token had reached the maximum permitted for a single token. diff --git a/src/pages/docs/platform/errors/codes/40160-capability-denied.mdx b/src/pages/docs/platform/errors/codes/40160-capability-denied.mdx new file mode 100644 index 0000000000..fbd597da13 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40160-capability-denied.mdx @@ -0,0 +1,29 @@ +--- +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." +identifier: "capability_denied" +redirect_from: + - "/docs/platform/errors/codes/40160" +--- + +{/* 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. + +## 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. + +## Why it happens + +Every operation requires a particular capability on the channel or resource it targets, and this error is raised when that capability isn't assigned to the API key or token the client used. Common cases: + +- Publishing or subscribing to a channel without the `publish` or `subscribe` capability. +- Retrieving a channel's history without the `history` capability. +- Entering presence on a channel without the `presence` capability. + +## 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`. 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 new file mode 100644 index 0000000000..f1a0a09316 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40161-identified-client-required.mdx @@ -0,0 +1,11 @@ +--- +title: "40161: Operation requires an identified client" +meta_description: "The client had no established client ID, so an operation that requires one was refused." +identifier: "identified_client_required" +redirect_from: + - "/docs/platform/errors/codes/40161" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40162-operation-requires-basic-authentication.mdx b/src/pages/docs/platform/errors/codes/40162-operation-requires-basic-authentication.mdx new file mode 100644 index 0000000000..25bb977f39 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40162-operation-requires-basic-authentication.mdx @@ -0,0 +1,11 @@ +--- +title: "40162: Operation requires Basic authentication" +meta_description: "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." +identifier: "operation_requires_basic_authentication" +redirect_from: + - "/docs/platform/errors/codes/40162" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40162.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. diff --git a/src/pages/docs/platform/errors/codes/40163-token-revocation-not-enabled-for-api-key.mdx b/src/pages/docs/platform/errors/codes/40163-token-revocation-not-enabled-for-api-key.mdx new file mode 100644 index 0000000000..75c2a72eee --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40163-token-revocation-not-enabled-for-api-key.mdx @@ -0,0 +1,11 @@ +--- +title: "40163: Token revocation not enabled for API key" +meta_description: "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." +identifier: "token_revocation_not_enabled_for_api_key" +redirect_from: + - "/docs/platform/errors/codes/40163" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40163.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. diff --git a/src/pages/docs/platform/errors/codes/40164-token-revocation-not-enabled-for-api-key-40164.mdx b/src/pages/docs/platform/errors/codes/40164-token-revocation-not-enabled-for-api-key-40164.mdx new file mode 100644 index 0000000000..9482126bcf --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40164-token-revocation-not-enabled-for-api-key-40164.mdx @@ -0,0 +1,11 @@ +--- +title: "40164: Token revocation not enabled for API key" +meta_description: "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." +identifier: "token_revocation_not_enabled_for_api_key_40164" +redirect_from: + - "/docs/platform/errors/codes/40164" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40164.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. 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 new file mode 100644 index 0000000000..f8e8ac1e64 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40165-channel-mode-not-requested-when-attaching.mdx @@ -0,0 +1,25 @@ +--- +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." +identifier: "channel_mode_not_requested_when_attaching" +redirect_from: + - "/docs/platform/errors/codes/40165" +--- + +{/* 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. + +## 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. + +This is not a capability problem, so changing the token or key's capability will not help — 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. + +## What you'll see + +The error is reported with code 40165 and HTTP status 401. The message names the operation and the missing mode, for example `Unable to publish a message as client did not request the PUBLISH mode when attaching` or `Unable to enter, update or leave presence as client did not request the PRESENCE mode when attaching`; the object and annotation variants name the `OBJECT_PUBLISH` and `ANNOTATION_PUBLISH` modes. 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 new file mode 100644 index 0000000000..12b2a8fb30 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40166-unidentified-client-cannot-modify-own-messages.mdx @@ -0,0 +1,23 @@ +--- +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." +identifier: "unidentified_client_cannot_modify_own_messages" +redirect_from: + - "/docs/platform/errors/codes/40166" +--- + +{/* 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. + +## 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. + +## Why it happens + +The `message-update-own` and `message-delete-own` capabilities only permit a client to change messages it published itself, matched by `clientId`. An unidentified client has no `clientId`, and so no messages of its own, leaving an "own" capability with nothing it is permitted to act on. + +## What you'll see + +The error is reported with code 40166 and HTTP status 401. The message names the operation and the capability required, for example `Unable to update message: anonymous clients require the 'message-update-any' capability (they cannot have own messages, so 'message-update-own' does not apply)`, and the equivalent for delete with `message-delete-any`. 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 new file mode 100644 index 0000000000..4d7a7cb2fc --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40170-error-from-client-token-callback.mdx @@ -0,0 +1,11 @@ +--- +title: "40170: Token callback failed" +meta_description: "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." +identifier: "error_from_client_token_callback" +redirect_from: + - "/docs/platform/errors/codes/40170" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..4e04a25c93 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40171-token-renewal-not-configured.mdx @@ -0,0 +1,11 @@ +--- +title: "40171: Token renewal not configured" +meta_description: "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." +identifier: "token_renewal_not_configured" +redirect_from: + - "/docs/platform/errors/codes/40171" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40172-operation-requires-token-authentication.mdx b/src/pages/docs/platform/errors/codes/40172-operation-requires-token-authentication.mdx new file mode 100644 index 0000000000..c2c9ffaaa5 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40172-operation-requires-token-authentication.mdx @@ -0,0 +1,11 @@ +--- +title: "40172: Operation requires Token authentication" +meta_description: "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." +identifier: "operation_requires_token_authentication" +redirect_from: + - "/docs/platform/errors/codes/40172" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40172.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. 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 new file mode 100644 index 0000000000..fbcda78093 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40180-apns-token-authentication-required.mdx @@ -0,0 +1,11 @@ +--- +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/40181-no-location-token-for-device.mdx b/src/pages/docs/platform/errors/codes/40181-no-location-token-for-device.mdx new file mode 100644 index 0000000000..3575821a55 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40181-no-location-token-for-device.mdx @@ -0,0 +1,11 @@ +--- +title: "40181: No location token for device" +meta_description: "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." +identifier: "no_location_token_for_device" +redirect_from: + - "/docs/platform/errors/codes/40181" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40181.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. diff --git a/src/pages/docs/platform/errors/codes/40300-forbidden.mdx b/src/pages/docs/platform/errors/codes/40300-forbidden.mdx new file mode 100644 index 0000000000..f695b379d6 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40300-forbidden.mdx @@ -0,0 +1,11 @@ +--- +title: "40300: Forbidden" +meta_description: "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." +identifier: "forbidden" +redirect_from: + - "/docs/platform/errors/codes/40300" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40310-account-does-not-permit-tls-connections.mdx b/src/pages/docs/platform/errors/codes/40310-account-does-not-permit-tls-connections.mdx new file mode 100644 index 0000000000..c0898deb9a --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40310-account-does-not-permit-tls-connections.mdx @@ -0,0 +1,11 @@ +--- +title: "40310: Account does not permit TLS connections" +meta_description: "The connection was rejected because it used TLS, but the account is configured not to allow TLS connections." +identifier: "account_does_not_permit_tls_connections" +redirect_from: + - "/docs/platform/errors/codes/40310" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40310.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The connection was rejected because it used TLS, but the account is configured not to allow TLS connections. 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 new file mode 100644 index 0000000000..d6303823e4 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40311-application-requires-a-tls-connection.mdx @@ -0,0 +1,11 @@ +--- +title: "40311: Application requires a TLS connection" +meta_description: "The connection was rejected because it did not use TLS, but the application requires TLS connections." +identifier: "application_requires_a_tls_connection" +redirect_from: + - "/docs/platform/errors/codes/40311" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40320-authentication-required.mdx b/src/pages/docs/platform/errors/codes/40320-authentication-required.mdx new file mode 100644 index 0000000000..3bde6e420b --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40320-authentication-required.mdx @@ -0,0 +1,11 @@ +--- +title: "40320: Authentication required" +meta_description: "The request was rejected because it carried no authentication credentials." +identifier: "authentication_required" +redirect_from: + - "/docs/platform/errors/codes/40320" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40320.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The request was rejected because it carried no authentication credentials. 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 new file mode 100644 index 0000000000..a15e1eafa4 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40330-account-not-permitted-in-cluster-or-region.mdx @@ -0,0 +1,11 @@ +--- +title: "40330: Account not permitted in this cluster or region" +meta_description: "The request reached a cluster or region the account is not permitted to use; the accompanying error message gives the specific reason." +identifier: "account_not_permitted_in_cluster_or_region" +redirect_from: + - "/docs/platform/errors/codes/40330" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..d39e83604f --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40331-account-not-permitted-in-cluster.mdx @@ -0,0 +1,11 @@ +--- +title: "40331: Account not permitted in this cluster" +meta_description: "The request reached an Ably cluster the account is not permitted to use." +identifier: "account_not_permitted_in_cluster" +redirect_from: + - "/docs/platform/errors/codes/40331" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..f89b412513 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40332-account-not-permitted-in-region.mdx @@ -0,0 +1,11 @@ +--- +title: "40332: Account not permitted in this region" +meta_description: "The request reached a region the account is not permitted to use." +identifier: "account_not_permitted_in_region" +redirect_from: + - "/docs/platform/errors/codes/40332" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40400-not-found.mdx b/src/pages/docs/platform/errors/codes/40400-not-found.mdx new file mode 100644 index 0000000000..084edbcab4 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40400-not-found.mdx @@ -0,0 +1,11 @@ +--- +title: "40400: Resource not found" +meta_description: "The requested resource does not exist, often because it has been deleted or the path or identifier used to reference it is incorrect." +identifier: "not_found" +redirect_from: + - "/docs/platform/errors/codes/40400" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/40500-method-not-allowed.mdx b/src/pages/docs/platform/errors/codes/40500-method-not-allowed.mdx new file mode 100644 index 0000000000..d1b7213e8d --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40500-method-not-allowed.mdx @@ -0,0 +1,11 @@ +--- +title: "40500: HTTP method not allowed" +meta_description: "The request used an HTTP method that the endpoint does not support." +identifier: "method_not_allowed" +redirect_from: + - "/docs/platform/errors/codes/40500" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40500.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The request used an HTTP method that the endpoint does not support. diff --git a/src/pages/docs/platform/errors/codes/40900-conflict.mdx b/src/pages/docs/platform/errors/codes/40900-conflict.mdx new file mode 100644 index 0000000000..a82d9d5cae --- /dev/null +++ b/src/pages/docs/platform/errors/codes/40900-conflict.mdx @@ -0,0 +1,11 @@ +--- +title: "40900: Conflict" +meta_description: "The request conflicted with the current state of the target, so it could not be completed." +identifier: "conflict" +redirect_from: + - "/docs/platform/errors/codes/40900" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/40900.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The request conflicted with the current state of the target, so it could not be completed. diff --git a/src/pages/docs/platform/errors/codes/41001-push-device-registration-expired.mdx b/src/pages/docs/platform/errors/codes/41001-push-device-registration-expired.mdx new file mode 100644 index 0000000000..624019a64b --- /dev/null +++ b/src/pages/docs/platform/errors/codes/41001-push-device-registration-expired.mdx @@ -0,0 +1,11 @@ +--- +title: "41001: Push device registration expired" +meta_description: "The push notification could not be delivered because the target device's registration is no longer valid. Registrations expire over time, and the device must register again before it can receive notifications." +identifier: "push_device_registration_expired" +redirect_from: + - "/docs/platform/errors/codes/41001" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/41001.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The push notification could not be delivered because the target device's registration is no longer valid. Registrations expire over time, and the device must register again before it can receive notifications. diff --git a/src/pages/docs/platform/errors/codes/42200-unprocessable-content.mdx b/src/pages/docs/platform/errors/codes/42200-unprocessable-content.mdx new file mode 100644 index 0000000000..6e6af293bf --- /dev/null +++ b/src/pages/docs/platform/errors/codes/42200-unprocessable-content.mdx @@ -0,0 +1,11 @@ +--- +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." +identifier: "unprocessable_content" +redirect_from: + - "/docs/platform/errors/codes/42200" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/42210-content-rejected.mdx b/src/pages/docs/platform/errors/codes/42210-content-rejected.mdx new file mode 100644 index 0000000000..da85ee026c --- /dev/null +++ b/src/pages/docs/platform/errors/codes/42210-content-rejected.mdx @@ -0,0 +1,11 @@ +--- +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." +identifier: "content_rejected" +redirect_from: + - "/docs/platform/errors/codes/42210" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/42211-content-rejected-by-before-publish-integration.mdx b/src/pages/docs/platform/errors/codes/42211-content-rejected-by-before-publish-integration.mdx new file mode 100644 index 0000000000..0e426c624e --- /dev/null +++ b/src/pages/docs/platform/errors/codes/42211-content-rejected-by-before-publish-integration.mdx @@ -0,0 +1,11 @@ +--- +title: "42211: Message rejected by integration" +meta_description: "A message was rejected by an integration configured to check messages before they are accepted." +identifier: "content_rejected_by_before_publish_integration" +redirect_from: + - "/docs/platform/errors/codes/42211" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/42211.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A message was rejected by an integration configured to check messages before they are accepted. diff --git a/src/pages/docs/platform/errors/codes/42212-content-rejected-by-validation.mdx b/src/pages/docs/platform/errors/codes/42212-content-rejected-by-validation.mdx new file mode 100644 index 0000000000..9997c35dd3 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/42212-content-rejected-by-validation.mdx @@ -0,0 +1,11 @@ +--- +title: "42212: Message rejected by content validation" +meta_description: "A message was rejected because it failed a content-validation check." +identifier: "content_rejected_by_validation" +redirect_from: + - "/docs/platform/errors/codes/42212" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/42212.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A message was rejected because it failed a content-validation check. diff --git a/src/pages/docs/platform/errors/codes/42213-content-rejected-by-moderation.mdx b/src/pages/docs/platform/errors/codes/42213-content-rejected-by-moderation.mdx new file mode 100644 index 0000000000..4cf6a1233e --- /dev/null +++ b/src/pages/docs/platform/errors/codes/42213-content-rejected-by-moderation.mdx @@ -0,0 +1,11 @@ +--- +title: "42213: Message rejected by moderation" +meta_description: "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." +identifier: "content_rejected_by_moderation" +redirect_from: + - "/docs/platform/errors/codes/42213" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/42213.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. diff --git a/src/pages/docs/platform/errors/codes/42910-rate-limit-exceeded-generic.mdx b/src/pages/docs/platform/errors/codes/42910-rate-limit-exceeded-generic.mdx new file mode 100644 index 0000000000..8b92fb72d3 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/42910-rate-limit-exceeded-generic.mdx @@ -0,0 +1,23 @@ +--- +title: "42910: System rate limit exceeded" +meta_description: "An operation was rejected because a system rate limit was exceeded. The limit protects Ably against overload; the operation can be retried." +identifier: "rate_limit_exceeded_generic" +redirect_from: + - "/docs/platform/errors/codes/42910" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/42910.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +An operation was rejected because a system rate limit was exceeded. The limit protects Ably against overload; the operation can be retried. + +## What you should do + +Retry the operation after a short delay, increasing the delay if it is rejected again. This is a protection Ably applies to keep the service healthy under load, not a limit specific to your account, so it is usually brief and clears on its own. If it persists, contact Ably. + +## Why it happens + +Ably applies system-level rate limits to protect the service from overload. While the system is shedding load, individual operations may be rejected until the pressure eases. This is independent of your account's own limits, and the specific protection involved is identified by the metric named in the error message. + +## What you'll see + +The operation is rejected. The error is reported with code 42910 and HTTP status 429, with a message of the form `Rate limit exceeded; request rejected (nonfatal); metric = ...`. 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 new file mode 100644 index 0000000000..2c06ac35ff --- /dev/null +++ b/src/pages/docs/platform/errors/codes/42911-rate-limit-exceeded-per-connection-inbound.mdx @@ -0,0 +1,25 @@ +--- +title: "42911: Per-connection publish rate exceeded" +meta_description: "A message was rejected because the connection published messages faster than the per-connection publish rate limit allows. Publishing far above the limit can escalate to the connection being closed." +identifier: "rate_limit_exceeded_per_connection_inbound" +redirect_from: + - "/docs/platform/errors/codes/42911" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/42911.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A message was rejected because the connection published messages faster than the per-connection publish rate limit allows. Publishing far above the limit can escalate to the connection being closed. + +## What you should do + +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). + +## Why it happens + +Each connection has a maximum rate at which it can publish messages, set by your account's limits. The limit covers everything this connection publishes across all the channels it is attached to, so it is reached when a single connection publishes too quickly overall, regardless of what other connections are doing. + +## What you'll see + +The publish is rejected and the message is not delivered. The connection stays open. The error is reported with code 42911 and HTTP status 429, with a message of the form `Rate limit exceeded; request rejected (nonfatal); metric = connection.inboundRate; ...`. diff --git a/src/pages/docs/platform/errors/codes/42912-rate-limit-channel-iteration-in-progress.mdx b/src/pages/docs/platform/errors/codes/42912-rate-limit-channel-iteration-in-progress.mdx new file mode 100644 index 0000000000..a1e3f1ce83 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/42912-rate-limit-channel-iteration-in-progress.mdx @@ -0,0 +1,23 @@ +--- +title: "42912: Channel enumeration already in progress" +meta_description: "A request to enumerate the channels active in an app was rejected because another enumeration was already running. Only one channel enumeration can run at a time for an app." +identifier: "rate_limit_channel_iteration_in_progress" +redirect_from: + - "/docs/platform/errors/codes/42912" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/42912.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A request to enumerate the channels active in an app was rejected because another enumeration was already running. Only one channel enumeration can run at a time for an app. + +## What you should do + +Wait for the in-progress enumeration to finish before starting another, since only one can run at a time. If your application makes these requests from more than one place, coordinate them so they do not overlap, or retry after a short delay. + +## Why it happens + +Enumerating the channels active in an app is an expensive operation, so Ably allows only one to run at a time for a given app. A request that arrives while another enumeration is still in progress is rejected rather than queued. + +## What you'll see + +The request is rejected. The error is reported with code 42912 and HTTP status 429, with a message of the form `Channel iteration call already in progress. Only 1 call(s) may be executed concurrently`. "Iteration" here is the internal term for channel enumeration. 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 new file mode 100644 index 0000000000..0bcd00068d --- /dev/null +++ b/src/pages/docs/platform/errors/codes/42913-rate-limit-exceeded-per-channel-inbound.mdx @@ -0,0 +1,27 @@ +--- +title: "42913: Per-channel publish rate exceeded" +meta_description: "A message was rejected because the rate of messages published to the channel exceeded its configured limit. The limit applies to all publishers to the channel combined, so it can be reached even when no single publisher is publishing quickly." +identifier: "rate_limit_exceeded_per_channel_inbound" +redirect_from: + - "/docs/platform/errors/codes/42913" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/42913.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A message was rejected because the rate of messages published to the channel exceeded its configured limit. The limit applies to all publishers to the channel combined, so it can be reached even when no single publisher is publishing quickly. + +## What you should do + +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). + +## Why it happens + +Each channel has a maximum rate at which messages can be published to it, set by your account's limits. This error means messages were published to the channel faster than that limit allows. + +The limit is shared across the whole channel: every message published to it, from any source, counts against one budget. So a channel can exceed its limit even when no individual publisher is publishing quickly, if enough of them publish at once. + +## What you'll see + +The publish is rejected and the message is not delivered. The channel stays attached, and publishing to other channels is unaffected. The error is reported with code 42913 and HTTP status 429, with a message of the form `Rate limit exceeded; request rejected (nonfatal); metric = channel.maxRate; ...`. 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 new file mode 100644 index 0000000000..8ed3f1f566 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/42914-rate-limit-exceeded-per-channel-bandwidth.mdx @@ -0,0 +1,27 @@ +--- +title: "42914: Per-channel publish bandwidth exceeded" +meta_description: "A message was rejected because the rate of data published to the channel exceeded its configured bandwidth limit. The limit applies to all publishers to the channel combined, so large messages can reach it even at a low message rate." +identifier: "rate_limit_exceeded_per_channel_bandwidth" +redirect_from: + - "/docs/platform/errors/codes/42914" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/42914.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A message was rejected because the rate of data published to the channel exceeded its configured bandwidth limit. The limit applies to all publishers to the channel combined, so large messages can reach it even at a low message rate. + +## What you should do + +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). + +## Why it happens + +Each channel has a maximum rate at which data can be published to it, set by your account's limits. This error means data was published to the channel faster than that bandwidth limit allows. + +Because the limit measures total data rather than the number of messages, it can be reached by a few large messages as easily as by many small ones. Like the per-channel message-rate limit, it is shared across the whole channel: every message published to it, from any source, counts against one budget. + +## What you'll see + +The publish is rejected and the message is not delivered. The channel stays attached, and publishing to other channels is unaffected. The error is reported with code 42914 and HTTP status 429, with a message of the form `Rate limit exceeded; request rejected (nonfatal); metric = channel.maxBandwidth; ...`. 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 new file mode 100644 index 0000000000..f04b4ae05f --- /dev/null +++ b/src/pages/docs/platform/errors/codes/42915-rate-limit-exceeded-per-connection-outbound.mdx @@ -0,0 +1,28 @@ +--- +title: "42915: Per-connection outbound message rate exceeded" +meta_description: "Messages were not delivered to a connection because the rate of messages being sent to it exceeded its per-connection outbound limit. The client is notified of the gap by a channel continuity loss, which it receives as error 80020." +identifier: "rate_limit_exceeded_per_connection_outbound" +redirect_from: + - "/docs/platform/errors/codes/42915" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/42915.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +Messages were not delivered to a connection because the rate of messages being sent to it exceeded its per-connection outbound limit. The client is notified of the gap by a channel continuity loss, which it receives as error 80020. + +## What you should do + +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). + +## Why it happens + +Each connection has a maximum rate at which Ably will deliver messages to it, set by your account's limits. When more messages than that need to be sent to a connection, Ably drops the excess and signals the gap to the client. This code records that the limit was reached; the gap itself is reported to the client as 80020. + +## What you'll see + +This code appears in your app's error statistics, recorded with HTTP status 429 and the metric `connection.outboundRate`. The client itself receives the continuity loss as error 80020. 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 new file mode 100644 index 0000000000..70814de1aa --- /dev/null +++ b/src/pages/docs/platform/errors/codes/42916-rate-limit-exceeded-per-connection-backlog.mdx @@ -0,0 +1,28 @@ +--- +title: "42916: Per-connection outbound resume rate exceeded" +meta_description: "Backlog messages were not delivered to a connection because the rate of delivering them exceeded its per-connection outbound limit. The client is notified of the gap by a channel continuity loss, which it receives as error 80020." +identifier: "rate_limit_exceeded_per_connection_backlog" +redirect_from: + - "/docs/platform/errors/codes/42916" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/42916.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +Backlog messages were not delivered to a connection because the rate of delivering them exceeded its per-connection outbound limit. The client is notified of the gap by a channel continuity loss, which it receives as error 80020. + +## What you should do + +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). + +## Why it happens + +After a connection reattaches to a channel, Ably replays the backlog of messages published while it was away. Each connection has a maximum rate at which Ably will deliver messages to it, set by your account's limits. If the backlog would be delivered faster than that, Ably drops the excess and signals the gap to the client. This code records that the limit was reached while delivering the backlog; the gap itself is reported to the client as 80020. + +## What you'll see + +This code appears in your app's error statistics, recorded with HTTP status 429 and the metric `connection.backlogRate`. The client itself receives the continuity loss as error 80020. 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 new file mode 100644 index 0000000000..ca973e7bc0 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/42917-rate-limit-exceeded-account-messages.mdx @@ -0,0 +1,25 @@ +--- +title: "42917: Account-wide message publish rate exceeded" +meta_description: "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." +identifier: "rate_limit_exceeded_account_messages" +redirect_from: + - "/docs/platform/errors/codes/42917" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/42917.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. + +## What you should do + +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). + +## Why it happens + +Your account has a maximum total rate at which messages can be published across all of its apps, set by your account's limits. When the account exceeds it, Ably rejects a proportion of messages to bring the account back within the limit. Because this applies across the whole account, an individual publish can be rejected even when the connection and channel it used are each well within their own limits. + +## What you'll see + +The publish is rejected and the message is not delivered. The error is reported with code 42917 and HTTP status 429, with a message of the form `Maximum account-wide instantaneous messages rate exceeded; permitted rate = ...; metric = messages.maxRate`. 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 new file mode 100644 index 0000000000..d9e9bb8f34 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/42918-rate-limit-exceeded-account-api-requests.mdx @@ -0,0 +1,25 @@ +--- +title: "42918: Account-wide API request rate exceeded" +meta_description: "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." +identifier: "rate_limit_exceeded_account_api_requests" +redirect_from: + - "/docs/platform/errors/codes/42918" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/42918.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. + +## What you should do + +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). + +## Why it happens + +Your account has a maximum total rate at which REST API requests can be made across all of its apps, set by your account's limits. When the account exceeds it, Ably rejects a proportion of requests to bring the account back within the limit. + +## What you'll see + +The request is rejected. The error is reported with code 42918 and HTTP status 429, with a message of the form `Maximum account-wide instantaneous apiRequests rate exceeded; permitted rate = ...; metric = apiRequests.maxRate`. diff --git a/src/pages/docs/platform/errors/codes/42920-rate-limit-exceeded-connection-fatal.mdx b/src/pages/docs/platform/errors/codes/42920-rate-limit-exceeded-connection-fatal.mdx new file mode 100644 index 0000000000..5e06d6101f --- /dev/null +++ b/src/pages/docs/platform/errors/codes/42920-rate-limit-exceeded-connection-fatal.mdx @@ -0,0 +1,23 @@ +--- +title: "42920: Connection terminated by a fatal rate limit" +meta_description: "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." +identifier: "rate_limit_exceeded_connection_fatal" +redirect_from: + - "/docs/platform/errors/codes/42920" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/42920.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. + +## What you should do + +The error message names the metric for the limit involved. Reduce the rate of the operation it identifies before reconnecting, otherwise the connection will be closed again if the behavior continues. + +## Why it happens + +Most rate limits reject individual operations without closing the connection. When a breach is severe or sustained enough, Ably closes the connection instead. This code is the general form of such a fatal close; specific cases have their own codes, such as 42921 for per-connection publishing and 42924 for protocol messages. + +## What you'll see + +The connection is closed. The error is reported with code 42920 and HTTP status 429. 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 new file mode 100644 index 0000000000..6b694f2a7b --- /dev/null +++ b/src/pages/docs/platform/errors/codes/42921-rate-limit-exceeded-per-connection-inbound-fatal.mdx @@ -0,0 +1,23 @@ +--- +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." +identifier: "rate_limit_exceeded_per_connection_inbound_fatal" +redirect_from: + - "/docs/platform/errors/codes/42921" +--- + +{/* 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. + +## 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). + +## 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. + +## What you'll see + +The connection is closed; unlike 42911, this is fatal. The error is reported with code 42921 and HTTP status 429, with a message of the form `Connection terminated; per-connection publish Rate limit exceeded; ...`. diff --git a/src/pages/docs/platform/errors/codes/42922-rate-limit-exceeded-too-many-requests.mdx b/src/pages/docs/platform/errors/codes/42922-rate-limit-exceeded-too-many-requests.mdx new file mode 100644 index 0000000000..47a6e7101c --- /dev/null +++ b/src/pages/docs/platform/errors/codes/42922-rate-limit-exceeded-too-many-requests.mdx @@ -0,0 +1,23 @@ +--- +title: "42922: Too many requests" +meta_description: "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." +identifier: "rate_limit_exceeded_too_many_requests" +redirect_from: + - "/docs/platform/errors/codes/42922" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/42922.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. + +## What you should do + +Back off and retry rather than repeating the request immediately, as short-lived bursts clear on their own. If your application is blocked persistently during legitimate use, contact Ably. + +## Why it happens + +Ably protects its service from excessive or abusive traffic by limiting requests at its network edge, before they reach the rest of the platform. When too many requests arrive in a short period, the excess is blocked until the rate subsides. This protection is separate from your account's configured rate limits. + +## What you'll see + +The request is rejected with HTTP status 429. Because it is blocked at the network edge rather than by the platform itself, the response carries the error in the headers `x-ably-errorcode: 42922` and `x-ably-errormessage: rate limit exceeded; too many requests`. diff --git a/src/pages/docs/platform/errors/codes/42923-integration-target-rate-limit-response.mdx b/src/pages/docs/platform/errors/codes/42923-integration-target-rate-limit-response.mdx new file mode 100644 index 0000000000..4de6ae4c89 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/42923-integration-target-rate-limit-response.mdx @@ -0,0 +1,28 @@ +--- +title: "42923: Integration target responded with rate limit error" +meta_description: "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." +identifier: "integration_target_rate_limit_response" +redirect_from: + - "/docs/platform/errors/codes/42923" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/42923.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. + +## What you should do + +This is your integration target's own rate limit rather than an Ably one: the target could not keep up with the rate at which Ably was invoking it. You can address it from either side: + +- **Let the target accept more.** Increase its capacity, or raise its own rate limit. +- **Invoke the target less often.** Narrow the integration's channel filter so it covers fewer channels. The filter is configured on the integration, for both [webhooks](https://ably.com/docs/platform/integrations/webhooks#filter) and [streaming integrations](https://ably.com/docs/platform/integrations/streaming#filter). + +Ably retries failed invocations, so short bursts may clear on their own. + +## Why it happens + +Whenever a message matches one of your integrations, Ably invokes the target you configured, such as a webhook endpoint, serverless function, or message queue. If that target responds with its own rate-limit error, Ably reports it under this code. It means the target is accepting invocations more slowly than Ably is making them, not that any Ably limit was reached. + +## What you'll see + +The error is reported with code 42923 and HTTP status 429. The exact message depends on the integration type, for example `HTTP endpoint returned rate limit error` for a webhook or `lambda returned rate limit error` for an AWS Lambda function. diff --git a/src/pages/docs/platform/errors/codes/42924-rate-limit-exceeded-protocol-message-rate-fatal.mdx b/src/pages/docs/platform/errors/codes/42924-rate-limit-exceeded-protocol-message-rate-fatal.mdx new file mode 100644 index 0000000000..a3fa3e6121 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/42924-rate-limit-exceeded-protocol-message-rate-fatal.mdx @@ -0,0 +1,23 @@ +--- +title: "42924: Per-connection protocol message rate exceeded" +meta_description: "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." +identifier: "rate_limit_exceeded_protocol_message_rate_fatal" +redirect_from: + - "/docs/platform/errors/codes/42924" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/42924.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. + +## What you should do + +The threshold is high (around 2000 protocol messages per second), well above what the official Ably SDKs send, so reaching it usually indicates a client that is not using an official SDK and is sending far more protocol messages than intended. Look for a loop or bug in that client, such as repeatedly attaching and detaching a channel or publishing in a tight loop. The connection can be re-established, but it will be closed again if the behavior continues. + +## Why it happens + +A connection may send only a limited number of protocol messages per second, around 2000, covering every client-initiated action on it and not just published messages. This is a safeguard against a misbehaving or runaway client. When a connection exceeds it, Ably closes the connection rather than rejecting individual messages. + +## What you'll see + +The connection is closed. The error is reported with code 42924 and HTTP status 429, with a message of the form `Connection terminated for abuse (inbound protocol message rate exceeded 2000/s)`. 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 new file mode 100644 index 0000000000..5d6a9ca0d0 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/42925-rate-limit-exceeded-account-integrations.mdx @@ -0,0 +1,25 @@ +--- +title: "42925: Account-wide integration invocation rate exceeded" +meta_description: "An integration invocation was dropped because the invocation rate across the account exceeded the configured account-wide limit. A proportion of invocations are dropped to bring the account back within its limit." +identifier: "rate_limit_exceeded_account_integrations" +redirect_from: + - "/docs/platform/errors/codes/42925" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/42925.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +An integration invocation was dropped because the invocation rate across the account exceeded the configured account-wide limit. A proportion of invocations are dropped to bring the account back within its limit. + +## What you should do + +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). + +## Why it happens + +Your account has a maximum total rate at which integrations can be invoked across all of its apps, set by your account's limits. This covers all of your integrations together, such as webhooks, serverless functions, and message queues. When the account exceeds the limit, Ably drops a proportion of invocations to bring it back within the limit. The messages that triggered them are published as normal. + +## What you'll see + +The triggering messages are published normally; only the integration invocations are affected. The error is reported with code 42925 and HTTP status 429, with a message of the form `Maximum account-wide instantaneous reactor.webhook rate exceeded; permitted rate = ...; metric = reactor.webhook.maxRate`. The metric names the integration type, and "reactor" is the internal term for integrations. 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 new file mode 100644 index 0000000000..a73e9019d3 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/42926-rate-limit-exceeded-account-push-notifications.mdx @@ -0,0 +1,25 @@ +--- +title: "42926: Account-wide push notification rate exceeded" +meta_description: "A push notification was dropped because the publish rate of push notifications across the account exceeded the configured account-wide limit. A proportion of push notifications are dropped to bring the account back within its limit." +identifier: "rate_limit_exceeded_account_push_notifications" +redirect_from: + - "/docs/platform/errors/codes/42926" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/42926.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A push notification was dropped because the publish rate of push notifications across the account exceeded the configured account-wide limit. A proportion of push notifications are dropped to bring the account back within its limit. + +## What you should do + +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). + +## Why it happens + +Your account has a maximum total rate at which push notifications can be sent across all of its apps, set by your account's limits. When the account exceeds it, Ably drops a proportion of push notifications to bring the account back within the limit. Message publishing is unaffected. + +## What you'll see + +Affected push notifications are not delivered, while message publishing continues as normal. The error is reported with code 42926 and HTTP status 429, with a message of the form `Maximum account-wide instantaneous pushRequests rate exceeded; permitted rate = ...; metric = pushRequests.maxRate`. diff --git a/src/pages/docs/platform/errors/codes/50000-internal-error.mdx b/src/pages/docs/platform/errors/codes/50000-internal-error.mdx new file mode 100644 index 0000000000..5207f80478 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/50000-internal-error.mdx @@ -0,0 +1,11 @@ +--- +title: "50000: Internal server error" +meta_description: "The request could not be completed because of an unexpected error inside the Ably platform." +identifier: "internal_error" +redirect_from: + - "/docs/platform/errors/codes/50000" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..88e1bd8b0d --- /dev/null +++ b/src/pages/docs/platform/errors/codes/50001-internal-channel-error.mdx @@ -0,0 +1,11 @@ +--- +title: "50001: Internal channel error" +meta_description: "An operation on a channel failed because of an unexpected error inside the Ably platform." +identifier: "internal_channel_error" +redirect_from: + - "/docs/platform/errors/codes/50001" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..eb58e5a903 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/50002-internal-connection-error.mdx @@ -0,0 +1,11 @@ +--- +title: "50002: Internal connection error" +meta_description: "An operation on a connection failed because of an unexpected error inside the Ably platform." +identifier: "internal_connection_error" +redirect_from: + - "/docs/platform/errors/codes/50002" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/50003-timeout-error.mdx b/src/pages/docs/platform/errors/codes/50003-timeout-error.mdx new file mode 100644 index 0000000000..ad5e19fd0c --- /dev/null +++ b/src/pages/docs/platform/errors/codes/50003-timeout-error.mdx @@ -0,0 +1,11 @@ +--- +title: "50003: Request timed out server-side" +meta_description: "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." +identifier: "timeout_error" +redirect_from: + - "/docs/platform/errors/codes/50003" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/50004-server-temporarily-busy.mdx b/src/pages/docs/platform/errors/codes/50004-server-temporarily-busy.mdx new file mode 100644 index 0000000000..d49910d227 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/50004-server-temporarily-busy.mdx @@ -0,0 +1,11 @@ +--- +title: "50004: Server temporarily busy" +meta_description: "The request was rejected because the server handling it could not accept it at that moment. The condition is transient." +identifier: "server_temporarily_busy" +redirect_from: + - "/docs/platform/errors/codes/50004" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/50004.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The request was rejected because the server handling it could not accept it at that moment. The condition is transient. diff --git a/src/pages/docs/platform/errors/codes/50005-service-temporarily-unavailable.mdx b/src/pages/docs/platform/errors/codes/50005-service-temporarily-unavailable.mdx new file mode 100644 index 0000000000..8d83636ce2 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/50005-service-temporarily-unavailable.mdx @@ -0,0 +1,11 @@ +--- +title: "50005: Service temporarily unavailable" +meta_description: "The request could not be served because the service was temporarily in a locked-down state, during which requests are not accepted. The condition is temporary and expected to clear." +identifier: "service_temporarily_unavailable" +redirect_from: + - "/docs/platform/errors/codes/50005" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/50005.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The request could not be served because the service was temporarily in a locked-down state, during which requests are not accepted. The condition is temporary and expected to clear. diff --git a/src/pages/docs/platform/errors/codes/50006-connection-superseded-by-a-newer-connection.mdx b/src/pages/docs/platform/errors/codes/50006-connection-superseded-by-a-newer-connection.mdx new file mode 100644 index 0000000000..7b9ccaa173 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/50006-connection-superseded-by-a-newer-connection.mdx @@ -0,0 +1,11 @@ +--- +title: "50006: Connection superseded by a newer connection" +meta_description: "The connection's state was taken over by a more recent connection, typically a reconnection or resume. This only arises on a deprecated Ably protocol version; upgrade to a recent Ably SDK release to avoid it." +identifier: "connection_superseded_by_a_newer_connection" +redirect_from: + - "/docs/platform/errors/codes/50006" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/50006.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The connection's state was taken over by a more recent connection, typically a reconnection or resume. This only arises on a deprecated Ably protocol version; upgrade to a recent Ably SDK release to avoid it. diff --git a/src/pages/docs/platform/errors/codes/50010-edge-proxy-internal-error.mdx b/src/pages/docs/platform/errors/codes/50010-edge-proxy-internal-error.mdx new file mode 100644 index 0000000000..445939691b --- /dev/null +++ b/src/pages/docs/platform/errors/codes/50010-edge-proxy-internal-error.mdx @@ -0,0 +1,11 @@ +--- +title: "50010: Edge proxy internal error" +meta_description: "Ably's edge proxy service encountered an unknown internal error while handling the request and could not complete it." +identifier: "edge_proxy_internal_error" +redirect_from: + - "/docs/platform/errors/codes/50010" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/50010.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +Ably's edge proxy service encountered an unknown internal error while handling the request and could not complete it. diff --git a/src/pages/docs/platform/errors/codes/50210-invalid-platform-response.mdx b/src/pages/docs/platform/errors/codes/50210-invalid-platform-response.mdx new file mode 100644 index 0000000000..30ae17e415 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/50210-invalid-platform-response.mdx @@ -0,0 +1,11 @@ +--- +title: "50210: Invalid response from the platform" +meta_description: "Ably's edge proxy service received an invalid response from the Ably platform behind it and could not complete the request. The condition is usually transient." +identifier: "invalid_platform_response" +redirect_from: + - "/docs/platform/errors/codes/50210" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/50210.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +Ably's edge proxy service received an invalid response from the Ably platform behind it and could not complete the request. The condition is usually transient. diff --git a/src/pages/docs/platform/errors/codes/50310-platform-temporarily-unavailable.mdx b/src/pages/docs/platform/errors/codes/50310-platform-temporarily-unavailable.mdx new file mode 100644 index 0000000000..1a0e9a7ece --- /dev/null +++ b/src/pages/docs/platform/errors/codes/50310-platform-temporarily-unavailable.mdx @@ -0,0 +1,11 @@ +--- +title: "50310: Platform temporarily unavailable" +meta_description: "Ably's edge proxy service received a service-unavailable response from the Ably platform behind it and could not complete the request. The condition is usually transient." +identifier: "platform_temporarily_unavailable" +redirect_from: + - "/docs/platform/errors/codes/50310" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/50310.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +Ably's edge proxy service received a service-unavailable response from the Ably platform behind it and could not complete the request. The condition is usually transient. diff --git a/src/pages/docs/platform/errors/codes/50320-traffic-temporarily-redirected.mdx b/src/pages/docs/platform/errors/codes/50320-traffic-temporarily-redirected.mdx new file mode 100644 index 0000000000..9b78e9fd9d --- /dev/null +++ b/src/pages/docs/platform/errors/codes/50320-traffic-temporarily-redirected.mdx @@ -0,0 +1,11 @@ +--- +title: "50320: Traffic temporarily redirected" +meta_description: "Ably's Active Traffic Management temporarily redirected traffic away from its normal path, and the request was affected while that redirection was in place. The condition is temporary." +identifier: "traffic_temporarily_redirected" +redirect_from: + - "/docs/platform/errors/codes/50320" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/50320.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +Ably's Active Traffic Management temporarily redirected traffic away from its normal path, and the request was affected while that redirection was in place. The condition is temporary. diff --git a/src/pages/docs/platform/errors/codes/50330-request-reached-the-wrong-cluster.mdx b/src/pages/docs/platform/errors/codes/50330-request-reached-the-wrong-cluster.mdx new file mode 100644 index 0000000000..494078fe91 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/50330-request-reached-the-wrong-cluster.mdx @@ -0,0 +1,11 @@ +--- +title: "50330: Request reached the wrong cluster" +meta_description: "The request arrived at a cluster that was not the one meant to handle it and should be retried. This can happen briefly during DNS changes while traffic is being migrated between clusters." +identifier: "request_reached_the_wrong_cluster" +redirect_from: + - "/docs/platform/errors/codes/50330" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/50330.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The request arrived at a cluster that was not the one meant to handle it and should be retried. This can happen briefly during DNS changes while traffic is being migrated between clusters. diff --git a/src/pages/docs/platform/errors/codes/50410-edge-proxy-timed-out-waiting-for-platform.mdx b/src/pages/docs/platform/errors/codes/50410-edge-proxy-timed-out-waiting-for-platform.mdx new file mode 100644 index 0000000000..a99e84c817 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/50410-edge-proxy-timed-out-waiting-for-platform.mdx @@ -0,0 +1,11 @@ +--- +title: "50410: Edge proxy timed out waiting for platform" +meta_description: "Ably's edge proxy service did not receive a response from the Ably platform behind it within the time allowed, so the request was abandoned. The condition is usually transient." +identifier: "edge_proxy_timed_out_waiting_for_platform" +redirect_from: + - "/docs/platform/errors/codes/50410" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/50410.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +Ably's edge proxy service did not receive a response from the Ably platform behind it within the time allowed, so the request was abandoned. The condition is usually transient. diff --git a/src/pages/docs/platform/errors/codes/70000-integration-operation-failed.mdx b/src/pages/docs/platform/errors/codes/70000-integration-operation-failed.mdx new file mode 100644 index 0000000000..dddb060851 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/70000-integration-operation-failed.mdx @@ -0,0 +1,11 @@ +--- +title: "70000: Integration operation failed" +meta_description: "An integration could not complete an operation against its configured target." +identifier: "integration_operation_failed" +redirect_from: + - "/docs/platform/errors/codes/70000" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/70000.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +An integration could not complete an operation against its configured target. diff --git a/src/pages/docs/platform/errors/codes/70001-integration-invocation-failed.mdx b/src/pages/docs/platform/errors/codes/70001-integration-invocation-failed.mdx new file mode 100644 index 0000000000..83569745d5 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/70001-integration-invocation-failed.mdx @@ -0,0 +1,25 @@ +--- +title: "70001: Integration invocation failed" +meta_description: "An integration could not invoke its configured target: Ably either could not reach the target, or reached it but could not deliver the data. The specific failure depends on the integration type and is named in the error message." +identifier: "integration_invocation_failed" +redirect_from: + - "/docs/platform/errors/codes/70001" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/70001.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +An integration could not invoke its configured target: Ably either could not reach the target, or reached it but could not deliver the data. The specific failure depends on the integration type and is named in the error message. + +## What you should do + +Start with the underlying error in the message: it names the specific failure for the integration type. For a webhook or other HTTP target, that is typically a refused or reset connection, a timeout, a DNS lookup failure, or a TLS certificate the connection won't accept. For a queue or streaming target such as Kafka, Kinesis, or SQS, it is typically a failure to connect to the service or to deliver the message. Use it to check that the configured target is reachable, correctly addressed, and accepting data from Ably. + +Ably retries failed invocations with a backoff, so a brief outage recovers on its own. Persistent failures mean the target stays unavailable and data is not being delivered. + +## Why it happens + +When a message matches one of your [integrations](https://ably.com/docs/integrations), Ably invokes the target you configured. This error means that invocation failed: Ably could not connect to the target, or connected but could not deliver to it. Where the target does respond but rejects the request, the error is reported as 70002 instead. + +## What you'll see + +The error is reported with code 70001. The message names the operation that failed and includes the underlying error, in a form that depends on the integration type: for an HTTP target, `Webhook operation failed (post operation failed); err = ` or `POST failed: `, carrying HTTP status 503; for other integration types, a target-specific message such as `Kafka client was unable to send the message: `. diff --git a/src/pages/docs/platform/errors/codes/70002-integration-target-returned-an-error-status.mdx b/src/pages/docs/platform/errors/codes/70002-integration-target-returned-an-error-status.mdx new file mode 100644 index 0000000000..40740be0d7 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/70002-integration-target-returned-an-error-status.mdx @@ -0,0 +1,25 @@ +--- +title: "70002: Integration target returned an error status" +meta_description: "An integration invoked an HTTP target, such as a webhook, which replied with an HTTP status outside the successful 2xx range. Ably treats any non-2xx response as a failed delivery." +identifier: "integration_target_returned_an_error_status" +redirect_from: + - "/docs/platform/errors/codes/70002" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/70002.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +An integration invoked an HTTP target, such as a webhook, which replied with an HTTP status outside the successful 2xx range. Ably treats any non-2xx response as a failed delivery. + +## What you should do + +Determine the HTTP status code the target returned from the error message, and check the target's own logs, since it received the request and chose to reject it. A 4xx status points to the request being treated as malformed or unauthorized, so check any authentication, required headers, or payload shape the target enforces. A 5xx status points to a fault in the target itself. + +To have a delivery counted as successful, the target must respond with a 2xx status. Ably retries server errors with a backoff, so a transient 5xx recovers on its own; repeated client errors will keep failing until the target accepts the request. + +## Why it happens + +When a message matches one of your [integrations](https://ably.com/docs/integrations), Ably invokes the target you configured. For an HTTP target such as a webhook, only a 2xx response counts as success; this error means the target replied with something else, commonly a 4xx because it rejected the request or a 5xx because it failed to process it. Where no response is received at all, the error is reported as 70001 instead. + +## What you'll see + +The error is reported with code 70002, and the target's own status code is included in the message, which takes the form `Webhook operation failed (post operation returned unexpected code); statusCode = ` or `POST returned HTTP status `. diff --git a/src/pages/docs/platform/errors/codes/70003-too-many-concurrent-integration-requests.mdx b/src/pages/docs/platform/errors/codes/70003-too-many-concurrent-integration-requests.mdx new file mode 100644 index 0000000000..fdd988336f --- /dev/null +++ b/src/pages/docs/platform/errors/codes/70003-too-many-concurrent-integration-requests.mdx @@ -0,0 +1,11 @@ +--- +title: "70003: Too many concurrent integration requests" +meta_description: "An integration was not invoked because the number of requests already in flight for it had reached the permitted maximum. This usually happens when a target responds more slowly than the rate at which matching messages arrive." +identifier: "too_many_concurrent_integration_requests" +redirect_from: + - "/docs/platform/errors/codes/70003" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/70003.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +An integration was not invoked because the number of requests already in flight for it had reached the permitted maximum. This usually happens when a target responds more slowly than the rate at which matching messages arrive. diff --git a/src/pages/docs/platform/errors/codes/70004-integration-refused-to-process-a-message.mdx b/src/pages/docs/platform/errors/codes/70004-integration-refused-to-process-a-message.mdx new file mode 100644 index 0000000000..193c98fbf2 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/70004-integration-refused-to-process-a-message.mdx @@ -0,0 +1,11 @@ +--- +title: "70004: Integration refused to process a message" +meta_description: "An integration reached its configured target, but the target did not accept the message because its contents were invalid or unsupported for that target type." +identifier: "integration_refused_to_process_a_message" +redirect_from: + - "/docs/platform/errors/codes/70004" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/70004.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +An integration reached its configured target, but the target did not accept the message because its contents were invalid or unsupported for that target type. diff --git a/src/pages/docs/platform/errors/codes/70005-amqp-message-delivery-timed-out.mdx b/src/pages/docs/platform/errors/codes/70005-amqp-message-delivery-timed-out.mdx new file mode 100644 index 0000000000..4bc5469acd --- /dev/null +++ b/src/pages/docs/platform/errors/codes/70005-amqp-message-delivery-timed-out.mdx @@ -0,0 +1,11 @@ +--- +title: "70005: AMQP message delivery timed out" +meta_description: "A message could not be delivered to an Ably message queue integration because the delivery did not complete within the allowed time. This usually points to the queue being unavailable or slow to accept the message." +identifier: "amqp_message_delivery_timed_out" +redirect_from: + - "/docs/platform/errors/codes/70005" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/70005.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A message could not be delivered to an Ably message queue integration because the delivery did not complete within the allowed time. This usually points to the queue being unavailable or slow to accept the message. diff --git a/src/pages/docs/platform/errors/codes/70006-amqp-message-queue-busy.mdx b/src/pages/docs/platform/errors/codes/70006-amqp-message-queue-busy.mdx new file mode 100644 index 0000000000..4bfc2ae025 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/70006-amqp-message-queue-busy.mdx @@ -0,0 +1,11 @@ +--- +title: "70006: AMQP message queue busy" +meta_description: "A message could not be delivered to an Ably message queue integration because the message queue was too busy to accept it. This is usually transient and eases as load falls." +identifier: "amqp_message_queue_busy" +redirect_from: + - "/docs/platform/errors/codes/70006" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/70006.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A message could not be delivered to an Ably message queue integration because the message queue was too busy to accept it. This is usually transient and eases as load falls. diff --git a/src/pages/docs/platform/errors/codes/71000-exchange-error.mdx b/src/pages/docs/platform/errors/codes/71000-exchange-error.mdx new file mode 100644 index 0000000000..2c128b4308 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/71000-exchange-error.mdx @@ -0,0 +1,11 @@ +--- +title: "71000: Exchange error" +meta_description: "A request involving Ably Exchange failed for a reason that could not be attributed to a more specific cause. Exchange lets a publisher expose channels as a product that subscribers can receive." +identifier: "exchange_error" +redirect_from: + - "/docs/platform/errors/codes/71000" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/71000.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A request involving Ably Exchange failed for a reason that could not be attributed to a more specific cause. Exchange lets a publisher expose channels as a product that subscribers can receive. diff --git a/src/pages/docs/platform/errors/codes/71001-forced-re-attachment-after-permissions-change.mdx b/src/pages/docs/platform/errors/codes/71001-forced-re-attachment-after-permissions-change.mdx new file mode 100644 index 0000000000..ab944d7199 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/71001-forced-re-attachment-after-permissions-change.mdx @@ -0,0 +1,11 @@ +--- +title: "71001: Forced re-attachment after permissions change" +meta_description: "An Exchange channel was detached and re-attached because the permissions governing access to it changed, so the existing attachment no longer reflected what the client was entitled to receive." +identifier: "forced_re_attachment_after_permissions_change" +redirect_from: + - "/docs/platform/errors/codes/71001" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/71001.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +An Exchange channel was detached and re-attached because the permissions governing access to it changed, so the existing attachment no longer reflected what the client was entitled to receive. diff --git a/src/pages/docs/platform/errors/codes/71100-exchange-publisher-error.mdx b/src/pages/docs/platform/errors/codes/71100-exchange-publisher-error.mdx new file mode 100644 index 0000000000..a686802502 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/71100-exchange-publisher-error.mdx @@ -0,0 +1,11 @@ +--- +title: "71100: Exchange publisher error" +meta_description: "A request involving an Exchange publisher failed for a reason that could not be attributed to a more specific cause. A publisher is the party that exposes channels as an Exchange product." +identifier: "exchange_publisher_error" +redirect_from: + - "/docs/platform/errors/codes/71100" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/71100.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A request involving an Exchange publisher failed for a reason that could not be attributed to a more specific cause. A publisher is the party that exposes channels as an Exchange product. diff --git a/src/pages/docs/platform/errors/codes/71101-publisher-not-found.mdx b/src/pages/docs/platform/errors/codes/71101-publisher-not-found.mdx new file mode 100644 index 0000000000..1bedad2ae3 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/71101-publisher-not-found.mdx @@ -0,0 +1,11 @@ +--- +title: "71101: Publisher not found" +meta_description: "The Exchange request referred to a publisher that does not exist. This usually means the publisher identifier was incorrect or the publisher is no longer available." +identifier: "publisher_not_found" +redirect_from: + - "/docs/platform/errors/codes/71101" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/71101.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The Exchange request referred to a publisher that does not exist. This usually means the publisher identifier was incorrect or the publisher is no longer available. diff --git a/src/pages/docs/platform/errors/codes/71102-publisher-not-enabled-for-exchange.mdx b/src/pages/docs/platform/errors/codes/71102-publisher-not-enabled-for-exchange.mdx new file mode 100644 index 0000000000..7ec5ff1761 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/71102-publisher-not-enabled-for-exchange.mdx @@ -0,0 +1,11 @@ +--- +title: "71102: Publisher not enabled for Exchange" +meta_description: "The request referred to a party that exists but has not been enabled as an Exchange publisher, so it cannot expose channels as a product for subscribers to receive." +identifier: "publisher_not_enabled_for_exchange" +redirect_from: + - "/docs/platform/errors/codes/71102" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/71102.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The request referred to a party that exists but has not been enabled as an Exchange publisher, so it cannot expose channels as a product for subscribers to receive. diff --git a/src/pages/docs/platform/errors/codes/71200-exchange-product-error.mdx b/src/pages/docs/platform/errors/codes/71200-exchange-product-error.mdx new file mode 100644 index 0000000000..6a54efaf13 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/71200-exchange-product-error.mdx @@ -0,0 +1,11 @@ +--- +title: "71200: Exchange product error" +meta_description: "A request involving an Exchange product failed for a reason that could not be attributed to a more specific cause. A product is the set of channels a publisher exposes for subscribers to receive." +identifier: "exchange_product_error" +redirect_from: + - "/docs/platform/errors/codes/71200" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/71200.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A request involving an Exchange product failed for a reason that could not be attributed to a more specific cause. A product is the set of channels a publisher exposes for subscribers to receive. diff --git a/src/pages/docs/platform/errors/codes/71201-product-not-found.mdx b/src/pages/docs/platform/errors/codes/71201-product-not-found.mdx new file mode 100644 index 0000000000..fcf8af2b5a --- /dev/null +++ b/src/pages/docs/platform/errors/codes/71201-product-not-found.mdx @@ -0,0 +1,11 @@ +--- +title: "71201: Product not found" +meta_description: "The Exchange request referred to a product that does not exist. This usually means the product identifier was incorrect or the product is no longer available from the publisher." +identifier: "product_not_found" +redirect_from: + - "/docs/platform/errors/codes/71201" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/71201.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The Exchange request referred to a product that does not exist. This usually means the product identifier was incorrect or the product is no longer available from the publisher. diff --git a/src/pages/docs/platform/errors/codes/71202-product-disabled.mdx b/src/pages/docs/platform/errors/codes/71202-product-disabled.mdx new file mode 100644 index 0000000000..7d9192f53f --- /dev/null +++ b/src/pages/docs/platform/errors/codes/71202-product-disabled.mdx @@ -0,0 +1,11 @@ +--- +title: "71202: Product disabled" +meta_description: "The Exchange product exists but has been disabled by the publisher, so its channels are not currently available to subscribers." +identifier: "product_disabled" +redirect_from: + - "/docs/platform/errors/codes/71202" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/71202.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The Exchange product exists but has been disabled by the publisher, so its channels are not currently available to subscribers. diff --git a/src/pages/docs/platform/errors/codes/71203-channel-not-part-of-product.mdx b/src/pages/docs/platform/errors/codes/71203-channel-not-part-of-product.mdx new file mode 100644 index 0000000000..d240549363 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/71203-channel-not-part-of-product.mdx @@ -0,0 +1,11 @@ +--- +title: "71203: Channel not part of product" +meta_description: "The requested channel is not one of the channels that the Exchange product exposes, so it cannot be received through that product." +identifier: "channel_not_part_of_product" +redirect_from: + - "/docs/platform/errors/codes/71203" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/71203.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The requested channel is not one of the channels that the Exchange product exposes, so it cannot be received through that product. diff --git a/src/pages/docs/platform/errors/codes/71204-forced-re-attachment-after-product-remapping.mdx b/src/pages/docs/platform/errors/codes/71204-forced-re-attachment-after-product-remapping.mdx new file mode 100644 index 0000000000..903c8ea996 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/71204-forced-re-attachment-after-product-remapping.mdx @@ -0,0 +1,11 @@ +--- +title: "71204: Forced re-attachment after product remapping" +meta_description: "An Exchange channel was detached and re-attached because the product was remapped to a different channel namespace, so the existing attachment no longer pointed at the channel the product now exposes." +identifier: "forced_re_attachment_after_product_remapping" +redirect_from: + - "/docs/platform/errors/codes/71204" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/71204.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +An Exchange channel was detached and re-attached because the product was remapped to a different channel namespace, so the existing attachment no longer pointed at the channel the product now exposes. diff --git a/src/pages/docs/platform/errors/codes/71300-exchange-subscription-error.mdx b/src/pages/docs/platform/errors/codes/71300-exchange-subscription-error.mdx new file mode 100644 index 0000000000..9c7541e58e --- /dev/null +++ b/src/pages/docs/platform/errors/codes/71300-exchange-subscription-error.mdx @@ -0,0 +1,11 @@ +--- +title: "71300: Exchange subscription error" +meta_description: "A request involving an Exchange subscription failed for a reason that could not be attributed to a more specific cause. A subscription is what grants a subscriber access to a publisher's product." +identifier: "exchange_subscription_error" +redirect_from: + - "/docs/platform/errors/codes/71300" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/71300.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A request involving an Exchange subscription failed for a reason that could not be attributed to a more specific cause. A subscription is what grants a subscriber access to a publisher's product. diff --git a/src/pages/docs/platform/errors/codes/71301-subscription-disabled.mdx b/src/pages/docs/platform/errors/codes/71301-subscription-disabled.mdx new file mode 100644 index 0000000000..2fe2f80de8 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/71301-subscription-disabled.mdx @@ -0,0 +1,11 @@ +--- +title: "71301: Subscription disabled" +meta_description: "The subscription to the Exchange product exists but has been disabled, so its channels are not currently available to the subscriber." +identifier: "subscription_disabled" +redirect_from: + - "/docs/platform/errors/codes/71301" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/71301.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The subscription to the Exchange product exists but has been disabled, so its channels are not currently available to the subscriber. 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 new file mode 100644 index 0000000000..7549941dd5 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/71302-no-subscription-to-product.mdx @@ -0,0 +1,11 @@ +--- +title: "71302: No subscription to product" +meta_description: "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." +identifier: "no_subscription_to_product" +redirect_from: + - "/docs/platform/errors/codes/71302" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/71303-channel-outside-subscription-filter.mdx b/src/pages/docs/platform/errors/codes/71303-channel-outside-subscription-filter.mdx new file mode 100644 index 0000000000..4efbd592ce --- /dev/null +++ b/src/pages/docs/platform/errors/codes/71303-channel-outside-subscription-filter.mdx @@ -0,0 +1,11 @@ +--- +title: "71303: Channel outside subscription filter" +meta_description: "The requested channel does not match the channel filter defined for the subscription to the Exchange product, so it falls outside the set of channels that subscription grants access to." +identifier: "channel_outside_subscription_filter" +redirect_from: + - "/docs/platform/errors/codes/71303" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/71303.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The requested channel does not match the channel filter defined for the subscription to the Exchange product, so it falls outside the set of channels that subscription grants access to. 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 new file mode 100644 index 0000000000..1d3f7220c5 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/72000-livesync-operation-failed.mdx @@ -0,0 +1,11 @@ +--- +title: "72000: LiveSync connector operation failed" +meta_description: "A LiveSync database connector hit an unexpected error while running, so the operation it was attempting did not complete." +identifier: "livesync_operation_failed" +redirect_from: + - "/docs/platform/errors/codes/72000" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/72001-livesync-publish-failed.mdx b/src/pages/docs/platform/errors/codes/72001-livesync-publish-failed.mdx new file mode 100644 index 0000000000..ca5317212f --- /dev/null +++ b/src/pages/docs/platform/errors/codes/72001-livesync-publish-failed.mdx @@ -0,0 +1,11 @@ +--- +title: "72001: LiveSync connector could not publish" +meta_description: "A LiveSync database connector read a change from the database but could not publish the resulting message to Ably. The change may not have reached the channel it was destined for." +identifier: "livesync_publish_failed" +redirect_from: + - "/docs/platform/errors/codes/72001" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/72001.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A LiveSync database connector read a change from the database but could not publish the resulting message to Ably. The change may not have reached the channel it was destined for. diff --git a/src/pages/docs/platform/errors/codes/72002-livesync-table-unhealthy.mdx b/src/pages/docs/platform/errors/codes/72002-livesync-table-unhealthy.mdx new file mode 100644 index 0000000000..4eb8fd52af --- /dev/null +++ b/src/pages/docs/platform/errors/codes/72002-livesync-table-unhealthy.mdx @@ -0,0 +1,29 @@ +--- +title: "72002: LiveSync database connector is unhealthy" +meta_description: "A LiveSync database connector could not read from the table or collection it is configured to use, because that table or collection is missing, renamed, or no longer accessible to the connector." +identifier: "livesync_table_unhealthy" +redirect_from: + - "/docs/platform/errors/codes/72002" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/72002.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A LiveSync database connector could not read from the table or collection it is configured to use, because that table or collection is missing, renamed, or no longer accessible to the connector. + +## What you should do + +The connector runs a periodic health check on the database it reads from, and this error means that check failed. What to confirm depends on which connector you are using. + +For a [Postgres connector](https://ably.com/docs/livesync/postgres), confirm the outbox and nodes tables it uses still exist, are named correctly in the connector configuration, and that the connector's database user still has access to them. + +For a [MongoDB connector](https://ably.com/docs/livesync/mongodb), confirm the watched collection still exists, is named correctly in the connector configuration, and that the connector's database user still has the `find` and `changeStream` permissions on it. + +Once the underlying problem is resolved, the connector recovers on its next health check; no manual restart is needed. + +## Why it happens + +A [LiveSync](https://ably.com/docs/products/livesync) database connector continuously reads changes from a table or collection and publishes them to Ably. This error means the connector could not open or query that table or collection, because it is missing, has been renamed, or its permissions have changed. A database the connector cannot connect to at all is reported as 72003 instead, and an individual change that cannot be mapped to a channel as 72004. + +## What you'll see + +The error is reported with code 72002 and HTTP status 500. The message names the affected table and takes the form `unable to connect to table: : table is unhealthy: `, or `unable to connect to tables: ` when the connector cannot open its tables at startup. 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 new file mode 100644 index 0000000000..18aacdf708 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/72003-livesync-cannot-connect-db.mdx @@ -0,0 +1,11 @@ +--- +title: "72003: LiveSync connector cannot reach the database" +meta_description: "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." +identifier: "livesync_cannot_connect_db" +redirect_from: + - "/docs/platform/errors/codes/72003" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..0aeef39282 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/72004-livesync-no-channel-key.mdx @@ -0,0 +1,11 @@ +--- +title: "72004: LiveSync connector could not identify target channel" +meta_description: "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." +identifier: "livesync_no_channel_key" +redirect_from: + - "/docs/platform/errors/codes/72004" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..9254519b20 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/72005-livesync-invalid-pipeline.mdx @@ -0,0 +1,11 @@ +--- +title: "72005: LiveSync MongoDB pipeline is invalid" +meta_description: "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." +identifier: "livesync_invalid_pipeline" +redirect_from: + - "/docs/platform/errors/codes/72005" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..abe6ed93cc --- /dev/null +++ b/src/pages/docs/platform/errors/codes/72006-livesync-cannot-resume.mdx @@ -0,0 +1,11 @@ +--- +title: "72006: LiveSync connector failed to resume" +meta_description: "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." +identifier: "livesync_cannot_resume" +redirect_from: + - "/docs/platform/errors/codes/72006" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..6405460983 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/72007-livesync-cannot-store-resume-token.mdx @@ -0,0 +1,11 @@ +--- +title: "72007: LiveSync connector failed to track its position" +meta_description: "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." +identifier: "livesync_cannot_store_resume_token" +redirect_from: + - "/docs/platform/errors/codes/72007" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/72008-livesync-change-stream-history-lost.mdx b/src/pages/docs/platform/errors/codes/72008-livesync-change-stream-history-lost.mdx new file mode 100644 index 0000000000..8683147b19 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/72008-livesync-change-stream-history-lost.mdx @@ -0,0 +1,11 @@ +--- +title: "72008: LiveSync connector failed to read history" +meta_description: "A LiveSync MongoDB connector's change stream could no longer continue from its last recorded position, because the history it needed was no longer available in the database. Changes made in the intervening period may have been missed." +identifier: "livesync_change_stream_history_lost" +redirect_from: + - "/docs/platform/errors/codes/72008" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/72008.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A LiveSync MongoDB connector's change stream could no longer continue from its last recorded position, because the history it needed was no longer available in the database. Changes made in the intervening period may have been missed. diff --git a/src/pages/docs/platform/errors/codes/80000-connection-failed.mdx b/src/pages/docs/platform/errors/codes/80000-connection-failed.mdx new file mode 100644 index 0000000000..e67f918e49 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80000-connection-failed.mdx @@ -0,0 +1,11 @@ +--- +title: "80000: Connection failed" +meta_description: "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." +identifier: "connection_failed" +redirect_from: + - "/docs/platform/errors/codes/80000" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/80001-connection-failed-no-transport.mdx b/src/pages/docs/platform/errors/codes/80001-connection-failed-no-transport.mdx new file mode 100644 index 0000000000..0b513b3922 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80001-connection-failed-no-transport.mdx @@ -0,0 +1,11 @@ +--- +title: "80001: Connection failed as no usable transport available" +meta_description: "No usable transport could be established to carry the connection, for example when the network blocks both WebSocket and the HTTP-based fallbacks." +identifier: "connection_failed_no_transport" +redirect_from: + - "/docs/platform/errors/codes/80001" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80001.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +No usable transport could be established to carry the connection, for example when the network blocks both WebSocket and the HTTP-based fallbacks. diff --git a/src/pages/docs/platform/errors/codes/80002-connection-suspended.mdx b/src/pages/docs/platform/errors/codes/80002-connection-suspended.mdx new file mode 100644 index 0000000000..3d81f13b23 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80002-connection-suspended.mdx @@ -0,0 +1,11 @@ +--- +title: "80002: Connection suspended" +meta_description: "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." +identifier: "connection_suspended" +redirect_from: + - "/docs/platform/errors/codes/80002" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/80003-connection-disconnected.mdx b/src/pages/docs/platform/errors/codes/80003-connection-disconnected.mdx new file mode 100644 index 0000000000..58e6613467 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80003-connection-disconnected.mdx @@ -0,0 +1,25 @@ +--- +title: "80003: Connection disconnected" +meta_description: "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." +identifier: "connection_disconnected" +redirect_from: + - "/docs/platform/errors/codes/80003" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80003.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. + +## What you should do + +Usually nothing. Disconnection is a routine part of maintaining a realtime connection, and the Ably SDK handles it for you: it moves the connection to the `disconnected` state, retries automatically, and returns to `connected`, resuming where it left off. A 80003 that clears on its own is expected, not a fault. + +Act only if the connection does not return, or disconnects often enough to disrupt your application. Frequent disconnections usually point to the network path between the client and Ably, such as the client's own connectivity, or a proxy, firewall, or load balancer that drops long-lived connections; check there first. + +## Why it happens + +The transport carrying the connection was lost, commonly a network change or interruption on the client side, or Ably closing the transport so the client reconnects. It is not an authentication failure or a deliberate close by your application, both of which are reported with their own codes. While disconnected, the SDK keeps any messages you publish and sends them once it reconnects. + +## What you'll see + +This code is not delivered as a server response in the usual case; it is the reason attached to the connection's `disconnected` state. The connection enters the `disconnected` state, carrying reason code 80003 with the message `Connection disconnected`, and returns to `connected` once the transport is re-established. diff --git a/src/pages/docs/platform/errors/codes/80004-connection-already-established.mdx b/src/pages/docs/platform/errors/codes/80004-connection-already-established.mdx new file mode 100644 index 0000000000..09a7a2f3a8 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80004-connection-already-established.mdx @@ -0,0 +1,11 @@ +--- +title: "80004: Connection already established" +meta_description: "A request to open a connection was made while a connection was already active." +identifier: "connection_already_established" +redirect_from: + - "/docs/platform/errors/codes/80004" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80004.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A request to open a connection was made while a connection was already active. 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 new file mode 100644 index 0000000000..726076d385 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80005-connection-no-longer-available.mdx @@ -0,0 +1,11 @@ +--- +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." +identifier: "connection_no_longer_available" +redirect_from: + - "/docs/platform/errors/codes/80005" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/80006-connection-messages-expired.mdx b/src/pages/docs/platform/errors/codes/80006-connection-messages-expired.mdx new file mode 100644 index 0000000000..04e1505c20 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80006-connection-messages-expired.mdx @@ -0,0 +1,11 @@ +--- +title: "80006: Connection continuity not guaranteed as messages expired" +meta_description: "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." +identifier: "connection_messages_expired" +redirect_from: + - "/docs/platform/errors/codes/80006" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80006.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. diff --git a/src/pages/docs/platform/errors/codes/80007-connection-message-limit-exceeded.mdx b/src/pages/docs/platform/errors/codes/80007-connection-message-limit-exceeded.mdx new file mode 100644 index 0000000000..b79920a612 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80007-connection-message-limit-exceeded.mdx @@ -0,0 +1,11 @@ +--- +title: "80007: Connection continuity not guaranteed as message limit exceeded" +meta_description: "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." +identifier: "connection_message_limit_exceeded" +redirect_from: + - "/docs/platform/errors/codes/80007" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80007.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. diff --git a/src/pages/docs/platform/errors/codes/80008-connection-recovery-failed-on-an-outdated-sdk.mdx b/src/pages/docs/platform/errors/codes/80008-connection-recovery-failed-on-an-outdated-sdk.mdx new file mode 100644 index 0000000000..1e580281c0 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80008-connection-recovery-failed-on-an-outdated-sdk.mdx @@ -0,0 +1,25 @@ +--- +title: "80008: Connection recovery failed on an outdated SDK" +meta_description: "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." +identifier: "connection_recovery_failed_on_an_outdated_sdk" +redirect_from: + - "/docs/platform/errors/codes/80008" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80008.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. + +## What you should do + +Update the Ably SDK to a current version. This error comes only from older SDKs that connect using an earlier version of the Ably protocol, which is being [retired](https://ably.com/docs/platform/deprecate/protocol-v1), so upgrading is the durable fix and is worth doing regardless of this error. + +Until you upgrade, it is not fatal. When recovery fails, Ably still establishes a fresh connection, so re-attaching your channels and continuing works. Messages published while the original connection was gone are not recovered, so retrieve any that matter from [history](https://ably.com/docs/storage-history/storage). + +## Why it happens + +An older SDK recovers a dropped connection by asking Ably to resume it from where it left off. This error means the connection could not be resumed, most often because too much time had passed and its state had already been discarded; recovery is only possible for [a short time](https://ably.com/docs/connect/states) after a connection drops. + +## What you'll see + +The failure is reported as a non-fatal error on the new connection rather than preventing it. The error carries code 80008, commonly with the message `Unable to recover connection (connection expired)`. diff --git a/src/pages/docs/platform/errors/codes/80009-connection-not-established.mdx b/src/pages/docs/platform/errors/codes/80009-connection-not-established.mdx new file mode 100644 index 0000000000..2bf7000228 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80009-connection-not-established.mdx @@ -0,0 +1,11 @@ +--- +title: "80009: Connection not established" +meta_description: "An operation that requires an open connection was attempted while the client was not connected." +identifier: "connection_not_established" +redirect_from: + - "/docs/platform/errors/codes/80009" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80009.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +An operation that requires an open connection was attempted while the client was not connected. diff --git a/src/pages/docs/platform/errors/codes/80010-invalid-operation-on-the-connection.mdx b/src/pages/docs/platform/errors/codes/80010-invalid-operation-on-the-connection.mdx new file mode 100644 index 0000000000..52ed7c6b42 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80010-invalid-operation-on-the-connection.mdx @@ -0,0 +1,11 @@ +--- +title: "80010: Invalid operation on the connection" +meta_description: "An operation was attempted on a connection that was not in a valid state to carry it, such as one that had already been closed or replaced." +identifier: "invalid_operation_on_the_connection" +redirect_from: + - "/docs/platform/errors/codes/80010" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80010.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +An operation was attempted on a connection that was not in a valid state to carry it, such as one that had already been closed or replaced. diff --git a/src/pages/docs/platform/errors/codes/80011-connection-incompatible-auth-params.mdx b/src/pages/docs/platform/errors/codes/80011-connection-incompatible-auth-params.mdx new file mode 100644 index 0000000000..153296b99b --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80011-connection-incompatible-auth-params.mdx @@ -0,0 +1,11 @@ +--- +title: "80011: Connection state recovery failed due to incompatible auth" +meta_description: "A dropped connection could not be recovered because the authentication details presented on the new connection did not match those of the original, so the previous connection could not be continued." +identifier: "connection_incompatible_auth_params" +redirect_from: + - "/docs/platform/errors/codes/80011" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80011.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A dropped connection could not be recovered because the authentication details presented on the new connection did not match those of the original, so the previous connection could not be continued. diff --git a/src/pages/docs/platform/errors/codes/80012-connection-invalid-serial.mdx b/src/pages/docs/platform/errors/codes/80012-connection-invalid-serial.mdx new file mode 100644 index 0000000000..d0e123c6e8 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80012-connection-invalid-serial.mdx @@ -0,0 +1,11 @@ +--- +title: "80012: Connection continuity not guaranteed as serial was invalid" +meta_description: "A connection was resumed without a valid connection serial to identify the point it had reached, so there was no reliable position to continue from. The connection continues, but continuity across the gap is not guaranteed." +identifier: "connection_invalid_serial" +redirect_from: + - "/docs/platform/errors/codes/80012" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80012.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A connection was resumed without a valid connection serial to identify the point it had reached, so there was no reliable position to continue from. The connection continues, but continuity across the gap is not guaranteed. diff --git a/src/pages/docs/platform/errors/codes/80013-protocol-error.mdx b/src/pages/docs/platform/errors/codes/80013-protocol-error.mdx new file mode 100644 index 0000000000..442057987e --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80013-protocol-error.mdx @@ -0,0 +1,11 @@ +--- +title: "80013: Protocol error" +meta_description: "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." +identifier: "protocol_error" +redirect_from: + - "/docs/platform/errors/codes/80013" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80013.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. 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 new file mode 100644 index 0000000000..3d4ffe184b --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80014-connection-timed-out.mdx @@ -0,0 +1,11 @@ +--- +title: "80014: Connection timed out" +meta_description: "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." +identifier: "connection_timed_out" +redirect_from: + - "/docs/platform/errors/codes/80014" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/80015-incompatible-connection-parameters.mdx b/src/pages/docs/platform/errors/codes/80015-incompatible-connection-parameters.mdx new file mode 100644 index 0000000000..ebe1099012 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80015-incompatible-connection-parameters.mdx @@ -0,0 +1,11 @@ +--- +title: "80015: Incompatible connection parameters" +meta_description: "The connection could not be established because the parameters supplied when opening it were not compatible with one another or with what Ably supports." +identifier: "incompatible_connection_parameters" +redirect_from: + - "/docs/platform/errors/codes/80015" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80015.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The connection could not be established because the parameters supplied when opening it were not compatible with one another or with what Ably supports. 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 new file mode 100644 index 0000000000..529ef471e1 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80016-connection-replaced-by-a-newer-one.mdx @@ -0,0 +1,11 @@ +--- +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." +identifier: "connection_replaced_by_a_newer_one" +redirect_from: + - "/docs/platform/errors/codes/80016" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/80017-connection-closed.mdx b/src/pages/docs/platform/errors/codes/80017-connection-closed.mdx new file mode 100644 index 0000000000..fb570ab899 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80017-connection-closed.mdx @@ -0,0 +1,11 @@ +--- +title: "80017: Connection closed" +meta_description: "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." +identifier: "connection_closed" +redirect_from: + - "/docs/platform/errors/codes/80017" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/80018-invalid-connection-key.mdx b/src/pages/docs/platform/errors/codes/80018-invalid-connection-key.mdx new file mode 100644 index 0000000000..7bfcacae3b --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80018-invalid-connection-key.mdx @@ -0,0 +1,25 @@ +--- +title: "80018: Invalid connection key" +meta_description: "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." +identifier: "invalid_connection_key" +redirect_from: + - "/docs/platform/errors/codes/80018" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80018.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. + +## What you should do + +The connection itself is fine: the client still connects, just with a new connection ID rather than continuing the previous one. The one effect to be aware of is presence, where a member is identified by its connection ID, so the client re-enters as a new member. + +Whether to act depends on the SDK. With a current SDK, the key is one the SDK manages itself while resuming a dropped connection, so a malformed one is unexpected and points to a problem in the SDK rather than your configuration. Supplying a recovery key yourself, through the [`recover` option](https://ably.com/docs/connect/states), applies only to older SDKs; there, an invalid key means recovery never succeeds, so confirm it is stored and restored intact, not truncated, re-encoded, or replaced. + +## Why it happens + +The connection key supplied could not be parsed. This is a structural problem with the value itself: the wrong string, a corrupted one, or one altered in transit or storage, rather than a key that is merely too old. A valid key whose connection has expired is reported as 80008 instead. The same malformed key supplied on a REST publish is reported as 40006, because there the request fails rather than continuing on a fresh connection. + +## What you'll see + +The error is reported with code 80018 and HTTP status 400, with a message of the form `invalid connection key`. When it occurs while recovering or resuming a connection, the connection reaches the connected state but with a new connection ID, rather than continuing the previous one. 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 new file mode 100644 index 0000000000..a353513b49 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80019-token-request-failed.mdx @@ -0,0 +1,11 @@ +--- +title: "80019: Token request failed" +meta_description: "The Ably SDK failed to retrieve a token from the configured authUrl or authCallback." +identifier: "token_request_failed" +redirect_from: + - "/docs/platform/errors/codes/80019" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..04f20e4355 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80020-connection-discontinuity-message-rate-exceeded.mdx @@ -0,0 +1,28 @@ +--- +title: "80020: Continuity lost as message delivery rate exceeded" +meta_description: "Messages were dropped because they were being delivered to the connection faster than its per-connection rate limit allows. Continuity is lost on the affected channels: they keep receiving new messages, but the dropped ones are not redelivered." +identifier: "connection_discontinuity_message_rate_exceeded" +redirect_from: + - "/docs/platform/errors/codes/80020" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80020.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +Messages were dropped because they were being delivered to the connection faster than its per-connection rate limit allows. Continuity is lost on the affected channels: they keep receiving new messages, but the dropped ones are not redelivered. + +## What you should do + +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). + +## Why it happens + +Each connection has a maximum rate at which Ably will deliver messages to it, set by your account's limits. When a connection is subscribed to more message traffic than that allows, Ably cannot deliver all of it, so it drops the excess and signals the gap to the affected channels as a continuity loss rather than silently skipping messages. + +## What you'll see + +The affected channels report a continuity loss but stay attached. The error is reported with code 80020 and HTTP status 400, with a message of the form `Continuity loss on channel as maximum server-to-client message rate exceeded; permitted rate = ...`. 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 new file mode 100644 index 0000000000..d6dacf84b7 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80021-rate-limit-exceeded-account-connection-creation.mdx @@ -0,0 +1,11 @@ +--- +title: "80021: Account-wide connection creation rate exceeded" +meta_description: "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." +identifier: "rate_limit_exceeded_account_connection_creation" +redirect_from: + - "/docs/platform/errors/codes/80021" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..2cc542466b --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80022-connection-not-found.mdx @@ -0,0 +1,11 @@ +--- +title: "80022: Connection not found" +meta_description: "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." +identifier: "connection_not_found" +redirect_from: + - "/docs/platform/errors/codes/80022" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..38bd73af39 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80023-connection-re-established-in-a-different-region.mdx @@ -0,0 +1,27 @@ +--- +title: "80023: Connection re-established in a different region" +meta_description: "The client reconnected to a different Ably region from the one it was using, so it could not keep its connection ID and was given a new one." +identifier: "connection_re_established_in_a_different_region" +redirect_from: + - "/docs/platform/errors/codes/80023" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80023.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The client reconnected to a different Ably region from the one it was using, so it could not keep its connection ID and was given a new one. + +## What you should do + +Nothing. The connection is established normally and keeps working. The difference is that it has a new connection ID rather than continuing the previous one. + +The only thing to be aware of is presence: a presence member is identified by both its client ID and connection ID, so when the client re-enters presence after reconnecting in a different region it appears as a new member rather than the one it was registered as before. + +## Why it happens + +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. + +## 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. 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 new file mode 100644 index 0000000000..7366b0d556 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80024-outdated-ably-sdk-version.mdx @@ -0,0 +1,28 @@ +--- +title: "80024: Outdated Ably SDK version" +meta_description: "The connecting Ably SDK is an old version, and the way it connects to Ably is being retired. Connections from these SDK versions increasingly fail until they can no longer connect." +identifier: "outdated_ably_sdk_version" +redirect_from: + - "/docs/platform/errors/codes/80024" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80024.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The connecting Ably SDK is an old version, and the way it connects to Ably is being retired. Connections from these SDK versions increasingly fail until they can no longer connect. + +## What you should do + +Update the Ably SDK you are using to a supported version. See the [deprecation notice](https://ably.com/docs/platform/deprecate/protocol-v1) for the versions affected and the ones to upgrade to. + +## Why it happens + +Older versions of the Ably SDKs connect to Ably using an earlier version of the Ably protocol. Ably is retiring it in favor of a newer version that is more efficient and scalable and supports features the older one cannot. + +## What you'll see + +The error is reported with code 80024 and HTTP status 400. You may see it only intermittently at first: the retirement is rolled out gradually, so for a period some connections using the old protocol version fail while others still succeed. There are two messages, depending on the stage of the retirement: + +- 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. diff --git a/src/pages/docs/platform/errors/codes/80030-client-restriction-not-satisfied.mdx b/src/pages/docs/platform/errors/codes/80030-client-restriction-not-satisfied.mdx new file mode 100644 index 0000000000..5cd538bc42 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/80030-client-restriction-not-satisfied.mdx @@ -0,0 +1,11 @@ +--- +title: "80030: Connection failed due to a client restriction" +meta_description: "The connection was refused because a restriction placed on the client was not met. Restrictions can limit which clients are allowed to connect based on conditions set for the application." +identifier: "client_restriction_not_satisfied" +redirect_from: + - "/docs/platform/errors/codes/80030" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/80030.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The connection was refused because a restriction placed on the client was not met. Restrictions can limit which clients are allowed to connect based on conditions set for the application. diff --git a/src/pages/docs/platform/errors/codes/90000-channel-operation-failed.mdx b/src/pages/docs/platform/errors/codes/90000-channel-operation-failed.mdx new file mode 100644 index 0000000000..d1228d1ca0 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/90000-channel-operation-failed.mdx @@ -0,0 +1,11 @@ +--- +title: "90000: Channel operation failed" +meta_description: "A channel operation, such as attaching, detaching, or publishing, could not be completed." +identifier: "channel_operation_failed" +redirect_from: + - "/docs/platform/errors/codes/90000" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/90000.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A channel operation, such as attaching, detaching, or publishing, could not be completed. 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 new file mode 100644 index 0000000000..f568f2ad3a --- /dev/null +++ b/src/pages/docs/platform/errors/codes/90001-channel-operation-failed-invalid-channel-state.mdx @@ -0,0 +1,11 @@ +--- +title: "90001: Channel in an invalid state for the operation" +meta_description: "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." +identifier: "channel_operation_failed_invalid_channel_state" +redirect_from: + - "/docs/platform/errors/codes/90001" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..d1fa139edd --- /dev/null +++ b/src/pages/docs/platform/errors/codes/90002-channel-history-could-not-be-retrieved.mdx @@ -0,0 +1,11 @@ +--- +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." +identifier: "channel_history_could_not_be_retrieved" +redirect_from: + - "/docs/platform/errors/codes/90002" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..f48cafcfe9 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/90003-channel-continuity-not-guaranteed.mdx @@ -0,0 +1,28 @@ +--- +title: "90003: Channel continuity not guaranteed" +meta_description: "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." +identifier: "channel_continuity_not_guaranteed" +redirect_from: + - "/docs/platform/errors/codes/90003" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/90003.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. + +## What you should do + +The channel stays attached and keeps delivering new messages, so nothing is broken. Whether to act on the messages that may have been missed depends on your application: + +- If it can tolerate occasionally missing some messages, no action is needed and the error can be ignored. +- If it cannot tolerate missing messages, enable [persistence](https://ably.com/docs/storage-history/storage) on the channel and have your application fetch the messages it might have missed from [history](https://ably.com/docs/storage-history/history) whenever it encounters this error. + +## Why it happens + +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. + +## 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. 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 new file mode 100644 index 0000000000..d7cef2b69b --- /dev/null +++ b/src/pages/docs/platform/errors/codes/90004-channel-backlog-too-large.mdx @@ -0,0 +1,28 @@ +--- +title: "90004: Channel backlog too large" +meta_description: "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." +identifier: "channel_backlog_too_large" +redirect_from: + - "/docs/platform/errors/codes/90004" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/90004.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. + +## What you should do + +The channel stays attached and keeps delivering new messages, so nothing is broken. Whether to act on the messages that weren't replayed depends on your application: + +- If it can tolerate missing them, no action is needed and the error can be ignored. +- If it cannot tolerate missing them, enable [persistence](https://ably.com/docs/storage-history/storage) on the channel and have your application fetch the messages it did not receive from [history](https://ably.com/docs/storage-history/history) whenever it encounters this error. + +## Why it happens + +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. + +## What you'll see + +The error is reported with code 90004 and HTTP status 404, with the message `Unable to recover channel (message limit exceeded)`. 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 new file mode 100644 index 0000000000..6513db709e --- /dev/null +++ b/src/pages/docs/platform/errors/codes/90005-channel-resumed-in-a-different-region.mdx @@ -0,0 +1,28 @@ +--- +title: "90005: Channel resumed in a different region" +meta_description: "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." +identifier: "channel_resumed_in_a_different_region" +redirect_from: + - "/docs/platform/errors/codes/90005" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/90005.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. + +## What you should do + +The channel stays attached and keeps delivering new messages, so nothing is broken. Whether to act on the messages that weren't replayed depends on your application: + +- If it can tolerate missing them, no action is needed and the error can be ignored. +- If it cannot tolerate missing them, enable [persistence](https://ably.com/docs/storage-history/storage) on the channel and have your application fetch the messages it did not receive from [history](https://ably.com/docs/storage-history/history) whenever it encounters this error. + +## Why it happens + +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. + +The record of the order of messages is specific to the region each client was connected to. If a client reconnects to a different region, there is no way to tell which messages it had already received. In this case, the client won't receive any missed messages, only those published from the point it reconnected. + +## 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. diff --git a/src/pages/docs/platform/errors/codes/90006-channel-history-request-had-no-limit.mdx b/src/pages/docs/platform/errors/codes/90006-channel-history-request-had-no-limit.mdx new file mode 100644 index 0000000000..9d0920c7b9 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/90006-channel-history-request-had-no-limit.mdx @@ -0,0 +1,11 @@ +--- +title: "90006: Channel history request had no limit" +meta_description: "A request for a channel's message history could not be served because it asked for the complete history with no limit on how many messages to return." +identifier: "channel_history_request_had_no_limit" +redirect_from: + - "/docs/platform/errors/codes/90006" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/90006.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A request for a channel's message history could not be served because it asked for the complete history with no limit on how many messages to return. 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 new file mode 100644 index 0000000000..9de3a09866 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/90007-channel-operation-timed-out.mdx @@ -0,0 +1,11 @@ +--- +title: "90007: Channel operation timed out" +meta_description: "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." +identifier: "channel_operation_timed_out" +redirect_from: + - "/docs/platform/errors/codes/90007" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..2511d919a6 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/90008-attach-point-not-found.mdx @@ -0,0 +1,35 @@ +--- +title: "90008: Attach point too old for untilAttach history" +meta_description: "A history request using untilAttach relies on the channel's attach point still being among recent messages. In this case it was not, so the request could not be served and no messages were returned." +identifier: "attach_point_not_found" +redirect_from: + - "/docs/platform/errors/codes/90008" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/90008.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A history request using untilAttach relies on the channel's attach point still being among recent messages. In this case it was not, so the request could not be served and no messages were returned. + +## What you should do + +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. + +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. +- **Leave the older messages out.** If the client does not need them, continue with only the messages it already received. + +Which is best depends on whether duplicate messages or missing history is worse for your use case. + +## 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. + +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 + +The whole request fails and no messages are returned. The error is reported with code 90008 and HTTP status 400, with the message `Unable to get channel history: attach point not found`. diff --git a/src/pages/docs/platform/errors/codes/90009-subscribe-mode-not-enabled.mdx b/src/pages/docs/platform/errors/codes/90009-subscribe-mode-not-enabled.mdx new file mode 100644 index 0000000000..bfae4c70ce --- /dev/null +++ b/src/pages/docs/platform/errors/codes/90009-subscribe-mode-not-enabled.mdx @@ -0,0 +1,11 @@ +--- +title: "90009: Subscribe operation failed as subscribe mode not enabled" +meta_description: "Messages could not be delivered to a subscriber because the channel had not requested the subscribe mode in its channel options. Messages are only delivered to clients that request that mode, so the listener never fires." +identifier: "subscribe_mode_not_enabled" +redirect_from: + - "/docs/platform/errors/codes/90009" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/90009.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +Messages could not be delivered to a subscriber because the channel had not requested the subscribe mode in its channel options. Messages are only delivered to clients that request that mode, so the listener never fires. 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 new file mode 100644 index 0000000000..b467714bde --- /dev/null +++ b/src/pages/docs/platform/errors/codes/90010-too-many-channels.mdx @@ -0,0 +1,11 @@ +--- +title: "90010: Too many channels" +meta_description: "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." +identifier: "too_many_channels" +redirect_from: + - "/docs/platform/errors/codes/90010" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..073158b207 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/90021-rate-limit-exceeded-account-channel-creation.mdx @@ -0,0 +1,11 @@ +--- +title: "90021: Account-wide channel creation rate exceeded" +meta_description: "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." +identifier: "rate_limit_exceeded_account_channel_creation" +redirect_from: + - "/docs/platform/errors/codes/90021" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..619ae74d6f --- /dev/null +++ b/src/pages/docs/platform/errors/codes/91000-cannot-enter-presence-without-a-client-id.mdx @@ -0,0 +1,11 @@ +--- +title: "91000: Cannot enter presence without a clientId" +meta_description: "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." +identifier: "cannot_enter_presence_without_a_client_id" +redirect_from: + - "/docs/platform/errors/codes/91000" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..3047110558 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/91001-cannot-enter-presence-in-the-channels-current-state.mdx @@ -0,0 +1,11 @@ +--- +title: "91001: Cannot enter presence in the channel's current state" +meta_description: "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." +identifier: "cannot_enter_presence_in_the_channels_current_state" +redirect_from: + - "/docs/platform/errors/codes/91001" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/91002-cannot-leave-presence-that-was-never-entered.mdx b/src/pages/docs/platform/errors/codes/91002-cannot-leave-presence-that-was-never-entered.mdx new file mode 100644 index 0000000000..24a1614a43 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/91002-cannot-leave-presence-that-was-never-entered.mdx @@ -0,0 +1,11 @@ +--- +title: "91002: Cannot leave presence that was never entered" +meta_description: "A request to leave the presence set was rejected because the clientId was not a member of it." +identifier: "cannot_leave_presence_that_was_never_entered" +redirect_from: + - "/docs/platform/errors/codes/91002" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/91002.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A request to leave the presence set was rejected because the clientId was not a member of it. 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 new file mode 100644 index 0000000000..ea33791cc6 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/91003-too-many-presence-members.mdx @@ -0,0 +1,11 @@ +--- +title: "91003: Too many presence members" +meta_description: "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." +identifier: "too_many_presence_members" +redirect_from: + - "/docs/platform/errors/codes/91003" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/91004-unable-to-automatically-re-enter-presence.mdx b/src/pages/docs/platform/errors/codes/91004-unable-to-automatically-re-enter-presence.mdx new file mode 100644 index 0000000000..424529dbb3 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/91004-unable-to-automatically-re-enter-presence.mdx @@ -0,0 +1,11 @@ +--- +title: "91004: Unable to automatically re-enter presence" +meta_description: "After reconnecting, the Ably SDK tried to re-enter the presence set on the client's behalf but the attempt did not succeed, so the member was not restored to the presence set." +identifier: "unable_to_automatically_re_enter_presence" +redirect_from: + - "/docs/platform/errors/codes/91004" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/91004.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +After reconnecting, the Ably SDK tried to re-enter the presence set on the client's behalf but the attempt did not succeed, so the member was not restored to the presence set. 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 new file mode 100644 index 0000000000..89384adfeb --- /dev/null +++ b/src/pages/docs/platform/errors/codes/91005-presence-state-out-of-sync.mdx @@ -0,0 +1,11 @@ +--- +title: "91005: Presence state out of sync" +meta_description: "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." +identifier: "presence_state_out_of_sync" +redirect_from: + - "/docs/platform/errors/codes/91005" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/91006-total-presence-set-data-too-large.mdx b/src/pages/docs/platform/errors/codes/91006-total-presence-set-data-too-large.mdx new file mode 100644 index 0000000000..5cdcf60e69 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/91006-total-presence-set-data-too-large.mdx @@ -0,0 +1,11 @@ +--- +title: "91006: Total presence set data too large" +meta_description: "A request to enter the presence set was rejected because the combined size of the data held by members on the channel would exceed the maximum permitted for the presence set." +identifier: "total_presence_set_data_too_large" +redirect_from: + - "/docs/platform/errors/codes/91006" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/91006.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A request to enter the presence set was rejected because the combined size of the data held by members on the channel would exceed the maximum permitted for the presence set. diff --git a/src/pages/docs/platform/errors/codes/91007-unexpected-loss-of-presence-membership.mdx b/src/pages/docs/platform/errors/codes/91007-unexpected-loss-of-presence-membership.mdx new file mode 100644 index 0000000000..936ebf849b --- /dev/null +++ b/src/pages/docs/platform/errors/codes/91007-unexpected-loss-of-presence-membership.mdx @@ -0,0 +1,25 @@ +--- +title: "91007: Unexpected loss of presence membership" +meta_description: "The connection was removed from the presence set despite still being active, so the channel was detached to prompt the Ably SDK to automatically re-enter presence. The condition is usually transient." +identifier: "unexpected_loss_of_presence_membership" +redirect_from: + - "/docs/platform/errors/codes/91007" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/91007.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The connection was removed from the presence set despite still being active, so the channel was detached to prompt the Ably SDK to automatically re-enter presence. The condition is usually transient. + +## What you should do + +Usually nothing. A client that entered presence re-enters it automatically after this error: the channel detaches, re-attaches, and the member rejoins the presence set without any action. + +There is nothing in your application to change, because the cause is internal to Ably rather than your configuration. If this error is having a negative impact on your application, [report it to Ably](https://ably.com/support). + +## Why it happens + +During routine changes on Ably's side, such as a failover or a rebalancing of capacity, a presence member can be dropped from the presence set even though its connection is still active. Ably detects the inconsistency and detaches the channel so the client re-attaches and re-enters presence, restoring the member. + +## What you'll see + +The channel is detached and then re-attached, and the connection re-enters presence; published messages and other channels are unaffected. The error is reported with code 91007 and HTTP status 500, with the message `Unexpected loss of presence membership information for this connection, requesting reattach to trigger automatic presence reentry`. diff --git a/src/pages/docs/platform/errors/codes/91008-presence-subscribe-mode-not-enabled.mdx b/src/pages/docs/platform/errors/codes/91008-presence-subscribe-mode-not-enabled.mdx new file mode 100644 index 0000000000..17e896e3ae --- /dev/null +++ b/src/pages/docs/platform/errors/codes/91008-presence-subscribe-mode-not-enabled.mdx @@ -0,0 +1,11 @@ +--- +title: "91008: Presence operation failed as presence_subscribe mode not enabled" +meta_description: "The presence members of a channel could not be retrieved because the channel had not requested the presence_subscribe mode in its channel options. Presence state is only delivered to clients that request that mode." +identifier: "presence_subscribe_mode_not_enabled" +redirect_from: + - "/docs/platform/errors/codes/91008" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/91008.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +The presence members of a channel could not be retrieved because the channel had not requested the presence_subscribe mode in its channel options. Presence state is only delivered to clients that request that mode. diff --git a/src/pages/docs/platform/errors/codes/91100-presence-member-left-as-their-connection-closed.mdx b/src/pages/docs/platform/errors/codes/91100-presence-member-left-as-their-connection-closed.mdx new file mode 100644 index 0000000000..32daf70d1e --- /dev/null +++ b/src/pages/docs/platform/errors/codes/91100-presence-member-left-as-their-connection-closed.mdx @@ -0,0 +1,11 @@ +--- +title: "91100: Presence member left as their connection closed" +meta_description: "A presence member was removed from the presence set because it was no longer present, usually because the connection it entered on was closed." +identifier: "presence_member_left_as_their_connection_closed" +redirect_from: + - "/docs/platform/errors/codes/91100" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/91100.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +A presence member was removed from the presence set because it was no longer present, usually because the connection it entered on was closed. 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 new file mode 100644 index 0000000000..ac24373c55 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/92000-invalid-object-message.mdx @@ -0,0 +1,11 @@ +--- +title: "92000: Invalid LiveObjects message" +meta_description: "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." +identifier: "invalid_object_message" +redirect_from: + - "/docs/platform/errors/codes/92000" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..d0f53b21b4 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/92001-object-limit-exceeded.mdx @@ -0,0 +1,11 @@ +--- +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." +identifier: "object_limit_exceeded" +redirect_from: + - "/docs/platform/errors/codes/92001" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..ad0b66d683 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/92002-operation-on-tombstone-object.mdx @@ -0,0 +1,11 @@ +--- +title: "92002: LiveObjects operation on a deleted object" +meta_description: "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." +identifier: "operation_on_tombstone_object" +redirect_from: + - "/docs/platform/errors/codes/92002" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..ec1fe62d72 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/92003-object-root-deleted.mdx @@ -0,0 +1,11 @@ +--- +title: "92003: LiveObjects root has been deleted" +meta_description: "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." +identifier: "object_root_deleted" +redirect_from: + - "/docs/platform/errors/codes/92003" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..aaaa0538ce --- /dev/null +++ b/src/pages/docs/platform/errors/codes/92004-object-not-found.mdx @@ -0,0 +1,11 @@ +--- +title: "92004: LiveObjects object not found" +meta_description: "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." +identifier: "object_not_found" +redirect_from: + - "/docs/platform/errors/codes/92004" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..714eb39bc3 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/92005-no-objects-at-path.mdx @@ -0,0 +1,11 @@ +--- +title: "92005: LiveObjects path matched no objects" +meta_description: "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." +identifier: "no_objects_at_path" +redirect_from: + - "/docs/platform/errors/codes/92005" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..5c155ca5ad --- /dev/null +++ b/src/pages/docs/platform/errors/codes/92006-object-operation-missing-identifier-or-path.mdx @@ -0,0 +1,11 @@ +--- +title: "92006: LiveObjects operation missing object reference" +meta_description: "A LiveObjects operation could not be performed because it specified neither an object identifier nor a path." +identifier: "object_operation_missing_identifier_or_path" +redirect_from: + - "/docs/platform/errors/codes/92006" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..a22bdeda8b --- /dev/null +++ b/src/pages/docs/platform/errors/codes/92007-object-operation-path-not-processable.mdx @@ -0,0 +1,11 @@ +--- +title: "92007: LiveObjects operation not valid for the path" +meta_description: "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." +identifier: "object_operation_path_not_processable" +redirect_from: + - "/docs/platform/errors/codes/92007" +--- + +{/* 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. 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 new file mode 100644 index 0000000000..ae9d46779f --- /dev/null +++ b/src/pages/docs/platform/errors/codes/92008-objects-sync-did-not-complete.mdx @@ -0,0 +1,11 @@ +--- +title: "92008: LiveObjects sync did not complete" +meta_description: "A LiveObjects operation could not be applied because the channel had not finished synchronizing its objects." +identifier: "objects_sync_did_not_complete" +redirect_from: + - "/docs/platform/errors/codes/92008" +--- + +{/* 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. diff --git a/src/pages/docs/platform/errors/codes/93001-annotation-subscribe-mode-not-enabled.mdx b/src/pages/docs/platform/errors/codes/93001-annotation-subscribe-mode-not-enabled.mdx new file mode 100644 index 0000000000..1f6776ec10 --- /dev/null +++ b/src/pages/docs/platform/errors/codes/93001-annotation-subscribe-mode-not-enabled.mdx @@ -0,0 +1,11 @@ +--- +title: "93001: Annotation listener without annotation_subscribe mode" +meta_description: "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." +identifier: "annotation_subscribe_mode_not_enabled" +redirect_from: + - "/docs/platform/errors/codes/93001" +--- + +{/* AUTOGENERATED — DO NOT EDIT. Generated from ably-common/errors/codes/93001.md by bin/generate-error-pages.ts; run `yarn generate:errors` to update. */} + +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. 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 new file mode 100644 index 0000000000..98b697690f --- /dev/null +++ b/src/pages/docs/platform/errors/codes/93002-mutable-messages-not-enabled.mdx @@ -0,0 +1,11 @@ +--- +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.