[{"data":1,"prerenderedAt":7},["ShallowReactive",2],{"docs-chats\u002Fstickers\u002Fpacks":3,"docs-tabs-chats\u002Fstickers\u002Fpacks":6},{"content":4,"lastmod":5},"## List of sticker packs\n\n`GET \u002Fv1\u002Fchats\u002Fstickers\u002Fpacks`\n\nReturns the current user's sticker packs page by page: user packs (`custom`) first, then built-in ones (`vendor`). To get the next page, pass the `id` and `type` of the last pack of the previous page.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|----------|-----|:-----:|----------|\n| `limit` | number | no | Packs per page: 10 by default, from 1 to 200. An out-of-range value is clamped to the nearest bound; the requested and applied values are returned in `meta` |\n| `lastId` | number | no | Cursor: `id` of the last pack of the previous page. Passed only together with `lastType` |\n| `lastType` | string | no | Cursor: `type` of the last pack of the previous page — `vendor` or `custom`. Passed only together with `lastId` |\n\nWithout a cursor, the first page is returned. Other parameters, a repeated parameter or only one half of the cursor are rejected with `400 INVALID_PARAMS` before any Bitrix24 call.\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fchats\u002Fstickers\u002Fpacks?limit=20\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth application\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fchats\u002Fstickers\u002Fpacks?limit=20\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fchats\u002Fstickers\u002Fpacks?limit=20', {\n  headers: { 'X-Api-Key': 'YOUR_API_KEY' },\n})\n\nconst { data } = await res.json()\nconsole.log('Packs:', data.packs.length, 'more:', data.hasNextPage)\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fchats\u002Fstickers\u002Fpacks?limit=20', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nconst { data } = await res.json()\nconsole.log('Packs:', data.packs.length, 'more:', data.hasNextPage)\n```\n\n## Response fields\n\n| Field | Type | Description |\n|------|-----|---------|\n| `success` | boolean | Always `true` on success |\n| `data.packs` | array | Packs on the page |\n| `data.packs[].id` | number | Pack ID. Unique only together with `type`. Pass it as `packId` to [get a pack](\u002Fdocs\u002Fchats\u002Fstickers\u002Fpack-get) |\n| `data.packs[].type` | string | `custom` — a user pack, `vendor` — a built-in pack |\n| `data.packs[].name` | string | Pack name |\n| `data.packs[].authorId` | number \\| null | ID of the author of a user pack; `null` for a built-in pack. Profile — by [user ID](\u002Fdocs\u002Fentities\u002Fusers\u002Fget) |\n| `data.packs[].isAdded` | boolean | The pack is in the user's list |\n| `data.stickers` | array | Stickers of the page's packs and, on the first page, also the recent stickers |\n| `data.stickers[].id` | number | Sticker ID — for [deleting stickers from a pack](\u002Fdocs\u002Fchats\u002Fstickers\u002Fpack-stickers) |\n| `data.stickers[].packId` | number | ID of the sticker's pack — matches `data.packs[].id` |\n| `data.stickers[].packType` | string | Kind of the sticker's pack |\n| `data.stickers[].uri` | string | Path to the image in the Bitrix24 account — relative, without the domain |\n| `data.stickers[].type` | string | Sticker type (`image`) |\n| `data.stickers[].width` | number | Image width in pixels |\n| `data.stickers[].height` | number | Image height in pixels |\n| `data.stickers[].sort` | number | Sticker order in the pack |\n| `data.recentStickers` | array | First page only: stickers the user sent recently, at most 12, newest first — `{ id, packId, packType }` |\n| `data.hasNextPage` | boolean | There is a next page |\n| `meta.requestedLimit` | number | The `limit` passed — only if it was clamped to a bound |\n| `meta.appliedLimit` | number | The `limit` applied — only if it was clamped to a bound |\n\n## Response example\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"stickers\": [\n      { \"id\": 1, \"uri\": \"\u002Fupload\u002Fim\u002Fstickers\u002F3\u002F1.png\", \"type\": \"image\", \"width\": 512, \"height\": 512, \"packId\": 3, \"packType\": \"custom\", \"sort\": 1 },\n      { \"id\": 2, \"uri\": \"\u002Fbitrix\u002Fimages\u002Fim\u002Fstickers\u002FaiHelp\u002F2.png?v1\", \"type\": \"image\", \"width\": 512, \"height\": 512, \"packId\": 14, \"packType\": \"vendor\", \"sort\": 2 }\n    ],\n    \"packs\": [\n      { \"id\": 3, \"name\": \"Work stickers\", \"type\": \"custom\", \"authorId\": 7, \"isAdded\": true },\n      { \"id\": 14, \"name\": \"AI, help\", \"type\": \"vendor\", \"authorId\": null, \"isAdded\": true }\n    ],\n    \"recentStickers\": [\n      { \"id\": 2, \"packId\": 14, \"packType\": \"vendor\" }\n    ],\n    \"hasNextPage\": true\n  }\n}\n```\n\n## Error response example\n\n400 — only one half of the cursor was passed:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"`lastId` needs `lastType`: pass the `id` and the `type` of the last pack of the previous page together.\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | An unknown query parameter was passed |\n| 400 | `INVALID_PARAMS` | A parameter was passed more than once |\n| 400 | `INVALID_PARAMS` | `limit` is not an integer |\n| 400 | `INVALID_PARAMS` | `lastId` was passed without `lastType` |\n| 400 | `INVALID_PARAMS` | `lastType` was passed without `lastId` |\n| 400 | `INVALID_PARAMS` | `lastId` is not a positive integer |\n| 400 | `INVALID_PARAMS` | `lastType` is neither `vendor` nor `custom` |\n| 401 | `TOKEN_MISSING` | The key has no configured Bitrix24 tokens |\n| 403 | `SCOPE_DENIED` | The key lacks the `im` scope |\n| 403 | `WRITE_BLOCKED_READONLY_KEY` | A read-only key requested the first page — without `lastId` and `lastType`. Cursor pages work with a read-only key too |\n| 404 | `ENTITY_NOT_FOUND` | Bitrix24 did not find the object. The portal code is in `error.b24Code` if supplied |\n| 422 | `BITRIX_ERROR` | Bitrix24 returned an error. The portal code is in `error.b24Code` |\n| 502 | `BITRIX_UNAVAILABLE` | Bitrix24 is unavailable or returned a server error |\n\nFull list of common API errors — [Errors](\u002Fdocs\u002Ferrors).\n\n## Known specifics\n\n- The last page may be empty, with `hasNextPage: false`.\n- If the cursor pack was deleted or removed from the user's list between requests, the list of user packs starts over from the beginning. Deduplicate packs by the `type` and `id` pair.\n- `recentStickers` arrives on the first page only. The first request deletes recent-sticker rows beyond 12, so it is classified as a write: a read-only key receives `403 WRITE_BLOCKED_READONLY_KEY` before any Bitrix24 call. Cursor pages remain reads.\n- `uri` is a path in the Bitrix24 account. The full image address is the Bitrix24 account domain plus `uri`.\n\n## See also\n\n- [Get a pack](\u002Fdocs\u002Fchats\u002Fstickers\u002Fpack-get)\n- [Recent stickers](\u002Fdocs\u002Fchats\u002Fstickers\u002Frecent)\n- [Stickers](\u002Fdocs\u002Fchats\u002Fstickers)\n","2026-10-07",{},1794739555791]