updating types

This commit is contained in:
Devin Zuczek
2026-06-30 23:57:29 -04:00
parent 8e513c1275
commit ba33003343
40 changed files with 49940 additions and 16163 deletions
+1 -2
View File
@@ -8,8 +8,7 @@ export interface PlayerSetting {
Value: string
}
const DEFAULTS: ReadonlyArray<readonly [key: string, value: string]> = [
]
const DEFAULTS: ReadonlyArray<readonly [key: string, value: string]> = []
export function defaultSettings(playerId: number): PlayerSetting[] {
return DEFAULTS.map(([Key, Value]) => ({ PlayerId: playerId, Key, Value }))
+10 -3
View File
@@ -4,7 +4,6 @@ import { beforeAll, describe, expect, test } from 'vitest'
import '../../api.app'
import type { Env } from '../../context'
declare module 'cloudflare:test' {
@@ -23,7 +22,13 @@ const TEST_ROOMS = [
CreatorAccountId: 1,
SubRooms: [{ SubRoomId: 1, UnitySceneId: '76d98498-60a1-430c-ab76-b54a29b7a163' }],
},
{ RoomId: 2, Name: 'RecCenter', IsDorm: false, CreatorAccountId: 1, SubRooms: [{ SubRoomId: 2 }] },
{
RoomId: 2,
Name: 'RecCenter',
IsDorm: false,
CreatorAccountId: 1,
SubRooms: [{ SubRoomId: 2 }],
},
]
beforeAll(async () => {
@@ -49,7 +54,9 @@ beforeAll(async () => {
)`
).run()
await env.DB.prepare('INSERT OR IGNORE INTO accounts (data) VALUES (?1)')
.bind(JSON.stringify({ accountId: 42, username: 'Tester', profileImage: 'DefaultProfileImage.jpg' }))
.bind(
JSON.stringify({ accountId: 42, username: 'Tester', profileImage: 'DefaultProfileImage.jpg' })
)
.run()
})
+4 -4
View File
@@ -1,6 +1,6 @@
{
"OutfitSelections": "1fd69ef8-0b74-4962-af5a-67f0bf0358f2,,0;d0a9262f-5504-46a7-bb10-7507503db58e,,1",
"FaceFeatures": "{\"ver\":-1,\"eyeId\":\"AjGMoJhEcEehacRZjUMuDg\",\"eyePos\":{\"x\":0.0,\"y\":0.0},\"eyeScl\":0.0,\"mouthId\":\"FrZBRanXEEK29yKJ4jiMjg\",\"mouthPos\":{\"x\":0.0,\"y\":0.0},\"mouthScl\":0.0,\"hairPrimaryColorId\":\"\",\"hairSecondaryColorId\":\"0e_jaaObREWTf1AorAZ95g\",\"hairPatternId\":\"\",\"beardColorId\":\"0e_jaaObREWTf1AorAZ95g\",\"beardSecondaryColorId\":\"0e_jaaObREWTf1AorAZ95g\",\"beardPatternId\":\"\",\"faceShapeId\":\"yR4oYZr_AUSynXCgwS2lGw\",\"bodyShapeId\":\"bY1RGIph0kiAxbd6Shn9tQ\",\"useHatAnchorParams\":true,\"useHelmetHair\":1,\"hideEars\":true,\"hatAnchorParams\":{\"NormalizedPosition\":{\"x\":0.5,\"y\":0.5},\"HemisphereOffsets\":{\"x\":0.0,\"y\":0.0,\"z\":0.0},\"HemisphereRotations\":{\"x\":0.0,\"y\":0.0,\"z\":0.0}},\"baseAvatarType\":\"\"}",
"SkinColor": "Xac-W_R330KfOz-pQla9qg",
"HairColor": "0e_jaaObREWTf1AorAZ95g"
"OutfitSelections": "1fd69ef8-0b74-4962-af5a-67f0bf0358f2,,0;d0a9262f-5504-46a7-bb10-7507503db58e,,1",
"FaceFeatures": "{\"ver\":-1,\"eyeId\":\"AjGMoJhEcEehacRZjUMuDg\",\"eyePos\":{\"x\":0.0,\"y\":0.0},\"eyeScl\":0.0,\"mouthId\":\"FrZBRanXEEK29yKJ4jiMjg\",\"mouthPos\":{\"x\":0.0,\"y\":0.0},\"mouthScl\":0.0,\"hairPrimaryColorId\":\"\",\"hairSecondaryColorId\":\"0e_jaaObREWTf1AorAZ95g\",\"hairPatternId\":\"\",\"beardColorId\":\"0e_jaaObREWTf1AorAZ95g\",\"beardSecondaryColorId\":\"0e_jaaObREWTf1AorAZ95g\",\"beardPatternId\":\"\",\"faceShapeId\":\"yR4oYZr_AUSynXCgwS2lGw\",\"bodyShapeId\":\"bY1RGIph0kiAxbd6Shn9tQ\",\"useHatAnchorParams\":true,\"useHelmetHair\":1,\"hideEars\":true,\"hatAnchorParams\":{\"NormalizedPosition\":{\"x\":0.5,\"y\":0.5},\"HemisphereOffsets\":{\"x\":0.0,\"y\":0.0,\"z\":0.0},\"HemisphereRotations\":{\"x\":0.0,\"y\":0.0,\"z\":0.0}},\"baseAvatarType\":\"\"}",
"SkinColor": "Xac-W_R330KfOz-pQla9qg",
"HairColor": "0e_jaaObREWTf1AorAZ95g"
}
+2580 -2580
View File
@@ -1,2582 +1,2582 @@
[
{
"AvatarItemDesc": "0088603e-ec3b-4478-8694-e6fb1989b3f2,,,",
"AvatarItemId": 620,
"AvatarItemType": 0,
"FriendlyName": "Angled Bob Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "04e348b7-107f-47b4-9331-ae3b9fa184ca,,,",
"AvatarItemId": 1980,
"AvatarItemType": 0,
"FriendlyName": "Braided Bun Hair ",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "06306723-ca20-4aa6-b7b3-917113f41ac3,,,",
"AvatarItemId": 1004,
"AvatarItemType": 0,
"FriendlyName": "Cat-Eye Glasses (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "06306723-ca20-4aa6-b7b3-917113f41ac3,cypMpMaVeUuRjm4FLH4czQ,PIjEKhXiCUqtA8FBhLBcmA,",
"AvatarItemId": 1883,
"AvatarItemType": 0,
"FriendlyName": "Cat-Eye Glasses (Teal)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "06306723-ca20-4aa6-b7b3-917113f41ac3,LTXy6g4xe0abuFzOLpVDUg,PIjEKhXiCUqtA8FBhLBcmA,",
"AvatarItemId": 1881,
"AvatarItemType": 0,
"FriendlyName": "Cat-Eye Glasses (Dark Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "06306723-ca20-4aa6-b7b3-917113f41ac3,tMsCUhDslkmdNBfogeSz7w,PIjEKhXiCUqtA8FBhLBcmA,",
"AvatarItemId": 1884,
"AvatarItemType": 0,
"FriendlyName": "Cat-Eye Glasses (Black)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "06306723-ca20-4aa6-b7b3-917113f41ac3,whWKAUSGp0qprsJomq9Nwg,PIjEKhXiCUqtA8FBhLBcmA,",
"AvatarItemId": 1882,
"AvatarItemType": 0,
"FriendlyName": "Cat-Eye Glasses (Pink)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "071f179a-dde2-407f-92b2-f0c16fcb4e39,",
"AvatarItemId": 2337,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf (Beige)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "071f179a-dde2-407f-92b2-f0c16fcb4e39,_T4zEki_wk-UIPdhSaBr_Q",
"AvatarItemId": 2341,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf (Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "071f179a-dde2-407f-92b2-f0c16fcb4e39,5z3jZhYvq0CGmdJ9IcUUsg",
"AvatarItemId": 2340,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf (Brown)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "071f179a-dde2-407f-92b2-f0c16fcb4e39,EgEoJzG7A0aJ92qfInbX7g",
"AvatarItemId": 2342,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "071f179a-dde2-407f-92b2-f0c16fcb4e39,NETGR8iysUyxcZM_oGmrwQ",
"AvatarItemId": 2344,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "071f179a-dde2-407f-92b2-f0c16fcb4e39,OlfQDuz1NUOr88AL2n0jXg",
"AvatarItemId": 2343,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "071f179a-dde2-407f-92b2-f0c16fcb4e39,VudVdOAjZUibHmtFeNkvSw",
"AvatarItemId": 2339,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "0753d7a4-8247-4fca-a6fc-359c26086140,,,",
"AvatarItemId": 993,
"AvatarItemType": 0,
"FriendlyName": "Fonzie Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "09177621-9ecd-4f6a-b6a5-64490139141d,,,",
"AvatarItemId": 81,
"AvatarItemType": 0,
"FriendlyName": "Flat Top Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "0abb6b08-20ce-444f-879e-0d1344df096c,,,",
"AvatarItemId": 1620,
"AvatarItemType": 0,
"FriendlyName": "Round Earrings",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "0d1ae26e-aaa4-4914-ad70-c9ab8cfabc61,,,",
"AvatarItemId": 1979,
"AvatarItemType": 0,
"FriendlyName": "Box Braids with Cuff Hair ",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "12ec292f-0ccd-4c8a-a49c-3598f827659d,,,",
"AvatarItemId": 1740,
"AvatarItemType": 0,
"FriendlyName": "Basic Belt (Black)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "12ec292f-0ccd-4c8a-a49c-3598f827659d,6fmUy748hU2dgwgaijSkUA,rL9p5JY83Eyxj00Dieg7oA,",
"AvatarItemId": 1739,
"AvatarItemType": 0,
"FriendlyName": "Basic Belt (Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "12ec292f-0ccd-4c8a-a49c-3598f827659d,buuNFd8sK0eap78TL1gMNQ,-UFHTNvJs0CGDStb0PFkbQ,",
"AvatarItemId": 1741,
"AvatarItemType": 0,
"FriendlyName": "Basic Belt (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "12ec292f-0ccd-4c8a-a49c-3598f827659d,dBR1uNgk206eVoWntVzVAg,rL9p5JY83Eyxj00Dieg7oA,",
"AvatarItemId": 1738,
"AvatarItemType": 0,
"FriendlyName": "Basic Belt (Brown)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "12ec292f-0ccd-4c8a-a49c-3598f827659d,LIgagNf4gk68EYQdlDruxg,rL9p5JY83Eyxj00Dieg7oA,",
"AvatarItemId": 1736,
"AvatarItemType": 0,
"FriendlyName": "Basic Belt (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "12ec292f-0ccd-4c8a-a49c-3598f827659d,zPGCmxM_b0yTt7tqMaomcw,rL9p5JY83Eyxj00Dieg7oA,",
"AvatarItemId": 1737,
"AvatarItemType": 0,
"FriendlyName": "Basic Belt (Tan)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "14ef6b00-debf-4a85-9755-b4d37df496d3,,,",
"AvatarItemId": 25,
"AvatarItemType": 0,
"FriendlyName": "Baseball Cap (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "14ef6b00-debf-4a85-9755-b4d37df496d3,1b1d08f2-12ca-43dd-a44f-ea2820b919b4,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 983,
"AvatarItemType": 0,
"FriendlyName": "Baseball Cap (Black)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "14ef6b00-debf-4a85-9755-b4d37df496d3,484b6c13-af22-4ad5-8c43-34c0de095d49,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 29,
"AvatarItemType": 0,
"FriendlyName": "Baseball Cap (Light Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "14ef6b00-debf-4a85-9755-b4d37df496d3,51ef8d39-2b94-4f9e-9620-07b6b0a913a5,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 31,
"AvatarItemType": 0,
"FriendlyName": "Baseball Cap (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "14ef6b00-debf-4a85-9755-b4d37df496d3,67bcca75-4ab1-4964-8688-9908c464d355,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 30,
"AvatarItemType": 0,
"FriendlyName": "Baseball Cap (Yellow)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "14ef6b00-debf-4a85-9755-b4d37df496d3,724c79a3-822c-422f-9462-a5374ee0211c,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 26,
"AvatarItemType": 0,
"FriendlyName": "Baseball Cap (White))",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "14ef6b00-debf-4a85-9755-b4d37df496d3,8377ab96-c908-457f-9fee-b784c9a759f3,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 669,
"AvatarItemType": 0,
"FriendlyName": "Baseball Cap (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "14ef6b00-debf-4a85-9755-b4d37df496d3,dee70c38-7a99-4c2b-9181-665f1bf75aca,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 670,
"AvatarItemType": 0,
"FriendlyName": "Baseball Cap (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "193a3bf9-abc0-4d78-8d63-92046908b1c5,,,",
"AvatarItemId": 991,
"AvatarItemType": 0,
"FriendlyName": "Emo Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "1940c740-695d-4481-a802-bb11b6561635,",
"AvatarItemId": 2116,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Untucked Tee",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "1a71064b-794f-40fa-9109-8ad36602b6e1,,,",
"AvatarItemId": 95,
"AvatarItemType": 0,
"FriendlyName": "Shagg Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "1d27b674-f9e2-4ffc-9d8c-a58a1be06457,,,",
"AvatarItemId": 986,
"AvatarItemType": 0,
"FriendlyName": "Afro Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "1fd69ef8-0b74-4962-af5a-67f0bf0358f2,,,",
"AvatarItemId": 998,
"AvatarItemType": 0,
"FriendlyName": "Ponytail Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "21599b51-c50f-43d8-ac5f-62c30cd02ca5,,,",
"AvatarItemId": 994,
"AvatarItemType": 0,
"FriendlyName": "Lori Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "21caa68e-c3fa-474c-af5e-af1e742b7a60,,,",
"AvatarItemId": 1021,
"AvatarItemType": 0,
"FriendlyName": "Tennis Skirt (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "21caa68e-c3fa-474c-af5e-af1e742b7a60,758752bd-db2f-43d2-b580-55b3e1efffd5,b75ef67d-00c3-4ac1-9b72-212032460294,",
"AvatarItemId": 682,
"AvatarItemType": 0,
"FriendlyName": "Tennis Skirt (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "21caa68e-c3fa-474c-af5e-af1e742b7a60,c5deba2a-6e35-4b13-8e94-8ba5457f39df,b75ef67d-00c3-4ac1-9b72-212032460294,",
"AvatarItemId": 681,
"AvatarItemType": 0,
"FriendlyName": "Tennis Skirt (Yellow)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2296ed0d-df56-4d46-b33a-aae9230a47fc,,,",
"AvatarItemId": 1022,
"AvatarItemType": 0,
"FriendlyName": "Zipper Dress (Yellow)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2296ed0d-df56-4d46-b33a-aae9230a47fc,6d703981-2734-4c45-8983-cdd5f328902f,cfabdefe-0890-436e-b2a3-b5c712e22955,",
"AvatarItemId": 255,
"AvatarItemType": 0,
"FriendlyName": "Zipper Dress (Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2296ed0d-df56-4d46-b33a-aae9230a47fc,830be2fa-60a5-48cc-931f-34b670eae4bd,cfabdefe-0890-436e-b2a3-b5c712e22955,",
"AvatarItemId": 254,
"AvatarItemType": 0,
"FriendlyName": "Zipper Dress (Purple)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2296ed0d-df56-4d46-b33a-aae9230a47fc,bbfa08e3-8e6b-4e0f-b264-1b398d7cd44a,cfabdefe-0890-436e-b2a3-b5c712e22955,",
"AvatarItemId": 253,
"AvatarItemType": 0,
"FriendlyName": "Zipper Dress (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "22a857bb-270a-4278-adbd-2df41181b36f,",
"AvatarItemId": 2345,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf Halo (Turquoise)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "22a857bb-270a-4278-adbd-2df41181b36f,0p_eXn2gXUKrshSEmrQx6Q",
"AvatarItemId": 2350,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf Halo (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "22a857bb-270a-4278-adbd-2df41181b36f,3cPbhpDX-EqDQy6eN1E5Ug",
"AvatarItemId": 2346,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf Halo (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "22a857bb-270a-4278-adbd-2df41181b36f,fAmEEm6ziUO2ZXTscQWtSg",
"AvatarItemId": 2351,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf Halo (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "22a857bb-270a-4278-adbd-2df41181b36f,gEuE-X67b0-q5C0Tv11_nA",
"AvatarItemId": 2348,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf Halo (Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "22a857bb-270a-4278-adbd-2df41181b36f,gk_mQ-jsakmxhZYYNlRl_w",
"AvatarItemId": 2349,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf Halo (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "241506f6-bf88-4b46-b5fe-513a225421f4,,,",
"AvatarItemId": 417,
"AvatarItemType": 0,
"FriendlyName": "Half Up Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "24a240f4-1574-420b-b898-a7e91f170759,,,",
"AvatarItemId": 582,
"AvatarItemType": 0,
"FriendlyName": "Back Bun Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2822aa50-4344-434d-b46f-fd9443f865b9,,,",
"AvatarItemId": 1981,
"AvatarItemType": 0,
"FriendlyName": "Curly Bob Hair ",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2cb4f372-3372-4583-8b57-c4e3988e3c28,,,",
"AvatarItemId": 999,
"AvatarItemType": 0,
"FriendlyName": "Punky Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2e59d8d0-91a0-4449-bfdc-a5d663fd9343,,,",
"AvatarItemId": 1009,
"AvatarItemType": 0,
"FriendlyName": "Collared Shirt (Plaid, Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2e59d8d0-91a0-4449-bfdc-a5d663fd9343,0iSsaY-HgkmLaRHCn5vEdw,PioQ0o3yP0a6szPZ4EKs2A,",
"AvatarItemId": 1014,
"AvatarItemType": 0,
"FriendlyName": "Collared Shirt (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2e59d8d0-91a0-4449-bfdc-a5d663fd9343,55901f12-d5b5-4fa8-b4c8-e479689ee39d,f600037d-c9c0-43fa-b45b-02f456f9dd5f,",
"AvatarItemId": 674,
"AvatarItemType": 0,
"FriendlyName": "Collared Shirt (Denim)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2e59d8d0-91a0-4449-bfdc-a5d663fd9343,bf82f2f6-9af8-431e-a296-0890dea48ba7,d015cae7-a905-49e4-8823-6dec069689a6,",
"AvatarItemId": 672,
"AvatarItemType": 0,
"FriendlyName": "Collared Shirt (Argyle)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2e59d8d0-91a0-4449-bfdc-a5d663fd9343,EfdMcnfHt0mr0PQ_maaYOg,DRJcNhkqvkKFEaZpOguR6w,",
"AvatarItemId": 1016,
"AvatarItemType": 0,
"FriendlyName": "Collared Shirt (Flowers, Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2e59d8d0-91a0-4449-bfdc-a5d663fd9343,FAviMCQ_EE2Mpt6QPo5OEw,PioQ0o3yP0a6szPZ4EKs2A,",
"AvatarItemId": 1015,
"AvatarItemType": 0,
"FriendlyName": "Collared Shirt (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2e59d8d0-91a0-4449-bfdc-a5d663fd9343,jGj28vhq8EGwP2RuM074aQ,PioQ0o3yP0a6szPZ4EKs2A,",
"AvatarItemId": 1012,
"AvatarItemType": 0,
"FriendlyName": "Collared Shirt (Yellow)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2e59d8d0-91a0-4449-bfdc-a5d663fd9343,kmj5zOjcwku_WWKroCeiVQ,PioQ0o3yP0a6szPZ4EKs2A,",
"AvatarItemId": 1011,
"AvatarItemType": 0,
"FriendlyName": "Collared Shirt (Pink)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2e59d8d0-91a0-4449-bfdc-a5d663fd9343,MFrcSQ1DYUm8imvy4ypgvw,PioQ0o3yP0a6szPZ4EKs2A,",
"AvatarItemId": 1013,
"AvatarItemType": 0,
"FriendlyName": "Collared Shirt (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2e7cbdb0-cf22-4938-964f-acca57d221b7,",
"AvatarItemId": 2878,
"AvatarItemType": 0,
"FriendlyName": "Hearing Aids (BTE Earmold - Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2e7cbdb0-cf22-4938-964f-acca57d221b7,aEsXeTI_SEOclbm82n17tg",
"AvatarItemId": 2880,
"AvatarItemType": 0,
"FriendlyName": "Hearing Aids (BTE Earmold - Gray)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2e7cbdb0-cf22-4938-964f-acca57d221b7,pZDvYABTN06KdJ5Ck60XLA",
"AvatarItemId": 2879,
"AvatarItemType": 0,
"FriendlyName": "Hearing Aids (BTE Earmold - Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "36b2ccf4-4f42-4dc4-aeaf-f3d10b2a6d30,,,",
"AvatarItemId": 1982,
"AvatarItemType": 0,
"FriendlyName": "Etched Fade Hair ",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "37f7b94a-92ba-4f5e-b94c-de00acfa4722,,,",
"AvatarItemId": 1983,
"AvatarItemType": 0,
"FriendlyName": "Etched Flattop Hair ",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,,,",
"AvatarItemId": 6,
"AvatarItemType": 0,
"FriendlyName": "Headband (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,0ecb8a2a-cffc-47db-aeda-fb0684aef1e5,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 11,
"AvatarItemType": 0,
"FriendlyName": "Headband (Grey)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,1b1d08f2-12ca-43dd-a44f-ea2820b919b4,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 663,
"AvatarItemType": 0,
"FriendlyName": "Headband (Black)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,484b6c13-af22-4ad5-8c43-34c0de095d49,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 12,
"AvatarItemType": 0,
"FriendlyName": "Headband (Light Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,51ef8d39-2b94-4f9e-9620-07b6b0a913a5,018a5c07-e956-457d-a540-a5e2cd68da09,",
"AvatarItemId": 667,
"AvatarItemType": 0,
"FriendlyName": "Headband (Orange, White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,51ef8d39-2b94-4f9e-9620-07b6b0a913a5,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 13,
"AvatarItemType": 0,
"FriendlyName": "Headband (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,67bcca75-4ab1-4964-8688-9908c464d355,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 16,
"AvatarItemType": 0,
"FriendlyName": "Headband (Yellow)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,6dd95046-acf8-42fe-ab78-80a334096a9d,56a92c8d-af53-413e-929e-4a9a3cfad780,",
"AvatarItemId": 668,
"AvatarItemType": 0,
"FriendlyName": "Headband (Red, White, Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,7d8e55fe-3c34-4b4b-9753-0021f6cc6454,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 664,
"AvatarItemType": 0,
"FriendlyName": "Headband (Cream)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,8377ab96-c908-457f-9fee-b784c9a759f3,018a5c07-e956-457d-a540-a5e2cd68da09,",
"AvatarItemId": 20,
"AvatarItemType": 0,
"FriendlyName": "Headband (Red, White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,8377ab96-c908-457f-9fee-b784c9a759f3,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 7,
"AvatarItemType": 0,
"FriendlyName": "Headband (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,cbe29e9f-f2ac-47fb-97e1-8bad16abb89d,018a5c07-e956-457d-a540-a5e2cd68da09,",
"AvatarItemId": 666,
"AvatarItemType": 0,
"FriendlyName": "Headband (Pink, White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,cbe29e9f-f2ac-47fb-97e1-8bad16abb89d,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 14,
"AvatarItemType": 0,
"FriendlyName": "Headband (Pink)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,dee70c38-7a99-4c2b-9181-665f1bf75aca,018a5c07-e956-457d-a540-a5e2cd68da09,",
"AvatarItemId": 665,
"AvatarItemType": 0,
"FriendlyName": "Headband (Blue, White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,dee70c38-7a99-4c2b-9181-665f1bf75aca,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 15,
"AvatarItemType": 0,
"FriendlyName": "Headband (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,f8b0cfe8-e129-4578-8bb5-f60af5d38599,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 10,
"AvatarItemType": 0,
"FriendlyName": "Headband (Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "45eaab67-19c2-4601-8f80-3565a4dceba4,,,",
"AvatarItemId": 1199,
"AvatarItemType": 0,
"FriendlyName": "Pompadour Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "45f5e714-8a5f-4385-a97f-675066167011,,,",
"AvatarItemId": 112,
"AvatarItemType": 0,
"FriendlyName": "Seventies Stache",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "48fdfbc6-fca4-424c-aa57-3fcea41e23dc,,,",
"AvatarItemId": 1742,
"AvatarItemType": 0,
"FriendlyName": "Leather Necklace (Black)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "48fdfbc6-fca4-424c-aa57-3fcea41e23dc,gsHBUqA1gE2XNTPA3VvBLQ,FwjsTo0nb0uNU6l8XvllNA,",
"AvatarItemId": 1745,
"AvatarItemType": 0,
"FriendlyName": "Leather Necklace (Brown)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "48fdfbc6-fca4-424c-aa57-3fcea41e23dc,JUQn0_PLIkytCrkAg0FflQ,FwjsTo0nb0uNU6l8XvllNA,",
"AvatarItemId": 1744,
"AvatarItemType": 0,
"FriendlyName": "Leather Necklace (Tan)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "4d507dfa-4a99-4ac0-8537-229e9dc0eb4a,,,",
"AvatarItemId": 1017,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Tank Top (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "4eaaad39-aa44-4791-8b67-2eafa8305850,,,",
"AvatarItemId": 1977,
"AvatarItemType": 0,
"FriendlyName": "Afro Puffs Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "5beeb4c4-f276-4eae-87aa-9302e45b05b7,,,",
"AvatarItemId": 1480,
"AvatarItemType": 0,
"FriendlyName": "Cornrows Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "5cd08cfb-c729-4c30-96d9-6a99bb934d91,,,",
"AvatarItemId": 124,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Sash",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "62ce4109-8dee-4895-bf1b-bfa143db4c7e,,,",
"AvatarItemId": 149,
"AvatarItemType": 0,
"FriendlyName": "Slim Blazer (Teal)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "62ce4109-8dee-4895-bf1b-bfa143db4c7e,ad61c418-6d77-4a99-8ac5-9f10f5a3d42f,0f36bb97-c61b-4281-929f-ff1d0d11be86,",
"AvatarItemId": 468,
"AvatarItemType": 0,
"FriendlyName": "Slim Blazer (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "62ce4109-8dee-4895-bf1b-bfa143db4c7e,cd5d7285-202d-42d0-b93f-04245875793e,0f36bb97-c61b-4281-929f-ff1d0d11be86,",
"AvatarItemId": 469,
"AvatarItemType": 0,
"FriendlyName": "Slim Blazer (Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "6b9e022c-0b68-48fd-8eca-da8573c18900,,,",
"AvatarItemId": 131,
"AvatarItemType": 0,
"FriendlyName": "Long Scarf (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "6b9e022c-0b68-48fd-8eca-da8573c18900,5c4a2b35-0e1c-44de-8c3a-96d4a6458b1b,cf119781-5bd9-4b85-9a0b-12e82e988c23,",
"AvatarItemId": 461,
"AvatarItemType": 0,
"FriendlyName": "Long Scarf (Purple)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "6b9e022c-0b68-48fd-8eca-da8573c18900,6dd95046-acf8-42fe-ab78-80a334096a9d,cf119781-5bd9-4b85-9a0b-12e82e988c23,",
"AvatarItemId": 460,
"AvatarItemType": 0,
"FriendlyName": "Long Scarf (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "6b9e022c-0b68-48fd-8eca-da8573c18900,d6edbc00-3c1d-4f49-8412-3ef8c7c5f4c2,cf119781-5bd9-4b85-9a0b-12e82e988c23,",
"AvatarItemId": 459,
"AvatarItemType": 0,
"FriendlyName": "Long Scarf (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "6d815b35-6f68-4ed4-817d-70f141e1a571,,,",
"AvatarItemId": 193,
"AvatarItemType": 0,
"FriendlyName": "Collared Dress (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "6d815b35-6f68-4ed4-817d-70f141e1a571,6564acf1-4d70-4f92-92ac-08e2b76dbb6b,2c8924aa-68f8-4912-9759-18992f72f08a,",
"AvatarItemId": 196,
"AvatarItemType": 0,
"FriendlyName": "Collared Dress (Purple)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "6d815b35-6f68-4ed4-817d-70f141e1a571,d66aa400-aa5a-4539-a25d-5f8ce94dc281,2c8924aa-68f8-4912-9759-18992f72f08a,",
"AvatarItemId": 195,
"AvatarItemType": 0,
"FriendlyName": "Collared Dress (Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "6d815b35-6f68-4ed4-817d-70f141e1a571,f750de46-3758-4f7d-9709-0a84b1027009,2c8924aa-68f8-4912-9759-18992f72f08a,",
"AvatarItemId": 194,
"AvatarItemType": 0,
"FriendlyName": "Collared Dress (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "6e48363d-cc62-40a8-87f9-a69fae90c002,,,",
"AvatarItemId": 1978,
"AvatarItemType": 0,
"FriendlyName": "Box Braid Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "71921831-ba6f-408b-a00e-2fd97663636f,,,",
"AvatarItemId": 1024,
"AvatarItemType": 0,
"FriendlyName": "Wrist Tape (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "71921831-ba6f-408b-a00e-2fd97663636f,1b1d08f2-12ca-43dd-a44f-ea2820b919b4,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 297,
"AvatarItemType": 0,
"FriendlyName": "Wrist Tape (Black)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "71921831-ba6f-408b-a00e-2fd97663636f,7d8e55fe-3c34-4b4b-9753-0021f6cc6454,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 296,
"AvatarItemType": 0,
"FriendlyName": "Wrist Tape (Cream)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "77d3c585-4928-4471-a425-89036efe7299,,,",
"AvatarItemId": 1001,
"AvatarItemType": 0,
"FriendlyName": "Spiky Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "79b90274-6eec-4664-acfb-4a123334661e,,,",
"AvatarItemId": 997,
"AvatarItemType": 0,
"FriendlyName": "Pig Tails Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "7b857a8c-92ad-4028-a2c2-b3c20cdab5f2,,,",
"AvatarItemId": 1020,
"AvatarItemType": 0,
"FriendlyName": "T-Shirt",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "7b857a8c-92ad-4028-a2c2-b3c20cdab5f2,1b1d08f2-12ca-43dd-a44f-ea2820b919b4,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 230,
"AvatarItemType": 0,
"FriendlyName": "Tank Top (Black)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "7b857a8c-92ad-4028-a2c2-b3c20cdab5f2,48abd952-214f-48b2-a8f1-1146f6f69aa2,b78008e8-abbd-4ece-be34-9a911f721fcc,",
"AvatarItemId": 677,
"AvatarItemType": 0,
"FriendlyName": "Tank Top (Zebra)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "7b857a8c-92ad-4028-a2c2-b3c20cdab5f2,51ef8d39-2b94-4f9e-9620-07b6b0a913a5,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 227,
"AvatarItemType": 0,
"FriendlyName": "Tank Top (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "7b857a8c-92ad-4028-a2c2-b3c20cdab5f2,5c4a2b35-0e1c-44de-8c3a-96d4a6458b1b,9c03f381-7357-4d0f-8cda-8737d4c43d25,",
"AvatarItemId": 679,
"AvatarItemType": 0,
"FriendlyName": "Tank Top (Rainbow)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "7b857a8c-92ad-4028-a2c2-b3c20cdab5f2,6d703981-2734-4c45-8983-cdd5f328902f,a0271cd0-e172-4d3f-aa2f-9806f21a82d2,",
"AvatarItemId": 676,
"AvatarItemType": 0,
"FriendlyName": "Tank Top (Camo)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "7b857a8c-92ad-4028-a2c2-b3c20cdab5f2,8377ab96-c908-457f-9fee-b784c9a759f3,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 228,
"AvatarItemType": 0,
"FriendlyName": "Tank Top (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "7b857a8c-92ad-4028-a2c2-b3c20cdab5f2,ad61c418-6d77-4a99-8ac5-9f10f5a3d42f,b292eb4b-07e3-4a48-99b5-3c6587a1e02e,",
"AvatarItemId": 678,
"AvatarItemType": 0,
"FriendlyName": "Tank Top (Dots)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "7b857a8c-92ad-4028-a2c2-b3c20cdab5f2,dee70c38-7a99-4c2b-9181-665f1bf75aca,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 229,
"AvatarItemType": 0,
"FriendlyName": "Tank Top (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "7dd6f7b0-7ba0-429f-a04f-e32d3a79ee61,,,",
"AvatarItemId": 585,
"AvatarItemType": 0,
"FriendlyName": "Short Wavy Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "849cabc9-db40-4448-b923-defe4e700072",
"AvatarItemId": 5954,
"AvatarItemType": 0,
"FriendlyName": "Bride of Frank Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "84cd594c-1cd8-4b4d-8409-85c8fd5fb02a,,,",
"AvatarItemId": 198,
"AvatarItemType": 0,
"FriendlyName": "Stoll Dress (Pink)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "84cd594c-1cd8-4b4d-8409-85c8fd5fb02a,64850553-cdfe-455a-ac00-dafbe63d613e,91a451c1-b285-4c48-b14d-59ded8cc006f,",
"AvatarItemId": 199,
"AvatarItemType": 0,
"FriendlyName": "Stoll Dress (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "84cd594c-1cd8-4b4d-8409-85c8fd5fb02a,761a3193-60f0-4190-80c7-285b8192e794,91a451c1-b285-4c48-b14d-59ded8cc006f,",
"AvatarItemId": 200,
"AvatarItemType": 0,
"FriendlyName": "Stoll Dress (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "84cd594c-1cd8-4b4d-8409-85c8fd5fb02a,a819f49b-6c7a-49d3-9e6a-d9d79ef5019f,91a451c1-b285-4c48-b14d-59ded8cc006f,",
"AvatarItemId": 201,
"AvatarItemType": 0,
"FriendlyName": "Stoll Dress (Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "880a3cc0-7407-4b61-b759-f9dd890fe9e5,,,",
"AvatarItemId": 987,
"AvatarItemType": 0,
"FriendlyName": "Bob Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "88b6ddeb-a455-460d-91d9-a4569ef6903c,,,",
"AvatarItemId": 1621,
"AvatarItemType": 0,
"FriendlyName": "Square Earrings ",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "8aa79563-ace1-4ba7-ad0c-f3210a78142f,,,",
"AvatarItemId": 1018,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Shirt (V-Neck, White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "8aa79563-ace1-4ba7-ad0c-f3210a78142f,95e4cc30-cb68-473d-a395-feadf5b51512,05f0ee6e-c824-470e-9178-5ed576c6fe0c,",
"AvatarItemId": 675,
"AvatarItemType": 0,
"FriendlyName": "Rec Room T-Shirt (V-Neck, Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "8b9f1413-e786-4a30-946c-9292f207875a,,,",
"AvatarItemId": 91,
"AvatarItemType": 0,
"FriendlyName": "Pulp Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "8c35c804-e8d5-49d2-8d5a-ea19fb70bfa6,,,",
"AvatarItemId": 1478,
"AvatarItemType": 0,
"FriendlyName": "Pencil Bun Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "8d10cc78-6b00-45f3-affb-205e9cc5b03f,,,",
"AvatarItemId": 1006,
"AvatarItemType": 0,
"FriendlyName": "Beard (Close)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "92302d9d-c527-418c-ac5d-1fa869727505,,,",
"AvatarItemId": 996,
"AvatarItemType": 0,
"FriendlyName": "Part Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "95ab7a7c-c35d-4da5-9955-0921064470b6,,,",
"AvatarItemId": 83,
"AvatarItemType": 0,
"FriendlyName": "Gekko Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9b5bde11-7408-4798-9fcb-c7ec175444df,,,",
"AvatarItemId": 1619,
"AvatarItemType": 0,
"FriendlyName": "Hoop Earrings",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9bf5d259-7774-4cbe-a90f-7f188cc0dce7,,,",
"AvatarItemId": 361,
"AvatarItemType": 0,
"FriendlyName": "Thick Goatee",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9bf75b23-84e9-436b-bbb8-4180ccd86b94,,,",
"AvatarItemId": 1985,
"AvatarItemType": 0,
"FriendlyName": "Wolf Cut Hair) ",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9c20fdd5-acf1-426c-b85a-2220ceee9472,,,",
"AvatarItemId": 1987,
"AvatarItemType": 0,
"FriendlyName": "Short Curly Twists Hair ",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9c8fc7f0-8f99-4aad-a34f-8d979f6ae352,,,",
"AvatarItemId": 150,
"AvatarItemType": 0,
"FriendlyName": "Button Top (Pink)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9c8fc7f0-8f99-4aad-a34f-8d979f6ae352,49f5864f-9d40-497c-88c8-e87f64d41d74,dafa658e-753b-46cb-bd85-85c1de5e6ea7,",
"AvatarItemId": 151,
"AvatarItemType": 0,
"FriendlyName": "Button Top (Tan)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9c8fc7f0-8f99-4aad-a34f-8d979f6ae352,c5deba2a-6e35-4b13-8e94-8ba5457f39df,dafa658e-753b-46cb-bd85-85c1de5e6ea7,",
"AvatarItemId": 153,
"AvatarItemType": 0,
"FriendlyName": "Button Top (Yellow)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9c8fc7f0-8f99-4aad-a34f-8d979f6ae352,e0397982-c2c2-4733-9a40-46e18675b5af,dafa658e-753b-46cb-bd85-85c1de5e6ea7,",
"AvatarItemId": 152,
"AvatarItemType": 0,
"FriendlyName": "Button Top (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9d9fadb6-97eb-480e-a224-4e0179082071,,,",
"AvatarItemId": 995,
"AvatarItemType": 0,
"FriendlyName": "Meatball Buns Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9db35412-7a08-49dd-b80d-59c34a4616ea,",
"AvatarItemId": 2328,
"AvatarItemType": 0,
"FriendlyName": "Brimless Cap (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9db35412-7a08-49dd-b80d-59c34a4616ea,hgLq0WyUAUSl2sboUrpTKQ",
"AvatarItemId": 2330,
"AvatarItemType": 0,
"FriendlyName": "Brimless Cap (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9db35412-7a08-49dd-b80d-59c34a4616ea,JzLPlVNG20G9mxG_4PF8Fg",
"AvatarItemId": 2332,
"AvatarItemType": 0,
"FriendlyName": "Brimless Cap (Navy)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9db35412-7a08-49dd-b80d-59c34a4616ea,M5uFQQpoQE-5CKMJnDv_LA",
"AvatarItemId": 2331,
"AvatarItemType": 0,
"FriendlyName": "Brimless Cap (Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9db35412-7a08-49dd-b80d-59c34a4616ea,VuMDnpnK50mzgUMwJ4F6Jw",
"AvatarItemId": 2333,
"AvatarItemType": 0,
"FriendlyName": "Brimless Cap (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "a0e6fe4d-991d-4bd1-a1dc-ac4c7375fa4d,",
"AvatarItemId": 2359,
"AvatarItemType": 0,
"FriendlyName": "Head Wrap (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "a0e6fe4d-991d-4bd1-a1dc-ac4c7375fa4d,0zldWzi4H0OQwsWPt6gl-w",
"AvatarItemId": 2364,
"AvatarItemType": 0,
"FriendlyName": "Head Wrap (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "a0e6fe4d-991d-4bd1-a1dc-ac4c7375fa4d,a0A1q_e1q06qquiu2KaZhA",
"AvatarItemId": 2361,
"AvatarItemType": 0,
"FriendlyName": "Head Wrap (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "a0e6fe4d-991d-4bd1-a1dc-ac4c7375fa4d,M_BhFve7SkC7IJoymLiCLg",
"AvatarItemId": 2363,
"AvatarItemType": 0,
"FriendlyName": "Head Wrap (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "a0e6fe4d-991d-4bd1-a1dc-ac4c7375fa4d,rwESUxIrQEKA2hdQpcaPaA",
"AvatarItemId": 2362,
"AvatarItemType": 0,
"FriendlyName": "Head Wrap (Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "a12f724f-4a73-4ab8-aad4-6bfc662b4dd6,,,",
"AvatarItemId": 1002,
"AvatarItemType": 0,
"FriendlyName": "Undercut Long Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "a52353bf-8693-45fb-a04a-19cf62a06482",
"AvatarItemId": 5955,
"AvatarItemType": 0,
"FriendlyName": "Curlers Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "a6cbfe76-534a-4655-a8a8-3fed13d001c7,,,",
"AvatarItemId": 726,
"AvatarItemType": 0,
"FriendlyName": "Bald Top Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b148cb1e-df81-442f-aea6-ab1727aad00e,,,",
"AvatarItemId": 990,
"AvatarItemType": 0,
"FriendlyName": "Chunky Afro Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b3b59410-d3df-464b-a75b-500a9e5ea154,,,",
"AvatarItemId": 1772,
"AvatarItemType": 0,
"FriendlyName": "Pocket Tee (Black) ",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b3b59410-d3df-464b-a75b-500a9e5ea154,Aex0Zh1RQ0u9oTDFF1cFIg,_o3mI1mjE02vekPVyJg8Aw,",
"AvatarItemId": 1781,
"AvatarItemType": 0,
"FriendlyName": "Pocket Tee (Yellow)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b3b59410-d3df-464b-a75b-500a9e5ea154,El0s9F6cfkywcKOkqwbJtQ,_o3mI1mjE02vekPVyJg8Aw,",
"AvatarItemId": 1779,
"AvatarItemType": 0,
"FriendlyName": "Pocket Tee (Grey)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b3b59410-d3df-464b-a75b-500a9e5ea154,J9cK9BKtHUinG-DwAoPi3g,_o3mI1mjE02vekPVyJg8Aw,",
"AvatarItemId": 1774,
"AvatarItemType": 0,
"FriendlyName": "Pocket Tee (Dreen)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b3b59410-d3df-464b-a75b-500a9e5ea154,N0fBxjrCekO-HUqmc3MufQ,_o3mI1mjE02vekPVyJg8Aw,",
"AvatarItemId": 1775,
"AvatarItemType": 0,
"FriendlyName": "Pocket Tee (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b3b59410-d3df-464b-a75b-500a9e5ea154,oNoEl-nDqk-HLsfz1538oA,_o3mI1mjE02vekPVyJg8Aw,",
"AvatarItemId": 1776,
"AvatarItemType": 0,
"FriendlyName": "Pocket Tee (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b3b59410-d3df-464b-a75b-500a9e5ea154,pQ_3mZI7yEaxMw9n_Fr4Sg,_o3mI1mjE02vekPVyJg8Aw,",
"AvatarItemId": 1778,
"AvatarItemType": 0,
"FriendlyName": "Pocket Tee (Pink)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b3b59410-d3df-464b-a75b-500a9e5ea154,TpFWTdEW2kqtpvc0sPv-dw,_o3mI1mjE02vekPVyJg8Aw,",
"AvatarItemId": 1777,
"AvatarItemType": 0,
"FriendlyName": "Pocket Tee (Purple)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b3b59410-d3df-464b-a75b-500a9e5ea154,-VF3K4miGE28LxMgqVehRQ,_o3mI1mjE02vekPVyJg8Aw,",
"AvatarItemId": 1773,
"AvatarItemType": 0,
"FriendlyName": "Pocket Tee (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b3b59410-d3df-464b-a75b-500a9e5ea154,vxZVeH2b_E6XlqyqCW0hBA,_o3mI1mjE02vekPVyJg8Aw,",
"AvatarItemId": 1780,
"AvatarItemType": 0,
"FriendlyName": "Pocket Tee (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,3a1oW3_MY0e4lDN2V1X4ig,za8Mz14Ww0KtC6wavUPXdg,",
"AvatarItemId": 1771,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - Pride (Nonbinary Pride)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,9jB8U3yxjE6hanEZgMdvtA",
"AvatarItemId": 2202,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - AAPI (AAPI Heritage Month)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,D_Xmo0rOzkS-kgq1CYXt3g,tnCJp2eDI0SwjVfJMhk3LQ,",
"AvatarItemId": 1458,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - Pride (Trans Pride)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,DIeasJUIj0KNetAzPzuIrg,o3Q2gADhh06dgaipkkdMsA,",
"AvatarItemId": 1757,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - Pride (Bi Pride)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,EkA09Hj2m0u3c5STynn3Bw",
"AvatarItemId": 2887,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - ANAM (Autism & Neurodiversity Awareness Month)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,G6Udm6kMdE28vmRY5KPanA,Fw79pqDPP0C8H07AnTY-Vg,",
"AvatarItemId": 1756,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - Pride (Lesbian Pride)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,MfF0wizDjUa7RUE-AVJpvA",
"AvatarItemId": 2194,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - Pride (Intersex Pride)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,PIwziHk1BUuYkAf6kuK6wA",
"AvatarItemId": 2059,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - BHM (Black History Month)\t",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,PRLBrEEZhUumm3VnYVJP6Q",
"AvatarItemId": 2192,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - Pride (Aromantic Pride)\t",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,sf962XJ0tkis0svkMkZCXQ,4bI7QRvdnEansPkwx8Di9A,",
"AvatarItemId": 1791,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - Pride (Pan Pride)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,sxUE0iOSZEmezm54T7xI3Q,tlpa7195x0CkmSjpR1RArQ,",
"AvatarItemId": 1457,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - Pride (Rainbow Pride)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,tm7Cnd3LzkqWHA1JMrgoeA,nbLr3c3lOkiWhNg9IYbt6Q,",
"AvatarItemId": 1770,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - Pride (Ace Pride)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,Xt3Ndm8mC0qsLClPIbgwUw",
"AvatarItemId": 2193,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - Pride (Genderfluid Pride)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b8e485d4-b5c2-480e-908c-d9b500375759,",
"AvatarItemId": 2881,
"AvatarItemType": 0,
"FriendlyName": "Hearing Aids (Cochlear Implant - Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b8e485d4-b5c2-480e-908c-d9b500375759,7ZRNVpxhWk-j8R3oj0oVXg",
"AvatarItemId": 2883,
"AvatarItemType": 0,
"FriendlyName": "Hearing Aids (Cochlear Implant - Gray)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b8e485d4-b5c2-480e-908c-d9b500375759,8WJI7RAuaEy4KvQiQhoKBw",
"AvatarItemId": 2882,
"AvatarItemType": 0,
"FriendlyName": "Hearing Aids (Cochlear Implant - Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c414588b-29b3-4a1c-ae9e-7ad251901429,",
"AvatarItemId": 2352,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf Twist (Beige)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c414588b-29b3-4a1c-ae9e-7ad251901429,irw2uj4c2Eil0ndPCTqodQ",
"AvatarItemId": 2355,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf Twist (Yellow)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c414588b-29b3-4a1c-ae9e-7ad251901429,pPZ3sDw3B06mKiYsAiAt9w",
"AvatarItemId": 2358,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf Twist (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c414588b-29b3-4a1c-ae9e-7ad251901429,sO8e2epLrUud243Xi9odXg",
"AvatarItemId": 2357,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf Twist (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c414588b-29b3-4a1c-ae9e-7ad251901429,s-QTVT5eTECKHL9FnHFCAQ",
"AvatarItemId": 2354,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf Twist (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c414588b-29b3-4a1c-ae9e-7ad251901429,UnHAtXkd2kCdamzw6B3Mvg",
"AvatarItemId": 2356,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf Twist (Turquoise)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c45ed7b8-99bd-4a4b-a9ff-e16edf5d7a18,,,",
"AvatarItemId": 583,
"AvatarItemType": 0,
"FriendlyName": "High Pony Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c6c08eb5-381a-4193-9722-80da95d62abe,,,",
"AvatarItemId": 1008,
"AvatarItemType": 0,
"FriendlyName": "Business Tie (Black)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c70005d5-6276-4a98-acb3-6a77bc19379a,,,",
"AvatarItemId": 1005,
"AvatarItemType": 0,
"FriendlyName": "Glasses (Teal)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c70005d5-6276-4a98-acb3-6a77bc19379a,5H0I1anlkkuUYIM28_ZOlA,l_iJLV14q0eNgOsOI1u0pw,",
"AvatarItemId": 1879,
"AvatarItemType": 0,
"FriendlyName": "Glasses (Purple)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c70005d5-6276-4a98-acb3-6a77bc19379a,9tZq7Xvfj0WhhLBAuAacxA,l_iJLV14q0eNgOsOI1u0pw,",
"AvatarItemId": 1878,
"AvatarItemType": 0,
"FriendlyName": "Glasses (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c70005d5-6276-4a98-acb3-6a77bc19379a,BqNgpjP7a0qmm3I3DNbKLA,l_iJLV14q0eNgOsOI1u0pw,",
"AvatarItemId": 1880,
"AvatarItemType": 0,
"FriendlyName": "Glasses (Yellow)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c855dcc3-96cb-470d-b159-d37a025a47d1,,,",
"AvatarItemId": 1200,
"AvatarItemType": 0,
"FriendlyName": "Dutch Braid Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "cc96f8a5-bc5b-4f89-83b7-ecd53905ada7,,,",
"AvatarItemId": 1007,
"AvatarItemType": 0,
"FriendlyName": "Beard (Thick)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "CTcrvbo3OEepIV4oW8bx4w,,,",
"AvatarItemId": 727,
"AvatarItemType": 0,
"FriendlyName": "Receding Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "d0a9262f-5504-46a7-bb10-7507503db58e,,,",
"AvatarItemId": 1019,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Shirt (Crew Neck, White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "d0a9262f-5504-46a7-bb10-7507503db58e,941c046e-4e95-49f8-a7d7-19071fcc3c94,0440f08f-ef1d-49d8-942b-523056e8bb45,703ff56b-560d-4ff4-8c63-d195e879a328",
"AvatarItemId": 571,
"AvatarItemType": 0,
"FriendlyName": "Alpaca Shirt",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": -1,
"ToolTip": ""
},
{
"AvatarItemDesc": "d0a9262f-5504-46a7-bb10-7507503db58e,95e4cc30-cb68-473d-a395-feadf5b51512,0440f08f-ef1d-49d8-942b-523056e8bb45,",
"AvatarItemId": 1749,
"AvatarItemType": 0,
"FriendlyName": "Rec Room T-Shirt (Crew Neck, Orange)\t",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "d0a9262f-5504-46a7-bb10-7507503db58e,95e4cc30-cb68-473d-a395-feadf5b51512,0440f08f-ef1d-49d8-942b-523056e8bb45,0c496f32-0011-4c4d-9778-59446f70c032",
"AvatarItemId": 565,
"AvatarItemType": 0,
"FriendlyName": "Rec Room T-Shirt (Crew Neck, Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "d766c8d3-76e8-4021-b0a4-24b78fb7eaba,3JrW3FFUvEe6HZ9VjOVjMw,ynPJe7asTk-x_GtcEBQbgA,",
"AvatarItemId": 1971,
"AvatarItemType": 0,
"FriendlyName": "Sweat Suit (Pink)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "d766c8d3-76e8-4021-b0a4-24b78fb7eaba,jeEWPFvzaEGmXaUrxTFvwg,ynPJe7asTk-x_GtcEBQbgA,",
"AvatarItemId": 1974,
"AvatarItemType": 0,
"FriendlyName": "Sweat Suit (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "d766c8d3-76e8-4021-b0a4-24b78fb7eaba,NjCLn5A5h0-V8jB72etCNQ,ynPJe7asTk-x_GtcEBQbgA,",
"AvatarItemId": 1973,
"AvatarItemType": 0,
"FriendlyName": "Sweat Suit (Black)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "d766c8d3-76e8-4021-b0a4-24b78fb7eaba,OT5APcpbpEiMNNah8n4Txw,ynPJe7asTk-x_GtcEBQbgA,",
"AvatarItemId": 1972,
"AvatarItemType": 0,
"FriendlyName": "Sweat Suit (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "d766c8d3-76e8-4021-b0a4-24b78fb7eaba,t2fOeVWloUOKDlIaf4Sxnw,ynPJe7asTk-x_GtcEBQbgA,",
"AvatarItemId": 1970,
"AvatarItemType": 0,
"FriendlyName": "Sweat Suit (Yellow)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "d7730a9e-78a1-4356-bc09-6b066615850b,,,",
"AvatarItemId": 1477,
"AvatarItemType": 0,
"FriendlyName": "Afro Updo Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "d8280c0c-d803-4513-be10-a0ba96d8821e,,,",
"AvatarItemId": 1000,
"AvatarItemType": 0,
"FriendlyName": "Flowhawk Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "d84c0ff9-8fbe-4ed8-abf3-7996e81888ab,,,",
"AvatarItemId": 556,
"AvatarItemType": 0,
"FriendlyName": "Large Afro Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "da4e7b34-2095-4a9e-801e-4f409039e0dd,,,",
"AvatarItemId": 989,
"AvatarItemType": 0,
"FriendlyName": "Buzz Cut Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "de0ac50d-2adb-4114-bd2e-68953b13d706,,,",
"AvatarItemId": 143,
"AvatarItemType": 0,
"FriendlyName": "Blazer (Blue, White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "de0ac50d-2adb-4114-bd2e-68953b13d706,05ac07e1-67f0-486c-abf5-a62866475abb,be2b9293-1d3c-4b1c-b4c5-fad3ab16cf54,",
"AvatarItemId": 144,
"AvatarItemType": 0,
"FriendlyName": "Blazer (Black, Cream)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "de0ac50d-2adb-4114-bd2e-68953b13d706,0ffad843-d6c9-425a-8686-7217009c867e,be2b9293-1d3c-4b1c-b4c5-fad3ab16cf54,",
"AvatarItemId": 148,
"AvatarItemType": 0,
"FriendlyName": "Blazer (Green, Black)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "de0ac50d-2adb-4114-bd2e-68953b13d706,272fe8eb-5061-4729-a7a8-414ff667a82f,be2b9293-1d3c-4b1c-b4c5-fad3ab16cf54,",
"AvatarItemId": 145,
"AvatarItemType": 0,
"FriendlyName": "Blazer (Grey, White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "de0ac50d-2adb-4114-bd2e-68953b13d706,6f2e74bf-1e95-463d-97db-d5d1a53b2c28,be2b9293-1d3c-4b1c-b4c5-fad3ab16cf54,",
"AvatarItemId": 147,
"AvatarItemType": 0,
"FriendlyName": "Blazer (Black, White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "de0ac50d-2adb-4114-bd2e-68953b13d706,9374bf66-2ee5-493b-8439-efce4b201904,be2b9293-1d3c-4b1c-b4c5-fad3ab16cf54,",
"AvatarItemId": 146,
"AvatarItemType": 0,
"FriendlyName": "Blazer (Grey, Black)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "e286863c-2967-4d00-b837-b49487b9484a,,,",
"AvatarItemId": 992,
"AvatarItemType": 0,
"FriendlyName": "Fauxhawk Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "e36bcd98-7e85-43fa-89f8-57e4ec33823a,,,",
"AvatarItemId": 988,
"AvatarItemType": 0,
"FriendlyName": "Bob with Bangs Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "e5b83dfc-b2e1-4dcb-a4ab-9d3a4c8a34ae,,,",
"AvatarItemId": 584,
"AvatarItemType": 0,
"FriendlyName": "Long Wavy Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ea254491-116c-41c4-a9ca-1fa1fca76374,",
"AvatarItemId": 2875,
"AvatarItemType": 0,
"FriendlyName": "Hearing Aids (BTE - Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ea254491-116c-41c4-a9ca-1fa1fca76374,1n-ekJos-EeViiz_zG4jEg",
"AvatarItemId": 2876,
"AvatarItemType": 0,
"FriendlyName": "Hearing Aids (BTE - Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "eb9611c6-bb50-41a2-93e9-7f959815a846,,,",
"AvatarItemId": 587,
"AvatarItemType": 0,
"FriendlyName": "Dreads Long Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ec474314-fd79-441d-852b-d8999274fe57,,,",
"AvatarItemId": 1986,
"AvatarItemType": 0,
"FriendlyName": "Wavy Middle Part Hair ",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,,,",
"AvatarItemId": 1023,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,0ecb8a2a-cffc-47db-aeda-fb0684aef1e5,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 288,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Grey)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,1b1d08f2-12ca-43dd-a44f-ea2820b919b4,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 684,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Black)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,484b6c13-af22-4ad5-8c43-34c0de095d49,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 289,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Light Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,51ef8d39-2b94-4f9e-9620-07b6b0a913a5,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 685,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,5rLtRfNWO0qT7X-0sJkUXg,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 1859,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Lime)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,67bcca75-4ab1-4964-8688-9908c464d355,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 287,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Gold)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,7d8e55fe-3c34-4b4b-9753-0021f6cc6454,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 292,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Cream)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,8377ab96-c908-457f-9fee-b784c9a759f3,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 683,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,Ai85jH88H06ze74VdWolfw,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 1863,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Pure Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,cbe29e9f-f2ac-47fb-97e1-8bad16abb89d,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 687,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Pink)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,dee70c38-7a99-4c2b-9181-665f1bf75aca,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 686,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,Dg3DxHr8GU2e190TGveXqw,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 1858,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Baby Pink)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,DiJGFIO-5Ue8rkEhvF5-Mg,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 1860,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Sienna)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,f8b0cfe8-e129-4578-8bb5-f60af5d38599,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 294,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,fWxn_AarpESryNA9UN8wvA,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 1857,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Teal)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,M0nOQl44DkG_GjTXzAEQCQ,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 1862,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Yellow)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,NRjJuinZ4ki8qaEPvP84tw,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 1864,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Mint)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,sEKIlMfbJ0eED6VtcXcQrw,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 1856,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Army Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,Sg5yKkqJEEulQeUvRhFgJg,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 1861,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Prussian Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,x3kGXCD0UEWkjfXqu_kuxg,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 1855,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Purple)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,Z2L6AqDdcUqxiN1mVw-X9g,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 1865,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Light Purple)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "edc7888c-dc42-48ab-8815-884d227760af,,,",
"AvatarItemId": 1984,
"AvatarItemType": 0,
"FriendlyName": "Short Locs Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "f9dd08f8-16d3-4c39-af4f-89f7bb6e80d3,,,",
"AvatarItemId": 1003,
"AvatarItemType": 0,
"FriendlyName": "Undercut Short Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "fcfcaf63-deb4-45f7-b711-c051c9ea45cb,,,",
"AvatarItemId": 390,
"AvatarItemType": 0,
"FriendlyName": "Top Bun Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "fe15ca53-c5b8-4acf-9309-ff3f4e610fc9,,,",
"AvatarItemId": 1459,
"AvatarItemType": 0,
"FriendlyName": "Winged Hat - Pride (Rainbow Pride)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "fe15ca53-c5b8-4acf-9309-ff3f4e610fc9,knXPidb-Rkayfc3kSHfZeQ,1yMyo6oTjU-VAygoeWaohQ,",
"AvatarItemId": 1460,
"AvatarItemType": 0,
"FriendlyName": "Winged Hat - Pride (Trans Pride)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "feb8b50b-d3da-4e45-b4d0-69aeeb5cfeb3,",
"AvatarItemId": 2334,
"AvatarItemType": 0,
"FriendlyName": "Headdress (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "feb8b50b-d3da-4e45-b4d0-69aeeb5cfeb3,1WBsT99QM0anps6ZoWE59Q",
"AvatarItemId": 2336,
"AvatarItemType": 0,
"FriendlyName": "Headdress (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ffdda4d3-a768-4335-a883-aa3f9dc897bf,",
"AvatarItemId": 2995,
"AvatarItemType": 0,
"FriendlyName": "Trihawk Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ffea7a65-613f-4835-921e-6dd15f357b7e,,,",
"AvatarItemId": 621,
"AvatarItemType": 0,
"FriendlyName": "Long Bangs Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "oYvOo47DJE-DEPlpn5xNUw,whs9olNz9Uani7Gou31mvw,y6aASPUwDkas0W5Yl27ydQ,",
"AvatarItemId": 1450,
"AvatarItemType": 0,
"FriendlyName": "Belt Bag (Rainbow Pride)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "-twtjyBdQ02EAdOfBGTiEw,,,",
"AvatarItemId": 728,
"AvatarItemType": 0,
"FriendlyName": "Van Dyke Beard",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
}
{
"AvatarItemDesc": "0088603e-ec3b-4478-8694-e6fb1989b3f2,,,",
"AvatarItemId": 620,
"AvatarItemType": 0,
"FriendlyName": "Angled Bob Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "04e348b7-107f-47b4-9331-ae3b9fa184ca,,,",
"AvatarItemId": 1980,
"AvatarItemType": 0,
"FriendlyName": "Braided Bun Hair ",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "06306723-ca20-4aa6-b7b3-917113f41ac3,,,",
"AvatarItemId": 1004,
"AvatarItemType": 0,
"FriendlyName": "Cat-Eye Glasses (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "06306723-ca20-4aa6-b7b3-917113f41ac3,cypMpMaVeUuRjm4FLH4czQ,PIjEKhXiCUqtA8FBhLBcmA,",
"AvatarItemId": 1883,
"AvatarItemType": 0,
"FriendlyName": "Cat-Eye Glasses (Teal)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "06306723-ca20-4aa6-b7b3-917113f41ac3,LTXy6g4xe0abuFzOLpVDUg,PIjEKhXiCUqtA8FBhLBcmA,",
"AvatarItemId": 1881,
"AvatarItemType": 0,
"FriendlyName": "Cat-Eye Glasses (Dark Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "06306723-ca20-4aa6-b7b3-917113f41ac3,tMsCUhDslkmdNBfogeSz7w,PIjEKhXiCUqtA8FBhLBcmA,",
"AvatarItemId": 1884,
"AvatarItemType": 0,
"FriendlyName": "Cat-Eye Glasses (Black)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "06306723-ca20-4aa6-b7b3-917113f41ac3,whWKAUSGp0qprsJomq9Nwg,PIjEKhXiCUqtA8FBhLBcmA,",
"AvatarItemId": 1882,
"AvatarItemType": 0,
"FriendlyName": "Cat-Eye Glasses (Pink)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "071f179a-dde2-407f-92b2-f0c16fcb4e39,",
"AvatarItemId": 2337,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf (Beige)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "071f179a-dde2-407f-92b2-f0c16fcb4e39,_T4zEki_wk-UIPdhSaBr_Q",
"AvatarItemId": 2341,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf (Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "071f179a-dde2-407f-92b2-f0c16fcb4e39,5z3jZhYvq0CGmdJ9IcUUsg",
"AvatarItemId": 2340,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf (Brown)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "071f179a-dde2-407f-92b2-f0c16fcb4e39,EgEoJzG7A0aJ92qfInbX7g",
"AvatarItemId": 2342,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "071f179a-dde2-407f-92b2-f0c16fcb4e39,NETGR8iysUyxcZM_oGmrwQ",
"AvatarItemId": 2344,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "071f179a-dde2-407f-92b2-f0c16fcb4e39,OlfQDuz1NUOr88AL2n0jXg",
"AvatarItemId": 2343,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "071f179a-dde2-407f-92b2-f0c16fcb4e39,VudVdOAjZUibHmtFeNkvSw",
"AvatarItemId": 2339,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "0753d7a4-8247-4fca-a6fc-359c26086140,,,",
"AvatarItemId": 993,
"AvatarItemType": 0,
"FriendlyName": "Fonzie Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "09177621-9ecd-4f6a-b6a5-64490139141d,,,",
"AvatarItemId": 81,
"AvatarItemType": 0,
"FriendlyName": "Flat Top Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "0abb6b08-20ce-444f-879e-0d1344df096c,,,",
"AvatarItemId": 1620,
"AvatarItemType": 0,
"FriendlyName": "Round Earrings",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "0d1ae26e-aaa4-4914-ad70-c9ab8cfabc61,,,",
"AvatarItemId": 1979,
"AvatarItemType": 0,
"FriendlyName": "Box Braids with Cuff Hair ",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "12ec292f-0ccd-4c8a-a49c-3598f827659d,,,",
"AvatarItemId": 1740,
"AvatarItemType": 0,
"FriendlyName": "Basic Belt (Black)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "12ec292f-0ccd-4c8a-a49c-3598f827659d,6fmUy748hU2dgwgaijSkUA,rL9p5JY83Eyxj00Dieg7oA,",
"AvatarItemId": 1739,
"AvatarItemType": 0,
"FriendlyName": "Basic Belt (Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "12ec292f-0ccd-4c8a-a49c-3598f827659d,buuNFd8sK0eap78TL1gMNQ,-UFHTNvJs0CGDStb0PFkbQ,",
"AvatarItemId": 1741,
"AvatarItemType": 0,
"FriendlyName": "Basic Belt (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "12ec292f-0ccd-4c8a-a49c-3598f827659d,dBR1uNgk206eVoWntVzVAg,rL9p5JY83Eyxj00Dieg7oA,",
"AvatarItemId": 1738,
"AvatarItemType": 0,
"FriendlyName": "Basic Belt (Brown)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "12ec292f-0ccd-4c8a-a49c-3598f827659d,LIgagNf4gk68EYQdlDruxg,rL9p5JY83Eyxj00Dieg7oA,",
"AvatarItemId": 1736,
"AvatarItemType": 0,
"FriendlyName": "Basic Belt (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "12ec292f-0ccd-4c8a-a49c-3598f827659d,zPGCmxM_b0yTt7tqMaomcw,rL9p5JY83Eyxj00Dieg7oA,",
"AvatarItemId": 1737,
"AvatarItemType": 0,
"FriendlyName": "Basic Belt (Tan)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "14ef6b00-debf-4a85-9755-b4d37df496d3,,,",
"AvatarItemId": 25,
"AvatarItemType": 0,
"FriendlyName": "Baseball Cap (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "14ef6b00-debf-4a85-9755-b4d37df496d3,1b1d08f2-12ca-43dd-a44f-ea2820b919b4,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 983,
"AvatarItemType": 0,
"FriendlyName": "Baseball Cap (Black)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "14ef6b00-debf-4a85-9755-b4d37df496d3,484b6c13-af22-4ad5-8c43-34c0de095d49,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 29,
"AvatarItemType": 0,
"FriendlyName": "Baseball Cap (Light Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "14ef6b00-debf-4a85-9755-b4d37df496d3,51ef8d39-2b94-4f9e-9620-07b6b0a913a5,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 31,
"AvatarItemType": 0,
"FriendlyName": "Baseball Cap (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "14ef6b00-debf-4a85-9755-b4d37df496d3,67bcca75-4ab1-4964-8688-9908c464d355,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 30,
"AvatarItemType": 0,
"FriendlyName": "Baseball Cap (Yellow)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "14ef6b00-debf-4a85-9755-b4d37df496d3,724c79a3-822c-422f-9462-a5374ee0211c,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 26,
"AvatarItemType": 0,
"FriendlyName": "Baseball Cap (White))",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "14ef6b00-debf-4a85-9755-b4d37df496d3,8377ab96-c908-457f-9fee-b784c9a759f3,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 669,
"AvatarItemType": 0,
"FriendlyName": "Baseball Cap (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "14ef6b00-debf-4a85-9755-b4d37df496d3,dee70c38-7a99-4c2b-9181-665f1bf75aca,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 670,
"AvatarItemType": 0,
"FriendlyName": "Baseball Cap (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "193a3bf9-abc0-4d78-8d63-92046908b1c5,,,",
"AvatarItemId": 991,
"AvatarItemType": 0,
"FriendlyName": "Emo Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "1940c740-695d-4481-a802-bb11b6561635,",
"AvatarItemId": 2116,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Untucked Tee",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "1a71064b-794f-40fa-9109-8ad36602b6e1,,,",
"AvatarItemId": 95,
"AvatarItemType": 0,
"FriendlyName": "Shagg Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "1d27b674-f9e2-4ffc-9d8c-a58a1be06457,,,",
"AvatarItemId": 986,
"AvatarItemType": 0,
"FriendlyName": "Afro Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "1fd69ef8-0b74-4962-af5a-67f0bf0358f2,,,",
"AvatarItemId": 998,
"AvatarItemType": 0,
"FriendlyName": "Ponytail Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "21599b51-c50f-43d8-ac5f-62c30cd02ca5,,,",
"AvatarItemId": 994,
"AvatarItemType": 0,
"FriendlyName": "Lori Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "21caa68e-c3fa-474c-af5e-af1e742b7a60,,,",
"AvatarItemId": 1021,
"AvatarItemType": 0,
"FriendlyName": "Tennis Skirt (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "21caa68e-c3fa-474c-af5e-af1e742b7a60,758752bd-db2f-43d2-b580-55b3e1efffd5,b75ef67d-00c3-4ac1-9b72-212032460294,",
"AvatarItemId": 682,
"AvatarItemType": 0,
"FriendlyName": "Tennis Skirt (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "21caa68e-c3fa-474c-af5e-af1e742b7a60,c5deba2a-6e35-4b13-8e94-8ba5457f39df,b75ef67d-00c3-4ac1-9b72-212032460294,",
"AvatarItemId": 681,
"AvatarItemType": 0,
"FriendlyName": "Tennis Skirt (Yellow)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2296ed0d-df56-4d46-b33a-aae9230a47fc,,,",
"AvatarItemId": 1022,
"AvatarItemType": 0,
"FriendlyName": "Zipper Dress (Yellow)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2296ed0d-df56-4d46-b33a-aae9230a47fc,6d703981-2734-4c45-8983-cdd5f328902f,cfabdefe-0890-436e-b2a3-b5c712e22955,",
"AvatarItemId": 255,
"AvatarItemType": 0,
"FriendlyName": "Zipper Dress (Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2296ed0d-df56-4d46-b33a-aae9230a47fc,830be2fa-60a5-48cc-931f-34b670eae4bd,cfabdefe-0890-436e-b2a3-b5c712e22955,",
"AvatarItemId": 254,
"AvatarItemType": 0,
"FriendlyName": "Zipper Dress (Purple)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2296ed0d-df56-4d46-b33a-aae9230a47fc,bbfa08e3-8e6b-4e0f-b264-1b398d7cd44a,cfabdefe-0890-436e-b2a3-b5c712e22955,",
"AvatarItemId": 253,
"AvatarItemType": 0,
"FriendlyName": "Zipper Dress (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "22a857bb-270a-4278-adbd-2df41181b36f,",
"AvatarItemId": 2345,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf Halo (Turquoise)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "22a857bb-270a-4278-adbd-2df41181b36f,0p_eXn2gXUKrshSEmrQx6Q",
"AvatarItemId": 2350,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf Halo (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "22a857bb-270a-4278-adbd-2df41181b36f,3cPbhpDX-EqDQy6eN1E5Ug",
"AvatarItemId": 2346,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf Halo (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "22a857bb-270a-4278-adbd-2df41181b36f,fAmEEm6ziUO2ZXTscQWtSg",
"AvatarItemId": 2351,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf Halo (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "22a857bb-270a-4278-adbd-2df41181b36f,gEuE-X67b0-q5C0Tv11_nA",
"AvatarItemId": 2348,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf Halo (Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "22a857bb-270a-4278-adbd-2df41181b36f,gk_mQ-jsakmxhZYYNlRl_w",
"AvatarItemId": 2349,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf Halo (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "241506f6-bf88-4b46-b5fe-513a225421f4,,,",
"AvatarItemId": 417,
"AvatarItemType": 0,
"FriendlyName": "Half Up Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "24a240f4-1574-420b-b898-a7e91f170759,,,",
"AvatarItemId": 582,
"AvatarItemType": 0,
"FriendlyName": "Back Bun Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2822aa50-4344-434d-b46f-fd9443f865b9,,,",
"AvatarItemId": 1981,
"AvatarItemType": 0,
"FriendlyName": "Curly Bob Hair ",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2cb4f372-3372-4583-8b57-c4e3988e3c28,,,",
"AvatarItemId": 999,
"AvatarItemType": 0,
"FriendlyName": "Punky Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2e59d8d0-91a0-4449-bfdc-a5d663fd9343,,,",
"AvatarItemId": 1009,
"AvatarItemType": 0,
"FriendlyName": "Collared Shirt (Plaid, Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2e59d8d0-91a0-4449-bfdc-a5d663fd9343,0iSsaY-HgkmLaRHCn5vEdw,PioQ0o3yP0a6szPZ4EKs2A,",
"AvatarItemId": 1014,
"AvatarItemType": 0,
"FriendlyName": "Collared Shirt (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2e59d8d0-91a0-4449-bfdc-a5d663fd9343,55901f12-d5b5-4fa8-b4c8-e479689ee39d,f600037d-c9c0-43fa-b45b-02f456f9dd5f,",
"AvatarItemId": 674,
"AvatarItemType": 0,
"FriendlyName": "Collared Shirt (Denim)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2e59d8d0-91a0-4449-bfdc-a5d663fd9343,bf82f2f6-9af8-431e-a296-0890dea48ba7,d015cae7-a905-49e4-8823-6dec069689a6,",
"AvatarItemId": 672,
"AvatarItemType": 0,
"FriendlyName": "Collared Shirt (Argyle)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2e59d8d0-91a0-4449-bfdc-a5d663fd9343,EfdMcnfHt0mr0PQ_maaYOg,DRJcNhkqvkKFEaZpOguR6w,",
"AvatarItemId": 1016,
"AvatarItemType": 0,
"FriendlyName": "Collared Shirt (Flowers, Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2e59d8d0-91a0-4449-bfdc-a5d663fd9343,FAviMCQ_EE2Mpt6QPo5OEw,PioQ0o3yP0a6szPZ4EKs2A,",
"AvatarItemId": 1015,
"AvatarItemType": 0,
"FriendlyName": "Collared Shirt (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2e59d8d0-91a0-4449-bfdc-a5d663fd9343,jGj28vhq8EGwP2RuM074aQ,PioQ0o3yP0a6szPZ4EKs2A,",
"AvatarItemId": 1012,
"AvatarItemType": 0,
"FriendlyName": "Collared Shirt (Yellow)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2e59d8d0-91a0-4449-bfdc-a5d663fd9343,kmj5zOjcwku_WWKroCeiVQ,PioQ0o3yP0a6szPZ4EKs2A,",
"AvatarItemId": 1011,
"AvatarItemType": 0,
"FriendlyName": "Collared Shirt (Pink)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2e59d8d0-91a0-4449-bfdc-a5d663fd9343,MFrcSQ1DYUm8imvy4ypgvw,PioQ0o3yP0a6szPZ4EKs2A,",
"AvatarItemId": 1013,
"AvatarItemType": 0,
"FriendlyName": "Collared Shirt (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2e7cbdb0-cf22-4938-964f-acca57d221b7,",
"AvatarItemId": 2878,
"AvatarItemType": 0,
"FriendlyName": "Hearing Aids (BTE Earmold - Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2e7cbdb0-cf22-4938-964f-acca57d221b7,aEsXeTI_SEOclbm82n17tg",
"AvatarItemId": 2880,
"AvatarItemType": 0,
"FriendlyName": "Hearing Aids (BTE Earmold - Gray)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "2e7cbdb0-cf22-4938-964f-acca57d221b7,pZDvYABTN06KdJ5Ck60XLA",
"AvatarItemId": 2879,
"AvatarItemType": 0,
"FriendlyName": "Hearing Aids (BTE Earmold - Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "36b2ccf4-4f42-4dc4-aeaf-f3d10b2a6d30,,,",
"AvatarItemId": 1982,
"AvatarItemType": 0,
"FriendlyName": "Etched Fade Hair ",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "37f7b94a-92ba-4f5e-b94c-de00acfa4722,,,",
"AvatarItemId": 1983,
"AvatarItemType": 0,
"FriendlyName": "Etched Flattop Hair ",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,,,",
"AvatarItemId": 6,
"AvatarItemType": 0,
"FriendlyName": "Headband (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,0ecb8a2a-cffc-47db-aeda-fb0684aef1e5,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 11,
"AvatarItemType": 0,
"FriendlyName": "Headband (Grey)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,1b1d08f2-12ca-43dd-a44f-ea2820b919b4,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 663,
"AvatarItemType": 0,
"FriendlyName": "Headband (Black)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,484b6c13-af22-4ad5-8c43-34c0de095d49,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 12,
"AvatarItemType": 0,
"FriendlyName": "Headband (Light Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,51ef8d39-2b94-4f9e-9620-07b6b0a913a5,018a5c07-e956-457d-a540-a5e2cd68da09,",
"AvatarItemId": 667,
"AvatarItemType": 0,
"FriendlyName": "Headband (Orange, White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,51ef8d39-2b94-4f9e-9620-07b6b0a913a5,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 13,
"AvatarItemType": 0,
"FriendlyName": "Headband (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,67bcca75-4ab1-4964-8688-9908c464d355,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 16,
"AvatarItemType": 0,
"FriendlyName": "Headband (Yellow)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,6dd95046-acf8-42fe-ab78-80a334096a9d,56a92c8d-af53-413e-929e-4a9a3cfad780,",
"AvatarItemId": 668,
"AvatarItemType": 0,
"FriendlyName": "Headband (Red, White, Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,7d8e55fe-3c34-4b4b-9753-0021f6cc6454,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 664,
"AvatarItemType": 0,
"FriendlyName": "Headband (Cream)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,8377ab96-c908-457f-9fee-b784c9a759f3,018a5c07-e956-457d-a540-a5e2cd68da09,",
"AvatarItemId": 20,
"AvatarItemType": 0,
"FriendlyName": "Headband (Red, White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,8377ab96-c908-457f-9fee-b784c9a759f3,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 7,
"AvatarItemType": 0,
"FriendlyName": "Headband (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,cbe29e9f-f2ac-47fb-97e1-8bad16abb89d,018a5c07-e956-457d-a540-a5e2cd68da09,",
"AvatarItemId": 666,
"AvatarItemType": 0,
"FriendlyName": "Headband (Pink, White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,cbe29e9f-f2ac-47fb-97e1-8bad16abb89d,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 14,
"AvatarItemType": 0,
"FriendlyName": "Headband (Pink)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,dee70c38-7a99-4c2b-9181-665f1bf75aca,018a5c07-e956-457d-a540-a5e2cd68da09,",
"AvatarItemId": 665,
"AvatarItemType": 0,
"FriendlyName": "Headband (Blue, White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,dee70c38-7a99-4c2b-9181-665f1bf75aca,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 15,
"AvatarItemType": 0,
"FriendlyName": "Headband (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "40528de7-38a3-4a7c-8f93-6d3bfa5573f2,f8b0cfe8-e129-4578-8bb5-f60af5d38599,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 10,
"AvatarItemType": 0,
"FriendlyName": "Headband (Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "45eaab67-19c2-4601-8f80-3565a4dceba4,,,",
"AvatarItemId": 1199,
"AvatarItemType": 0,
"FriendlyName": "Pompadour Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "45f5e714-8a5f-4385-a97f-675066167011,,,",
"AvatarItemId": 112,
"AvatarItemType": 0,
"FriendlyName": "Seventies Stache",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "48fdfbc6-fca4-424c-aa57-3fcea41e23dc,,,",
"AvatarItemId": 1742,
"AvatarItemType": 0,
"FriendlyName": "Leather Necklace (Black)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "48fdfbc6-fca4-424c-aa57-3fcea41e23dc,gsHBUqA1gE2XNTPA3VvBLQ,FwjsTo0nb0uNU6l8XvllNA,",
"AvatarItemId": 1745,
"AvatarItemType": 0,
"FriendlyName": "Leather Necklace (Brown)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "48fdfbc6-fca4-424c-aa57-3fcea41e23dc,JUQn0_PLIkytCrkAg0FflQ,FwjsTo0nb0uNU6l8XvllNA,",
"AvatarItemId": 1744,
"AvatarItemType": 0,
"FriendlyName": "Leather Necklace (Tan)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "4d507dfa-4a99-4ac0-8537-229e9dc0eb4a,,,",
"AvatarItemId": 1017,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Tank Top (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "4eaaad39-aa44-4791-8b67-2eafa8305850,,,",
"AvatarItemId": 1977,
"AvatarItemType": 0,
"FriendlyName": "Afro Puffs Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "5beeb4c4-f276-4eae-87aa-9302e45b05b7,,,",
"AvatarItemId": 1480,
"AvatarItemType": 0,
"FriendlyName": "Cornrows Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "5cd08cfb-c729-4c30-96d9-6a99bb934d91,,,",
"AvatarItemId": 124,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Sash",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "62ce4109-8dee-4895-bf1b-bfa143db4c7e,,,",
"AvatarItemId": 149,
"AvatarItemType": 0,
"FriendlyName": "Slim Blazer (Teal)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "62ce4109-8dee-4895-bf1b-bfa143db4c7e,ad61c418-6d77-4a99-8ac5-9f10f5a3d42f,0f36bb97-c61b-4281-929f-ff1d0d11be86,",
"AvatarItemId": 468,
"AvatarItemType": 0,
"FriendlyName": "Slim Blazer (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "62ce4109-8dee-4895-bf1b-bfa143db4c7e,cd5d7285-202d-42d0-b93f-04245875793e,0f36bb97-c61b-4281-929f-ff1d0d11be86,",
"AvatarItemId": 469,
"AvatarItemType": 0,
"FriendlyName": "Slim Blazer (Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "6b9e022c-0b68-48fd-8eca-da8573c18900,,,",
"AvatarItemId": 131,
"AvatarItemType": 0,
"FriendlyName": "Long Scarf (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "6b9e022c-0b68-48fd-8eca-da8573c18900,5c4a2b35-0e1c-44de-8c3a-96d4a6458b1b,cf119781-5bd9-4b85-9a0b-12e82e988c23,",
"AvatarItemId": 461,
"AvatarItemType": 0,
"FriendlyName": "Long Scarf (Purple)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "6b9e022c-0b68-48fd-8eca-da8573c18900,6dd95046-acf8-42fe-ab78-80a334096a9d,cf119781-5bd9-4b85-9a0b-12e82e988c23,",
"AvatarItemId": 460,
"AvatarItemType": 0,
"FriendlyName": "Long Scarf (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "6b9e022c-0b68-48fd-8eca-da8573c18900,d6edbc00-3c1d-4f49-8412-3ef8c7c5f4c2,cf119781-5bd9-4b85-9a0b-12e82e988c23,",
"AvatarItemId": 459,
"AvatarItemType": 0,
"FriendlyName": "Long Scarf (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "6d815b35-6f68-4ed4-817d-70f141e1a571,,,",
"AvatarItemId": 193,
"AvatarItemType": 0,
"FriendlyName": "Collared Dress (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "6d815b35-6f68-4ed4-817d-70f141e1a571,6564acf1-4d70-4f92-92ac-08e2b76dbb6b,2c8924aa-68f8-4912-9759-18992f72f08a,",
"AvatarItemId": 196,
"AvatarItemType": 0,
"FriendlyName": "Collared Dress (Purple)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "6d815b35-6f68-4ed4-817d-70f141e1a571,d66aa400-aa5a-4539-a25d-5f8ce94dc281,2c8924aa-68f8-4912-9759-18992f72f08a,",
"AvatarItemId": 195,
"AvatarItemType": 0,
"FriendlyName": "Collared Dress (Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "6d815b35-6f68-4ed4-817d-70f141e1a571,f750de46-3758-4f7d-9709-0a84b1027009,2c8924aa-68f8-4912-9759-18992f72f08a,",
"AvatarItemId": 194,
"AvatarItemType": 0,
"FriendlyName": "Collared Dress (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "6e48363d-cc62-40a8-87f9-a69fae90c002,,,",
"AvatarItemId": 1978,
"AvatarItemType": 0,
"FriendlyName": "Box Braid Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "71921831-ba6f-408b-a00e-2fd97663636f,,,",
"AvatarItemId": 1024,
"AvatarItemType": 0,
"FriendlyName": "Wrist Tape (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "71921831-ba6f-408b-a00e-2fd97663636f,1b1d08f2-12ca-43dd-a44f-ea2820b919b4,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 297,
"AvatarItemType": 0,
"FriendlyName": "Wrist Tape (Black)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "71921831-ba6f-408b-a00e-2fd97663636f,7d8e55fe-3c34-4b4b-9753-0021f6cc6454,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 296,
"AvatarItemType": 0,
"FriendlyName": "Wrist Tape (Cream)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "77d3c585-4928-4471-a425-89036efe7299,,,",
"AvatarItemId": 1001,
"AvatarItemType": 0,
"FriendlyName": "Spiky Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "79b90274-6eec-4664-acfb-4a123334661e,,,",
"AvatarItemId": 997,
"AvatarItemType": 0,
"FriendlyName": "Pig Tails Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "7b857a8c-92ad-4028-a2c2-b3c20cdab5f2,,,",
"AvatarItemId": 1020,
"AvatarItemType": 0,
"FriendlyName": "T-Shirt",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "7b857a8c-92ad-4028-a2c2-b3c20cdab5f2,1b1d08f2-12ca-43dd-a44f-ea2820b919b4,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 230,
"AvatarItemType": 0,
"FriendlyName": "Tank Top (Black)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "7b857a8c-92ad-4028-a2c2-b3c20cdab5f2,48abd952-214f-48b2-a8f1-1146f6f69aa2,b78008e8-abbd-4ece-be34-9a911f721fcc,",
"AvatarItemId": 677,
"AvatarItemType": 0,
"FriendlyName": "Tank Top (Zebra)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "7b857a8c-92ad-4028-a2c2-b3c20cdab5f2,51ef8d39-2b94-4f9e-9620-07b6b0a913a5,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 227,
"AvatarItemType": 0,
"FriendlyName": "Tank Top (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "7b857a8c-92ad-4028-a2c2-b3c20cdab5f2,5c4a2b35-0e1c-44de-8c3a-96d4a6458b1b,9c03f381-7357-4d0f-8cda-8737d4c43d25,",
"AvatarItemId": 679,
"AvatarItemType": 0,
"FriendlyName": "Tank Top (Rainbow)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "7b857a8c-92ad-4028-a2c2-b3c20cdab5f2,6d703981-2734-4c45-8983-cdd5f328902f,a0271cd0-e172-4d3f-aa2f-9806f21a82d2,",
"AvatarItemId": 676,
"AvatarItemType": 0,
"FriendlyName": "Tank Top (Camo)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "7b857a8c-92ad-4028-a2c2-b3c20cdab5f2,8377ab96-c908-457f-9fee-b784c9a759f3,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 228,
"AvatarItemType": 0,
"FriendlyName": "Tank Top (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "7b857a8c-92ad-4028-a2c2-b3c20cdab5f2,ad61c418-6d77-4a99-8ac5-9f10f5a3d42f,b292eb4b-07e3-4a48-99b5-3c6587a1e02e,",
"AvatarItemId": 678,
"AvatarItemType": 0,
"FriendlyName": "Tank Top (Dots)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "7b857a8c-92ad-4028-a2c2-b3c20cdab5f2,dee70c38-7a99-4c2b-9181-665f1bf75aca,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 229,
"AvatarItemType": 0,
"FriendlyName": "Tank Top (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "7dd6f7b0-7ba0-429f-a04f-e32d3a79ee61,,,",
"AvatarItemId": 585,
"AvatarItemType": 0,
"FriendlyName": "Short Wavy Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "849cabc9-db40-4448-b923-defe4e700072",
"AvatarItemId": 5954,
"AvatarItemType": 0,
"FriendlyName": "Bride of Frank Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "84cd594c-1cd8-4b4d-8409-85c8fd5fb02a,,,",
"AvatarItemId": 198,
"AvatarItemType": 0,
"FriendlyName": "Stoll Dress (Pink)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "84cd594c-1cd8-4b4d-8409-85c8fd5fb02a,64850553-cdfe-455a-ac00-dafbe63d613e,91a451c1-b285-4c48-b14d-59ded8cc006f,",
"AvatarItemId": 199,
"AvatarItemType": 0,
"FriendlyName": "Stoll Dress (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "84cd594c-1cd8-4b4d-8409-85c8fd5fb02a,761a3193-60f0-4190-80c7-285b8192e794,91a451c1-b285-4c48-b14d-59ded8cc006f,",
"AvatarItemId": 200,
"AvatarItemType": 0,
"FriendlyName": "Stoll Dress (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "84cd594c-1cd8-4b4d-8409-85c8fd5fb02a,a819f49b-6c7a-49d3-9e6a-d9d79ef5019f,91a451c1-b285-4c48-b14d-59ded8cc006f,",
"AvatarItemId": 201,
"AvatarItemType": 0,
"FriendlyName": "Stoll Dress (Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "880a3cc0-7407-4b61-b759-f9dd890fe9e5,,,",
"AvatarItemId": 987,
"AvatarItemType": 0,
"FriendlyName": "Bob Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "88b6ddeb-a455-460d-91d9-a4569ef6903c,,,",
"AvatarItemId": 1621,
"AvatarItemType": 0,
"FriendlyName": "Square Earrings ",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "8aa79563-ace1-4ba7-ad0c-f3210a78142f,,,",
"AvatarItemId": 1018,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Shirt (V-Neck, White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "8aa79563-ace1-4ba7-ad0c-f3210a78142f,95e4cc30-cb68-473d-a395-feadf5b51512,05f0ee6e-c824-470e-9178-5ed576c6fe0c,",
"AvatarItemId": 675,
"AvatarItemType": 0,
"FriendlyName": "Rec Room T-Shirt (V-Neck, Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "8b9f1413-e786-4a30-946c-9292f207875a,,,",
"AvatarItemId": 91,
"AvatarItemType": 0,
"FriendlyName": "Pulp Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "8c35c804-e8d5-49d2-8d5a-ea19fb70bfa6,,,",
"AvatarItemId": 1478,
"AvatarItemType": 0,
"FriendlyName": "Pencil Bun Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "8d10cc78-6b00-45f3-affb-205e9cc5b03f,,,",
"AvatarItemId": 1006,
"AvatarItemType": 0,
"FriendlyName": "Beard (Close)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "92302d9d-c527-418c-ac5d-1fa869727505,,,",
"AvatarItemId": 996,
"AvatarItemType": 0,
"FriendlyName": "Part Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "95ab7a7c-c35d-4da5-9955-0921064470b6,,,",
"AvatarItemId": 83,
"AvatarItemType": 0,
"FriendlyName": "Gekko Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9b5bde11-7408-4798-9fcb-c7ec175444df,,,",
"AvatarItemId": 1619,
"AvatarItemType": 0,
"FriendlyName": "Hoop Earrings",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9bf5d259-7774-4cbe-a90f-7f188cc0dce7,,,",
"AvatarItemId": 361,
"AvatarItemType": 0,
"FriendlyName": "Thick Goatee",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9bf75b23-84e9-436b-bbb8-4180ccd86b94,,,",
"AvatarItemId": 1985,
"AvatarItemType": 0,
"FriendlyName": "Wolf Cut Hair) ",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9c20fdd5-acf1-426c-b85a-2220ceee9472,,,",
"AvatarItemId": 1987,
"AvatarItemType": 0,
"FriendlyName": "Short Curly Twists Hair ",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9c8fc7f0-8f99-4aad-a34f-8d979f6ae352,,,",
"AvatarItemId": 150,
"AvatarItemType": 0,
"FriendlyName": "Button Top (Pink)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9c8fc7f0-8f99-4aad-a34f-8d979f6ae352,49f5864f-9d40-497c-88c8-e87f64d41d74,dafa658e-753b-46cb-bd85-85c1de5e6ea7,",
"AvatarItemId": 151,
"AvatarItemType": 0,
"FriendlyName": "Button Top (Tan)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9c8fc7f0-8f99-4aad-a34f-8d979f6ae352,c5deba2a-6e35-4b13-8e94-8ba5457f39df,dafa658e-753b-46cb-bd85-85c1de5e6ea7,",
"AvatarItemId": 153,
"AvatarItemType": 0,
"FriendlyName": "Button Top (Yellow)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9c8fc7f0-8f99-4aad-a34f-8d979f6ae352,e0397982-c2c2-4733-9a40-46e18675b5af,dafa658e-753b-46cb-bd85-85c1de5e6ea7,",
"AvatarItemId": 152,
"AvatarItemType": 0,
"FriendlyName": "Button Top (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9d9fadb6-97eb-480e-a224-4e0179082071,,,",
"AvatarItemId": 995,
"AvatarItemType": 0,
"FriendlyName": "Meatball Buns Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9db35412-7a08-49dd-b80d-59c34a4616ea,",
"AvatarItemId": 2328,
"AvatarItemType": 0,
"FriendlyName": "Brimless Cap (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9db35412-7a08-49dd-b80d-59c34a4616ea,hgLq0WyUAUSl2sboUrpTKQ",
"AvatarItemId": 2330,
"AvatarItemType": 0,
"FriendlyName": "Brimless Cap (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9db35412-7a08-49dd-b80d-59c34a4616ea,JzLPlVNG20G9mxG_4PF8Fg",
"AvatarItemId": 2332,
"AvatarItemType": 0,
"FriendlyName": "Brimless Cap (Navy)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9db35412-7a08-49dd-b80d-59c34a4616ea,M5uFQQpoQE-5CKMJnDv_LA",
"AvatarItemId": 2331,
"AvatarItemType": 0,
"FriendlyName": "Brimless Cap (Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "9db35412-7a08-49dd-b80d-59c34a4616ea,VuMDnpnK50mzgUMwJ4F6Jw",
"AvatarItemId": 2333,
"AvatarItemType": 0,
"FriendlyName": "Brimless Cap (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "a0e6fe4d-991d-4bd1-a1dc-ac4c7375fa4d,",
"AvatarItemId": 2359,
"AvatarItemType": 0,
"FriendlyName": "Head Wrap (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "a0e6fe4d-991d-4bd1-a1dc-ac4c7375fa4d,0zldWzi4H0OQwsWPt6gl-w",
"AvatarItemId": 2364,
"AvatarItemType": 0,
"FriendlyName": "Head Wrap (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "a0e6fe4d-991d-4bd1-a1dc-ac4c7375fa4d,a0A1q_e1q06qquiu2KaZhA",
"AvatarItemId": 2361,
"AvatarItemType": 0,
"FriendlyName": "Head Wrap (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "a0e6fe4d-991d-4bd1-a1dc-ac4c7375fa4d,M_BhFve7SkC7IJoymLiCLg",
"AvatarItemId": 2363,
"AvatarItemType": 0,
"FriendlyName": "Head Wrap (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "a0e6fe4d-991d-4bd1-a1dc-ac4c7375fa4d,rwESUxIrQEKA2hdQpcaPaA",
"AvatarItemId": 2362,
"AvatarItemType": 0,
"FriendlyName": "Head Wrap (Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "a12f724f-4a73-4ab8-aad4-6bfc662b4dd6,,,",
"AvatarItemId": 1002,
"AvatarItemType": 0,
"FriendlyName": "Undercut Long Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "a52353bf-8693-45fb-a04a-19cf62a06482",
"AvatarItemId": 5955,
"AvatarItemType": 0,
"FriendlyName": "Curlers Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "a6cbfe76-534a-4655-a8a8-3fed13d001c7,,,",
"AvatarItemId": 726,
"AvatarItemType": 0,
"FriendlyName": "Bald Top Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b148cb1e-df81-442f-aea6-ab1727aad00e,,,",
"AvatarItemId": 990,
"AvatarItemType": 0,
"FriendlyName": "Chunky Afro Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b3b59410-d3df-464b-a75b-500a9e5ea154,,,",
"AvatarItemId": 1772,
"AvatarItemType": 0,
"FriendlyName": "Pocket Tee (Black) ",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b3b59410-d3df-464b-a75b-500a9e5ea154,Aex0Zh1RQ0u9oTDFF1cFIg,_o3mI1mjE02vekPVyJg8Aw,",
"AvatarItemId": 1781,
"AvatarItemType": 0,
"FriendlyName": "Pocket Tee (Yellow)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b3b59410-d3df-464b-a75b-500a9e5ea154,El0s9F6cfkywcKOkqwbJtQ,_o3mI1mjE02vekPVyJg8Aw,",
"AvatarItemId": 1779,
"AvatarItemType": 0,
"FriendlyName": "Pocket Tee (Grey)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b3b59410-d3df-464b-a75b-500a9e5ea154,J9cK9BKtHUinG-DwAoPi3g,_o3mI1mjE02vekPVyJg8Aw,",
"AvatarItemId": 1774,
"AvatarItemType": 0,
"FriendlyName": "Pocket Tee (Dreen)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b3b59410-d3df-464b-a75b-500a9e5ea154,N0fBxjrCekO-HUqmc3MufQ,_o3mI1mjE02vekPVyJg8Aw,",
"AvatarItemId": 1775,
"AvatarItemType": 0,
"FriendlyName": "Pocket Tee (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b3b59410-d3df-464b-a75b-500a9e5ea154,oNoEl-nDqk-HLsfz1538oA,_o3mI1mjE02vekPVyJg8Aw,",
"AvatarItemId": 1776,
"AvatarItemType": 0,
"FriendlyName": "Pocket Tee (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b3b59410-d3df-464b-a75b-500a9e5ea154,pQ_3mZI7yEaxMw9n_Fr4Sg,_o3mI1mjE02vekPVyJg8Aw,",
"AvatarItemId": 1778,
"AvatarItemType": 0,
"FriendlyName": "Pocket Tee (Pink)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b3b59410-d3df-464b-a75b-500a9e5ea154,TpFWTdEW2kqtpvc0sPv-dw,_o3mI1mjE02vekPVyJg8Aw,",
"AvatarItemId": 1777,
"AvatarItemType": 0,
"FriendlyName": "Pocket Tee (Purple)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b3b59410-d3df-464b-a75b-500a9e5ea154,-VF3K4miGE28LxMgqVehRQ,_o3mI1mjE02vekPVyJg8Aw,",
"AvatarItemId": 1773,
"AvatarItemType": 0,
"FriendlyName": "Pocket Tee (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b3b59410-d3df-464b-a75b-500a9e5ea154,vxZVeH2b_E6XlqyqCW0hBA,_o3mI1mjE02vekPVyJg8Aw,",
"AvatarItemId": 1780,
"AvatarItemType": 0,
"FriendlyName": "Pocket Tee (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,3a1oW3_MY0e4lDN2V1X4ig,za8Mz14Ww0KtC6wavUPXdg,",
"AvatarItemId": 1771,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - Pride (Nonbinary Pride)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,9jB8U3yxjE6hanEZgMdvtA",
"AvatarItemId": 2202,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - AAPI (AAPI Heritage Month)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,D_Xmo0rOzkS-kgq1CYXt3g,tnCJp2eDI0SwjVfJMhk3LQ,",
"AvatarItemId": 1458,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - Pride (Trans Pride)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,DIeasJUIj0KNetAzPzuIrg,o3Q2gADhh06dgaipkkdMsA,",
"AvatarItemId": 1757,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - Pride (Bi Pride)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,EkA09Hj2m0u3c5STynn3Bw",
"AvatarItemId": 2887,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - ANAM (Autism & Neurodiversity Awareness Month)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,G6Udm6kMdE28vmRY5KPanA,Fw79pqDPP0C8H07AnTY-Vg,",
"AvatarItemId": 1756,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - Pride (Lesbian Pride)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,MfF0wizDjUa7RUE-AVJpvA",
"AvatarItemId": 2194,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - Pride (Intersex Pride)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,PIwziHk1BUuYkAf6kuK6wA",
"AvatarItemId": 2059,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - BHM (Black History Month)\t",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,PRLBrEEZhUumm3VnYVJP6Q",
"AvatarItemId": 2192,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - Pride (Aromantic Pride)\t",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,sf962XJ0tkis0svkMkZCXQ,4bI7QRvdnEansPkwx8Di9A,",
"AvatarItemId": 1791,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - Pride (Pan Pride)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,sxUE0iOSZEmezm54T7xI3Q,tlpa7195x0CkmSjpR1RArQ,",
"AvatarItemId": 1457,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - Pride (Rainbow Pride)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,tm7Cnd3LzkqWHA1JMrgoeA,nbLr3c3lOkiWhNg9IYbt6Q,",
"AvatarItemId": 1770,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - Pride (Ace Pride)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b6rLwzD4NkKV7xKn9ZYVkA,Xt3Ndm8mC0qsLClPIbgwUw",
"AvatarItemId": 2193,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Hoodie - Pride (Genderfluid Pride)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b8e485d4-b5c2-480e-908c-d9b500375759,",
"AvatarItemId": 2881,
"AvatarItemType": 0,
"FriendlyName": "Hearing Aids (Cochlear Implant - Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b8e485d4-b5c2-480e-908c-d9b500375759,7ZRNVpxhWk-j8R3oj0oVXg",
"AvatarItemId": 2883,
"AvatarItemType": 0,
"FriendlyName": "Hearing Aids (Cochlear Implant - Gray)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "b8e485d4-b5c2-480e-908c-d9b500375759,8WJI7RAuaEy4KvQiQhoKBw",
"AvatarItemId": 2882,
"AvatarItemType": 0,
"FriendlyName": "Hearing Aids (Cochlear Implant - Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c414588b-29b3-4a1c-ae9e-7ad251901429,",
"AvatarItemId": 2352,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf Twist (Beige)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c414588b-29b3-4a1c-ae9e-7ad251901429,irw2uj4c2Eil0ndPCTqodQ",
"AvatarItemId": 2355,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf Twist (Yellow)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c414588b-29b3-4a1c-ae9e-7ad251901429,pPZ3sDw3B06mKiYsAiAt9w",
"AvatarItemId": 2358,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf Twist (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c414588b-29b3-4a1c-ae9e-7ad251901429,sO8e2epLrUud243Xi9odXg",
"AvatarItemId": 2357,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf Twist (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c414588b-29b3-4a1c-ae9e-7ad251901429,s-QTVT5eTECKHL9FnHFCAQ",
"AvatarItemId": 2354,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf Twist (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c414588b-29b3-4a1c-ae9e-7ad251901429,UnHAtXkd2kCdamzw6B3Mvg",
"AvatarItemId": 2356,
"AvatarItemType": 0,
"FriendlyName": "Head Scarf Twist (Turquoise)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c45ed7b8-99bd-4a4b-a9ff-e16edf5d7a18,,,",
"AvatarItemId": 583,
"AvatarItemType": 0,
"FriendlyName": "High Pony Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c6c08eb5-381a-4193-9722-80da95d62abe,,,",
"AvatarItemId": 1008,
"AvatarItemType": 0,
"FriendlyName": "Business Tie (Black)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c70005d5-6276-4a98-acb3-6a77bc19379a,,,",
"AvatarItemId": 1005,
"AvatarItemType": 0,
"FriendlyName": "Glasses (Teal)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c70005d5-6276-4a98-acb3-6a77bc19379a,5H0I1anlkkuUYIM28_ZOlA,l_iJLV14q0eNgOsOI1u0pw,",
"AvatarItemId": 1879,
"AvatarItemType": 0,
"FriendlyName": "Glasses (Purple)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c70005d5-6276-4a98-acb3-6a77bc19379a,9tZq7Xvfj0WhhLBAuAacxA,l_iJLV14q0eNgOsOI1u0pw,",
"AvatarItemId": 1878,
"AvatarItemType": 0,
"FriendlyName": "Glasses (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c70005d5-6276-4a98-acb3-6a77bc19379a,BqNgpjP7a0qmm3I3DNbKLA,l_iJLV14q0eNgOsOI1u0pw,",
"AvatarItemId": 1880,
"AvatarItemType": 0,
"FriendlyName": "Glasses (Yellow)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "c855dcc3-96cb-470d-b159-d37a025a47d1,,,",
"AvatarItemId": 1200,
"AvatarItemType": 0,
"FriendlyName": "Dutch Braid Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "cc96f8a5-bc5b-4f89-83b7-ecd53905ada7,,,",
"AvatarItemId": 1007,
"AvatarItemType": 0,
"FriendlyName": "Beard (Thick)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "CTcrvbo3OEepIV4oW8bx4w,,,",
"AvatarItemId": 727,
"AvatarItemType": 0,
"FriendlyName": "Receding Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "d0a9262f-5504-46a7-bb10-7507503db58e,,,",
"AvatarItemId": 1019,
"AvatarItemType": 0,
"FriendlyName": "Rec Room Shirt (Crew Neck, White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "d0a9262f-5504-46a7-bb10-7507503db58e,941c046e-4e95-49f8-a7d7-19071fcc3c94,0440f08f-ef1d-49d8-942b-523056e8bb45,703ff56b-560d-4ff4-8c63-d195e879a328",
"AvatarItemId": 571,
"AvatarItemType": 0,
"FriendlyName": "Alpaca Shirt",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": -1,
"ToolTip": ""
},
{
"AvatarItemDesc": "d0a9262f-5504-46a7-bb10-7507503db58e,95e4cc30-cb68-473d-a395-feadf5b51512,0440f08f-ef1d-49d8-942b-523056e8bb45,",
"AvatarItemId": 1749,
"AvatarItemType": 0,
"FriendlyName": "Rec Room T-Shirt (Crew Neck, Orange)\t",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "d0a9262f-5504-46a7-bb10-7507503db58e,95e4cc30-cb68-473d-a395-feadf5b51512,0440f08f-ef1d-49d8-942b-523056e8bb45,0c496f32-0011-4c4d-9778-59446f70c032",
"AvatarItemId": 565,
"AvatarItemType": 0,
"FriendlyName": "Rec Room T-Shirt (Crew Neck, Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "d766c8d3-76e8-4021-b0a4-24b78fb7eaba,3JrW3FFUvEe6HZ9VjOVjMw,ynPJe7asTk-x_GtcEBQbgA,",
"AvatarItemId": 1971,
"AvatarItemType": 0,
"FriendlyName": "Sweat Suit (Pink)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "d766c8d3-76e8-4021-b0a4-24b78fb7eaba,jeEWPFvzaEGmXaUrxTFvwg,ynPJe7asTk-x_GtcEBQbgA,",
"AvatarItemId": 1974,
"AvatarItemType": 0,
"FriendlyName": "Sweat Suit (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "d766c8d3-76e8-4021-b0a4-24b78fb7eaba,NjCLn5A5h0-V8jB72etCNQ,ynPJe7asTk-x_GtcEBQbgA,",
"AvatarItemId": 1973,
"AvatarItemType": 0,
"FriendlyName": "Sweat Suit (Black)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "d766c8d3-76e8-4021-b0a4-24b78fb7eaba,OT5APcpbpEiMNNah8n4Txw,ynPJe7asTk-x_GtcEBQbgA,",
"AvatarItemId": 1972,
"AvatarItemType": 0,
"FriendlyName": "Sweat Suit (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "d766c8d3-76e8-4021-b0a4-24b78fb7eaba,t2fOeVWloUOKDlIaf4Sxnw,ynPJe7asTk-x_GtcEBQbgA,",
"AvatarItemId": 1970,
"AvatarItemType": 0,
"FriendlyName": "Sweat Suit (Yellow)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "d7730a9e-78a1-4356-bc09-6b066615850b,,,",
"AvatarItemId": 1477,
"AvatarItemType": 0,
"FriendlyName": "Afro Updo Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "d8280c0c-d803-4513-be10-a0ba96d8821e,,,",
"AvatarItemId": 1000,
"AvatarItemType": 0,
"FriendlyName": "Flowhawk Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "d84c0ff9-8fbe-4ed8-abf3-7996e81888ab,,,",
"AvatarItemId": 556,
"AvatarItemType": 0,
"FriendlyName": "Large Afro Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "da4e7b34-2095-4a9e-801e-4f409039e0dd,,,",
"AvatarItemId": 989,
"AvatarItemType": 0,
"FriendlyName": "Buzz Cut Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "de0ac50d-2adb-4114-bd2e-68953b13d706,,,",
"AvatarItemId": 143,
"AvatarItemType": 0,
"FriendlyName": "Blazer (Blue, White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "de0ac50d-2adb-4114-bd2e-68953b13d706,05ac07e1-67f0-486c-abf5-a62866475abb,be2b9293-1d3c-4b1c-b4c5-fad3ab16cf54,",
"AvatarItemId": 144,
"AvatarItemType": 0,
"FriendlyName": "Blazer (Black, Cream)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "de0ac50d-2adb-4114-bd2e-68953b13d706,0ffad843-d6c9-425a-8686-7217009c867e,be2b9293-1d3c-4b1c-b4c5-fad3ab16cf54,",
"AvatarItemId": 148,
"AvatarItemType": 0,
"FriendlyName": "Blazer (Green, Black)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "de0ac50d-2adb-4114-bd2e-68953b13d706,272fe8eb-5061-4729-a7a8-414ff667a82f,be2b9293-1d3c-4b1c-b4c5-fad3ab16cf54,",
"AvatarItemId": 145,
"AvatarItemType": 0,
"FriendlyName": "Blazer (Grey, White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "de0ac50d-2adb-4114-bd2e-68953b13d706,6f2e74bf-1e95-463d-97db-d5d1a53b2c28,be2b9293-1d3c-4b1c-b4c5-fad3ab16cf54,",
"AvatarItemId": 147,
"AvatarItemType": 0,
"FriendlyName": "Blazer (Black, White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "de0ac50d-2adb-4114-bd2e-68953b13d706,9374bf66-2ee5-493b-8439-efce4b201904,be2b9293-1d3c-4b1c-b4c5-fad3ab16cf54,",
"AvatarItemId": 146,
"AvatarItemType": 0,
"FriendlyName": "Blazer (Grey, Black)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "e286863c-2967-4d00-b837-b49487b9484a,,,",
"AvatarItemId": 992,
"AvatarItemType": 0,
"FriendlyName": "Fauxhawk Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "e36bcd98-7e85-43fa-89f8-57e4ec33823a,,,",
"AvatarItemId": 988,
"AvatarItemType": 0,
"FriendlyName": "Bob with Bangs Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "e5b83dfc-b2e1-4dcb-a4ab-9d3a4c8a34ae,,,",
"AvatarItemId": 584,
"AvatarItemType": 0,
"FriendlyName": "Long Wavy Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ea254491-116c-41c4-a9ca-1fa1fca76374,",
"AvatarItemId": 2875,
"AvatarItemType": 0,
"FriendlyName": "Hearing Aids (BTE - Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ea254491-116c-41c4-a9ca-1fa1fca76374,1n-ekJos-EeViiz_zG4jEg",
"AvatarItemId": 2876,
"AvatarItemType": 0,
"FriendlyName": "Hearing Aids (BTE - Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "eb9611c6-bb50-41a2-93e9-7f959815a846,,,",
"AvatarItemId": 587,
"AvatarItemType": 0,
"FriendlyName": "Dreads Long Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ec474314-fd79-441d-852b-d8999274fe57,,,",
"AvatarItemId": 1986,
"AvatarItemType": 0,
"FriendlyName": "Wavy Middle Part Hair ",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,,,",
"AvatarItemId": 1023,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,0ecb8a2a-cffc-47db-aeda-fb0684aef1e5,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 288,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Grey)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,1b1d08f2-12ca-43dd-a44f-ea2820b919b4,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 684,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Black)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,484b6c13-af22-4ad5-8c43-34c0de095d49,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 289,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Light Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,51ef8d39-2b94-4f9e-9620-07b6b0a913a5,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 685,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Orange)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,5rLtRfNWO0qT7X-0sJkUXg,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 1859,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Lime)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,67bcca75-4ab1-4964-8688-9908c464d355,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 287,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Gold)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,7d8e55fe-3c34-4b4b-9753-0021f6cc6454,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 292,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Cream)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,8377ab96-c908-457f-9fee-b784c9a759f3,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 683,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,Ai85jH88H06ze74VdWolfw,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 1863,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Pure Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,cbe29e9f-f2ac-47fb-97e1-8bad16abb89d,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 687,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Pink)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,dee70c38-7a99-4c2b-9181-665f1bf75aca,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 686,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,Dg3DxHr8GU2e190TGveXqw,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 1858,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Baby Pink)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,DiJGFIO-5Ue8rkEhvF5-Mg,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 1860,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Sienna)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,f8b0cfe8-e129-4578-8bb5-f60af5d38599,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 294,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,fWxn_AarpESryNA9UN8wvA,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 1857,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Teal)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,M0nOQl44DkG_GjTXzAEQCQ,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 1862,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Yellow)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,NRjJuinZ4ki8qaEPvP84tw,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 1864,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Mint)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,sEKIlMfbJ0eED6VtcXcQrw,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 1856,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Army Green)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,Sg5yKkqJEEulQeUvRhFgJg,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 1861,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Prussian Blue)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,x3kGXCD0UEWkjfXqu_kuxg,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 1855,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Purple)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ecc1dbe6-ca06-4564-b2a6-30956194d1e9,Z2L6AqDdcUqxiN1mVw-X9g,0b2395e1-ebcc-47e9-aaf1-faf9e9cec4cd,",
"AvatarItemId": 1865,
"AvatarItemType": 0,
"FriendlyName": "Wristbands (Light Purple)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "edc7888c-dc42-48ab-8815-884d227760af,,,",
"AvatarItemId": 1984,
"AvatarItemType": 0,
"FriendlyName": "Short Locs Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "f9dd08f8-16d3-4c39-af4f-89f7bb6e80d3,,,",
"AvatarItemId": 1003,
"AvatarItemType": 0,
"FriendlyName": "Undercut Short Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "fcfcaf63-deb4-45f7-b711-c051c9ea45cb,,,",
"AvatarItemId": 390,
"AvatarItemType": 0,
"FriendlyName": "Top Bun Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "fe15ca53-c5b8-4acf-9309-ff3f4e610fc9,,,",
"AvatarItemId": 1459,
"AvatarItemType": 0,
"FriendlyName": "Winged Hat - Pride (Rainbow Pride)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "fe15ca53-c5b8-4acf-9309-ff3f4e610fc9,knXPidb-Rkayfc3kSHfZeQ,1yMyo6oTjU-VAygoeWaohQ,",
"AvatarItemId": 1460,
"AvatarItemType": 0,
"FriendlyName": "Winged Hat - Pride (Trans Pride)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "feb8b50b-d3da-4e45-b4d0-69aeeb5cfeb3,",
"AvatarItemId": 2334,
"AvatarItemType": 0,
"FriendlyName": "Headdress (White)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "feb8b50b-d3da-4e45-b4d0-69aeeb5cfeb3,1WBsT99QM0anps6ZoWE59Q",
"AvatarItemId": 2336,
"AvatarItemType": 0,
"FriendlyName": "Headdress (Red)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ffdda4d3-a768-4335-a883-aa3f9dc897bf,",
"AvatarItemId": 2995,
"AvatarItemType": 0,
"FriendlyName": "Trihawk Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "ffea7a65-613f-4835-921e-6dd15f357b7e,,,",
"AvatarItemId": 621,
"AvatarItemType": 0,
"FriendlyName": "Long Bangs Hair",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "oYvOo47DJE-DEPlpn5xNUw,whs9olNz9Uani7Gou31mvw,y6aASPUwDkas0W5Yl27ydQ,",
"AvatarItemId": 1450,
"AvatarItemType": 0,
"FriendlyName": "Belt Bag (Rainbow Pride)",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
},
{
"AvatarItemDesc": "-twtjyBdQ02EAdOfBGTiEw,,,",
"AvatarItemId": 728,
"AvatarItemType": 0,
"FriendlyName": "Van Dyke Beard",
"IsBaseAvatarItem": false,
"PlatformMask": -1,
"Rarity": 0,
"ToolTip": ""
}
]
File diff suppressed because one or more lines are too long
+3029 -448
View File
@@ -1,5 +1,5 @@
/* eslint-disable */
// Runtime types generated with workerd@1.20260317.1 2025-09-20 nodejs_compat
// Runtime types generated with workerd@1.20260625.1 2025-09-20 nodejs_compat
// Begin runtime types
/*! *****************************************************************************
Copyright (c) Cloudflare. All rights reserved.
@@ -421,8 +421,12 @@ interface ExecutionContext<Props = unknown> {
waitUntil(promise: Promise<any>): void;
passThroughOnException(): void;
readonly props: Props;
cache?: CacheContext;
readonly access?: CloudflareAccessContext;
tracing: Tracing;
}
type ExportedHandlerFetchHandler<Env = unknown, CfHostMetadata = unknown, Props = unknown> = (request: Request<CfHostMetadata, IncomingRequestCfProperties<CfHostMetadata>>, env: Env, ctx: ExecutionContext<Props>) => Response | Promise<Response>;
type ExportedHandlerConnectHandler<Env = unknown, Props = unknown> = (socket: Socket, env: Env, ctx: ExecutionContext<Props>) => void | Promise<void>;
type ExportedHandlerTailHandler<Env = unknown, Props = unknown> = (events: TraceItem[], env: Env, ctx: ExecutionContext<Props>) => void | Promise<void>;
type ExportedHandlerTraceHandler<Env = unknown, Props = unknown> = (traces: TraceItem[], env: Env, ctx: ExecutionContext<Props>) => void | Promise<void>;
type ExportedHandlerTailStreamHandler<Env = unknown, Props = unknown> = (event: TailStream.TailEvent<TailStream.Onset>, env: Env, ctx: ExecutionContext<Props>) => TailStream.TailEventHandlerType | Promise<TailStream.TailEventHandlerType>;
@@ -431,6 +435,7 @@ type ExportedHandlerQueueHandler<Env = unknown, Message = unknown, Props = unkno
type ExportedHandlerTestHandler<Env = unknown, Props = unknown> = (controller: TestController, env: Env, ctx: ExecutionContext<Props>) => void | Promise<void>;
interface ExportedHandler<Env = unknown, QueueHandlerMessage = unknown, CfHostMetadata = unknown, Props = unknown> {
fetch?: ExportedHandlerFetchHandler<Env, CfHostMetadata, Props>;
connect?: ExportedHandlerConnectHandler<Env, Props>;
tail?: ExportedHandlerTailHandler<Env, Props>;
trace?: ExportedHandlerTraceHandler<Env, Props>;
tailStream?: ExportedHandlerTailStreamHandler<Env, Props>;
@@ -446,24 +451,50 @@ declare abstract class Navigator {
sendBeacon(url: string, body?: BodyInit): boolean;
readonly userAgent: string;
readonly hardwareConcurrency: number;
readonly platform: string;
readonly language: string;
readonly languages: string[];
}
interface AlarmInvocationInfo {
readonly isRetry: boolean;
readonly retryCount: number;
readonly scheduledTime: number;
}
interface Cloudflare {
readonly compatibilityFlags: Record<string, boolean>;
}
interface CachePurgeError {
code: number;
message: string;
}
interface CachePurgeResult {
success: boolean;
errors: CachePurgeError[];
}
interface CachePurgeOptions {
tags?: string[];
pathPrefixes?: string[];
purgeEverything?: boolean;
}
interface CacheContext {
purge(options: CachePurgeOptions): Promise<CachePurgeResult>;
}
interface CloudflareAccessContext {
readonly aud: string;
getIdentity(): Promise<CloudflareAccessIdentity | undefined>;
}
declare abstract class ColoLocalActorNamespace {
get(actorId: string): Fetcher;
}
interface DurableObject {
fetch(request: Request): Response | Promise<Response>;
connect?(socket: Socket): void | Promise<void>;
alarm?(alarmInfo?: AlarmInvocationInfo): void | Promise<void>;
webSocketMessage?(ws: WebSocket, message: string | ArrayBuffer): void | Promise<void>;
webSocketClose?(ws: WebSocket, code: number, reason: string, wasClean: boolean): void | Promise<void>;
webSocketError?(ws: WebSocket, error: unknown): void | Promise<void>;
}
type DurableObjectStub<T extends Rpc.DurableObjectBranded | undefined = undefined> = Fetcher<T, "alarm" | "webSocketMessage" | "webSocketClose" | "webSocketError"> & {
type DurableObjectStub<T extends Rpc.DurableObjectBranded | undefined = undefined> = Fetcher<T, "alarm" | "connect" | "webSocketMessage" | "webSocketClose" | "webSocketError"> & {
readonly id: DurableObjectId;
readonly name?: string;
};
@@ -471,6 +502,7 @@ interface DurableObjectId {
toString(): string;
equals(other: DurableObjectId): boolean;
readonly name?: string;
readonly jurisdiction?: string;
}
declare abstract class DurableObjectNamespace<T extends Rpc.DurableObjectBranded | undefined = undefined> {
newUniqueId(options?: DurableObjectNamespaceNewUniqueIdOptions): DurableObjectId;
@@ -484,7 +516,7 @@ type DurableObjectJurisdiction = "eu" | "fedramp" | "fedramp-high";
interface DurableObjectNamespaceNewUniqueIdOptions {
jurisdiction?: DurableObjectJurisdiction;
}
type DurableObjectLocationHint = "wnam" | "enam" | "sam" | "weur" | "eeur" | "apac" | "oc" | "afr" | "me";
type DurableObjectLocationHint = "wnam" | "enam" | "sam" | "weur" | "eeur" | "apac" | "apac-ne" | "apac-se" | "oc" | "afr" | "me";
type DurableObjectRoutingMode = "primary-only";
interface DurableObjectNamespaceGetDurableObjectOptions {
locationHint?: DurableObjectLocationHint;
@@ -498,6 +530,7 @@ interface DurableObjectState<Props = unknown> {
readonly id: DurableObjectId;
readonly storage: DurableObjectStorage;
container?: Container;
facets: DurableObjectFacets;
blockConcurrencyWhile<T>(callback: () => Promise<T>): Promise<T>;
acceptWebSocket(ws: WebSocket, tags?: string[]): void;
getWebSockets(tag?: string): WebSocket[];
@@ -574,6 +607,16 @@ declare class WebSocketRequestResponsePair {
get request(): string;
get response(): string;
}
interface DurableObjectFacets {
get<T extends Rpc.DurableObjectBranded | undefined = undefined>(name: string, getStartupOptions: () => FacetStartupOptions<T> | Promise<FacetStartupOptions<T>>): Fetcher<T>;
abort(name: string, reason: any): void;
delete(name: string): void;
clone(src: string, dst: string): void;
}
interface FacetStartupOptions<T extends Rpc.DurableObjectBranded | undefined = undefined> {
id?: DurableObjectId | string;
class: DurableObjectClass<T>;
}
interface AnalyticsEngineDataset {
writeDataPoint(event?: AnalyticsEngineDataPoint): void;
}
@@ -866,7 +909,7 @@ interface CustomEventCustomEventInit {
* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Blob)
*/
declare class Blob {
constructor(type?: ((ArrayBuffer | ArrayBufferView) | string | Blob)[], options?: BlobOptions);
constructor(bits?: ((ArrayBuffer | ArrayBufferView) | string | Blob)[], options?: BlobOptions);
/**
* The **`size`** read-only property of the Blob interface returns the size of the Blob or File in bytes.
*
@@ -1862,8 +1905,31 @@ interface KVNamespaceGetWithMetadataResult<Value, Metadata> {
}
type QueueContentType = "text" | "bytes" | "json" | "v8";
interface Queue<Body = unknown> {
send(message: Body, options?: QueueSendOptions): Promise<void>;
sendBatch(messages: Iterable<MessageSendRequest<Body>>, options?: QueueSendBatchOptions): Promise<void>;
metrics(): Promise<QueueMetrics>;
send(message: Body, options?: QueueSendOptions): Promise<QueueSendResponse>;
sendBatch(messages: Iterable<MessageSendRequest<Body>>, options?: QueueSendBatchOptions): Promise<QueueSendBatchResponse>;
}
interface QueueSendMetrics {
backlogCount: number;
backlogBytes: number;
oldestMessageTimestamp?: Date;
}
interface QueueSendMetadata {
metrics: QueueSendMetrics;
}
interface QueueSendResponse {
metadata: QueueSendMetadata;
}
interface QueueSendBatchMetrics {
backlogCount: number;
backlogBytes: number;
oldestMessageTimestamp?: Date;
}
interface QueueSendBatchMetadata {
metrics: QueueSendBatchMetrics;
}
interface QueueSendBatchResponse {
metadata: QueueSendBatchMetadata;
}
interface QueueSendOptions {
contentType?: QueueContentType;
@@ -1877,6 +1943,19 @@ interface MessageSendRequest<Body = unknown> {
contentType?: QueueContentType;
delaySeconds?: number;
}
interface QueueMetrics {
backlogCount: number;
backlogBytes: number;
oldestMessageTimestamp?: Date;
}
interface MessageBatchMetrics {
backlogCount: number;
backlogBytes: number;
oldestMessageTimestamp?: Date;
}
interface MessageBatchMetadata {
metrics: MessageBatchMetrics;
}
interface QueueRetryOptions {
delaySeconds?: number;
}
@@ -1891,12 +1970,14 @@ interface Message<Body = unknown> {
interface QueueEvent<Body = unknown> extends ExtendableEvent {
readonly messages: readonly Message<Body>[];
readonly queue: string;
readonly metadata: MessageBatchMetadata;
retryAll(options?: QueueRetryOptions): void;
ackAll(): void;
}
interface MessageBatch<Body = unknown> {
readonly messages: readonly Message<Body>[];
readonly queue: string;
readonly metadata: MessageBatchMetadata;
retryAll(options?: QueueRetryOptions): void;
ackAll(): void;
}
@@ -1915,7 +1996,7 @@ interface R2ListOptions {
startAfter?: string;
include?: ("httpMetadata" | "customMetadata")[];
}
declare abstract class R2Bucket {
interface R2Bucket {
head(key: string): Promise<R2Object | null>;
get(key: string, options: R2GetOptions & {
onlyIf: R2Conditional | Headers;
@@ -2580,6 +2661,11 @@ interface QueuingStrategyInit {
*/
highWaterMark: number;
}
interface TracePreviewInfo {
id: string;
slug: string;
name: string;
}
interface ScriptVersion {
id?: string;
tag?: string;
@@ -2590,7 +2676,7 @@ declare abstract class TailEvent extends ExtendableEvent {
readonly traces: TraceItem[];
}
interface TraceItem {
readonly event: (TraceItemFetchEventInfo | TraceItemJsRpcEventInfo | TraceItemScheduledEventInfo | TraceItemAlarmEventInfo | TraceItemQueueEventInfo | TraceItemEmailEventInfo | TraceItemTailEventInfo | TraceItemCustomEventInfo | TraceItemHibernatableWebSocketEventInfo) | null;
readonly event: (TraceItemFetchEventInfo | TraceItemJsRpcEventInfo | TraceItemConnectEventInfo | TraceItemScheduledEventInfo | TraceItemAlarmEventInfo | TraceItemQueueEventInfo | TraceItemEmailEventInfo | TraceItemTailEventInfo | TraceItemCustomEventInfo | TraceItemHibernatableWebSocketEventInfo) | null;
readonly eventTimestamp: number | null;
readonly logs: TraceLog[];
readonly exceptions: TraceException[];
@@ -2600,6 +2686,8 @@ interface TraceItem {
readonly scriptVersion?: ScriptVersion;
readonly dispatchNamespace?: string;
readonly scriptTags?: string[];
readonly tailAttributes?: Record<string, boolean | number | string>;
readonly preview?: TracePreviewInfo;
readonly durableObjectId?: string;
readonly outcome: string;
readonly executionModel: string;
@@ -2610,6 +2698,8 @@ interface TraceItem {
interface TraceItemAlarmEventInfo {
readonly scheduledTime: Date;
}
interface TraceItemConnectEventInfo {
}
interface TraceItemCustomEventInfo {
}
interface TraceItemScheduledEventInfo {
@@ -3197,6 +3287,28 @@ interface EventSourceEventSourceInit {
withCredentials?: boolean;
fetcher?: Fetcher;
}
interface ExecOutput {
readonly stdout: ArrayBuffer;
readonly stderr: ArrayBuffer;
readonly exitCode: number;
}
interface ContainerExecOptions {
cwd?: string;
env?: Record<string, string>;
user?: string;
stdin?: ReadableStream | "pipe";
stdout?: "pipe" | "ignore";
stderr?: "pipe" | "ignore" | "combined";
}
interface ExecProcess {
readonly stdin: WritableStream | null;
readonly stdout: ReadableStream | null;
readonly stderr: ReadableStream | null;
readonly pid: number;
readonly exitCode: Promise<number>;
output(): Promise<ExecOutput>;
kill(signal?: number): void;
}
interface Container {
get running(): boolean;
start(options?: ContainerStartupOptions): void;
@@ -3207,12 +3319,40 @@ interface Container {
setInactivityTimeout(durationMs: number | bigint): Promise<void>;
interceptOutboundHttp(addr: string, binding: Fetcher): Promise<void>;
interceptAllOutboundHttp(binding: Fetcher): Promise<void>;
snapshotDirectory(options: ContainerDirectorySnapshotOptions): Promise<ContainerDirectorySnapshot>;
snapshotContainer(options: ContainerSnapshotOptions): Promise<ContainerSnapshot>;
interceptOutboundHttps(addr: string, binding: Fetcher): Promise<void>;
exec(cmd: string[], options?: ContainerExecOptions): Promise<ExecProcess>;
}
interface ContainerDirectorySnapshot {
id: string;
size: number;
dir: string;
name?: string;
}
interface ContainerDirectorySnapshotOptions {
dir: string;
name?: string;
}
interface ContainerDirectorySnapshotRestoreParams {
snapshot: ContainerDirectorySnapshot;
mountPoint?: string;
}
interface ContainerSnapshot {
id: string;
size: number;
name?: string;
}
interface ContainerSnapshotOptions {
name?: string;
}
interface ContainerStartupOptions {
entrypoint?: string[];
enableInternet: boolean;
env?: Record<string, string>;
hardTimeout?: (number | bigint);
labels?: Record<string, string>;
directorySnapshots?: ContainerDirectorySnapshotRestoreParams[];
containerSnapshot?: ContainerSnapshot;
}
/**
* The **`MessagePort`** interface of the Channel Messaging API represents one of the two ports of a MessageChannel, allowing messages to be sent from one port and listening out for them arriving at the other.
@@ -3275,6 +3415,10 @@ type LoopbackDurableObjectClass<T extends Rpc.DurableObjectBranded | undefined =
}) => DurableObjectClass<T> : (opts: {
props?: any;
}) => DurableObjectClass<T>);
interface LoopbackDurableObjectNamespace extends DurableObjectNamespace {
}
interface LoopbackColoLocalActorNamespace extends ColoLocalActorNamespace {
}
interface SyncKvStorage {
get<T = unknown>(key: string): T | undefined;
list<T = unknown>(options?: SyncKvListOptions): Iterable<[
@@ -3294,9 +3438,11 @@ interface SyncKvListOptions {
}
interface WorkerStub {
getEntrypoint<T extends Rpc.WorkerEntrypointBranded | undefined>(name?: string, options?: WorkerStubEntrypointOptions): Fetcher<T>;
getDurableObjectClass<T extends Rpc.DurableObjectBranded | undefined>(name?: string, options?: WorkerStubEntrypointOptions): DurableObjectClass<T>;
}
interface WorkerStubEntrypointOptions {
props?: any;
limits?: workerdResourceLimits;
}
interface WorkerLoader {
get(name: string | null, getCode: () => WorkerLoaderWorkerCode | Promise<WorkerLoaderWorkerCode>): WorkerStub;
@@ -3315,6 +3461,7 @@ interface WorkerLoaderWorkerCode {
compatibilityDate: string;
compatibilityFlags?: string[];
allowExperimental?: boolean;
limits?: workerdResourceLimits;
mainModule: string;
modules: Record<string, WorkerLoaderModule | string>;
env?: any;
@@ -3322,6 +3469,10 @@ interface WorkerLoaderWorkerCode {
tails?: Fetcher[];
streamingTails?: Fetcher[];
}
interface workerdResourceLimits {
cpuMs?: number;
subRequests?: number;
}
/**
* The Workers runtime supports a subset of the Performance API, used to measure timing and performance,
* as well as timing of subrequests and other operations.
@@ -3340,81 +3491,415 @@ declare abstract class Performance {
*/
toJSON(): object;
}
// AI Search V2 API Error Interfaces
interface Tracing {
enterSpan<T, A extends unknown[]>(name: string, callback: (span: Span, ...args: A) => T, ...args: A): T;
startActiveSpan<T, A extends unknown[]>(name: string, callback: (span: Span, ...args: A) => T, ...args: A): T;
Span: typeof Span;
}
declare abstract class Span {
get isTraced(): boolean;
setAttribute(key: string, value?: (boolean | number | string)): void;
end(): void;
}
/**
* Represents the identity of a user authenticated via Cloudflare Access.
* This matches the result of calling /cdn-cgi/access/get-identity.
*
* The exact structure of the returned object depends on the identity provider
* configuration for the Access application. The fields below represent commonly
* available properties, but additional provider-specific fields may be present.
*/
interface CloudflareAccessIdentity extends Record<string, unknown> {
/** The user's email address, if available from the identity provider. */
email?: string;
/** The user's display name. */
name?: string;
/** The user's unique identifier. */
user_uuid?: string;
/** The Cloudflare account ID. */
account_id?: string;
/** Login timestamp (Unix epoch seconds). */
iat?: number;
/** The user's IP address at authentication time. */
ip?: string;
/** Authentication methods used (e.g., "pwd"). */
amr?: string[];
/** Identity provider information. */
idp?: {
id: string;
type: string;
};
/** Geographic information about where the user authenticated. */
geo?: {
country: string;
};
/** Group memberships from the identity provider. */
groups?: Array<{
id: string;
name: string;
email?: string;
}>;
/** Device posture check results, keyed by check ID. */
devicePosture?: Record<string, unknown>;
/** True if the user connected via Cloudflare WARP. */
is_warp?: boolean;
/** True if the user is authenticated via Cloudflare Gateway. */
is_gateway?: boolean;
}
// ============================================================================
// Agent Memory
//
// Public type surface for user Workers binding to an Agent Memory namespace.
// ============================================================================
/** Memory type — every memory is classified into exactly one. */
type AgentMemoryMemoryType = "fact" | "event" | "instruction" | "task";
/** Search intensity for recall. */
type AgentMemoryThinkingLevel = "low" | "medium" | "high";
/** Response verbosity for recall. */
type AgentMemoryResponseLength = "short" | "medium" | "long";
/** A conversation message passed to ingest(). */
interface AgentMemoryMessage {
role: "system" | "user" | "assistant";
content: string;
/** Optional message timestamp. */
timestamp?: Date;
}
/** Raw memory content passed to remember(). */
interface AgentMemoryIncomingMemory {
/** Raw memory content. The service classifies and summarizes automatically. */
content: string;
/** Optional session identifier to associate with this memory. */
sessionId?: string | null | undefined;
}
/** A stored memory returned from remember(), get(), and delete(). */
interface AgentMemoryMemory {
/** Memory ID. */
id: string;
/** Memory type. */
type: AgentMemoryMemoryType;
/** Text summary. */
summary: string;
/** Memory text. */
content: string;
/** Session that created this memory. */
sessionId: string | null;
/** Memory creation time. */
createdAt: Date;
/** Memory last-update time. */
updatedAt: Date;
}
/** Single entry in a list() response. Same shape as Memory minus full content. */
type AgentMemoryMemoryListEntry = Omit<AgentMemoryMemory, "content">;
/** A scored memory candidate in a recall result. */
interface AgentMemoryScoredCandidate {
/** Candidate ID. */
id: string;
/** Text summary. */
summary: string;
/** Session that created this candidate, when known. */
sessionId: string | null;
/** Relevance score (higher is better). Comparable only within a single query. */
score: number;
}
/** Options for the ingest() method. */
interface AgentMemoryIngestOptions {
/** Session identifier to associate with memories created during ingestion. */
sessionId?: string | null | undefined;
}
/** Options for the getSummary() method. */
interface AgentMemoryGetSummaryOptions {
/** Session identifier to retrieve session summary for. */
sessionId?: string | null | undefined;
}
/** Response from the getSummary() method. */
interface AgentMemoryGetSummaryResponse {
/** Markdown summary. */
summary: string;
}
/**
* Options for the recall() method.
*
* `referenceDate` accepts a Date object, an ISO-8601 date string
* (YYYY-MM-DD), or a full ISO-8601 datetime string. When provided, this
* date is used as "today" for resolving relative time references
* ("how many days ago", "last week") instead of the server's wall-clock time.
*/
interface AgentMemoryRecallOptions {
/** Recall intensity: "low" (default), "medium", or "high". */
thinkingLevel?: AgentMemoryThinkingLevel;
/** Response verbosity: "short", "medium" (default), or "long". */
responseLength?: AgentMemoryResponseLength;
/** Temporal anchor for date arithmetic. */
referenceDate?: Date | string;
}
/** Response from the recall() method. */
interface AgentMemoryRecallResult {
/** Number of memories retrieved. */
count: number;
/** LLM-generated answer synthesizing the matching memories. */
answer: string;
/** Matching memories ranked by relevance. */
candidates: AgentMemoryScoredCandidate[];
}
/**
* Options for the list() method.
*
* `cursor` is the opaque continuation token returned by the previous page;
* pass it back unchanged to fetch the next page. `sessionId` and `type`
* are exact-match filters; combining them is allowed.
*/
interface AgentMemoryListMemoriesOptions {
/** Maximum number of memories to return. Default 20, max 500. */
limit?: number;
/** Opaque cursor from a previous page. */
cursor?: string;
/** Exact-match session filter. */
sessionId?: string;
/** Exact-match memory-type filter. */
type?: AgentMemoryMemoryType;
}
/** Response from the list() method. */
interface AgentMemoryListMemoriesResult {
memories: AgentMemoryMemoryListEntry[];
/** Continuation cursor; absent when this page exhausted the result set. */
cursor?: string;
}
/**
* A single Agent Memory profile, scoped to a profile name.
*
* Returned by {@link AgentMemoryNamespace.getProfile}.
*/
declare abstract class AgentMemoryProfile {
/**
* Retrieve a memory by ID.
*
* @param memoryId - ULID of the memory to retrieve.
* @throws if the memory does not exist.
*/
get(memoryId: string): Promise<AgentMemoryMemory>;
/**
* Delete a memory by ID.
*
* Removes the memory and any source messages linked by the memory's
* source message IDs.
*
* @param memoryId - ULID of the memory to delete.
* @throws if the memory does not exist.
*/
delete(memoryId: string): Promise<AgentMemoryMemory>;
/**
* Store a memory in this profile. The content is automatically classified,
* summarized, and indexed.
*
* @param memory - Raw memory content to persist.
*/
remember(memory: AgentMemoryIncomingMemory): Promise<AgentMemoryMemory>;
/**
* Extract memories from a conversation.
*
* @param messages - Conversation messages to extract memories from.
* @param options - Optional ingest options.
*/
ingest(messages: Iterable<AgentMemoryMessage>, options?: AgentMemoryIngestOptions): Promise<void>;
/**
* Get a profile summary.
*
* @param options - Optional getSummary options.
*/
getSummary(options?: AgentMemoryGetSummaryOptions): Promise<AgentMemoryGetSummaryResponse>;
/**
* Recall memories in this profile.
*
* @param query - Recall query matched against memory content and keywords.
* @param options - Optional recall parameters.
* @returns Matching memories with relevance scores and a synthesized answer.
*/
recall(query: string, options?: AgentMemoryRecallOptions): Promise<AgentMemoryRecallResult>;
/**
* List active memories in this profile.
*
* Returns a paginated, filterable view of stored memories. Superseded
* versions are excluded. Use the returned `cursor` (when present) to
* fetch the next page.
*
* @param options - Optional pagination and filter options.
*/
list(options?: AgentMemoryListMemoriesOptions): Promise<AgentMemoryListMemoriesResult>;
/**
* Soft-delete every memory and message in this profile that is tagged
* with `sessionId`.
*
* Idempotent: deleting a sessionId that has no rows is a no-op.
*
* @param sessionId - Session to delete.
*/
deleteSession(sessionId: string): Promise<void>;
}
/**
* Namespace-level Agent Memory binding.
*
* Used as the type of an `env.MEMORY`-style binding backed by the Agent
* Memory product.
*
* @example
* ```ts
* export default {
* async fetch(_request: Request, env: Env): Promise<Response> {
* const profile = await env.MEMORY.getProfile("wrangler-e2e");
* const summary = await profile.getSummary();
* return Response.json(summary);
* },
* };
* ```
*/
declare abstract class AgentMemoryNamespace {
/**
* Get a memory profile by name. Profiles are isolated by namespace and
* addressed by a compound key (namespaceId:profileName).
*
* @param profileName - Profile name (validated against naming rules).
* @returns RPC target for interacting with the profile.
*/
getProfile(profileName: string): Promise<AgentMemoryProfile>;
/**
* Soft-delete a profile and schedule deferred purge. Marks all
* memories and messages as deleted.
*
* @param profileName - Name of the profile to delete.
*/
deleteProfile(profileName: string): Promise<void>;
}
// ============ AI Search Error Interfaces ============
interface AiSearchInternalError extends Error {
}
interface AiSearchNotFoundError extends Error {
}
interface AiSearchNameNotSetError extends Error {
}
// AI Search V2 Request Types
type AiSearchSearchRequest = {
messages: Array<{
role: 'system' | 'developer' | 'user' | 'assistant' | 'tool';
content: string | null;
}>;
ai_search_options?: {
retrieval?: {
retrieval_type?: 'vector' | 'keyword' | 'hybrid';
/** Match threshold (0-1, default 0.4) */
match_threshold?: number;
/** Maximum number of results (1-50, default 10) */
max_num_results?: number;
filters?: VectorizeVectorMetadataFilter;
/** Context expansion (0-3, default 0) */
context_expansion?: number;
[key: string]: unknown;
};
query_rewrite?: {
enabled?: boolean;
model?: string;
rewrite_prompt?: string;
[key: string]: unknown;
};
reranking?: {
/** Enable reranking (default false) */
enabled?: boolean;
model?: '@cf/baai/bge-reranker-base' | '';
/** Match threshold (0-1, default 0.4) */
match_threshold?: number;
[key: string]: unknown;
};
// ============ AI Search Common Types ============
/** A single message in a conversation-style search or chat request. */
type AiSearchMessage = {
role: 'system' | 'developer' | 'user' | 'assistant' | 'tool';
content: string | null;
};
/**
* Common shape for `ai_search_options` used by both single-instance and multi-instance requests.
* Contains retrieval, query rewrite, reranking, and cache sub-options.
*/
type AiSearchOptions = {
retrieval?: {
/** Which retrieval backend to use. Defaults to the instance's configured index_method. */
retrieval_type?: 'vector' | 'keyword' | 'hybrid';
/** Fusion method for combining vector + keyword results. */
fusion_method?: 'max' | 'rrf';
/** How keyword terms are combined: "and" = all terms must match, "or" = any term matches. */
keyword_match_mode?: 'and' | 'or';
/** Minimum similarity score (0-1) for a result to be included. Default 0.4. */
match_threshold?: number;
/** Maximum number of results to return (1-50). Default 10. */
max_num_results?: number;
/** Vectorize metadata filters applied to the search. */
filters?: VectorizeVectorMetadataFilter;
/** Number of surrounding chunks to include for context (0-3). Default 0. */
context_expansion?: number;
/** If true, return only item metadata without chunk text. */
metadata_only?: boolean;
/** If true (default), return empty results on retrieval failure instead of throwing. */
return_on_failure?: boolean;
/** Boost results by metadata field values. Max 3 entries. */
boost_by?: Array<{
field: string;
direction?: 'asc' | 'desc' | 'exists' | 'not_exists';
}>;
[key: string]: unknown;
};
};
type AiSearchChatCompletionsRequest = {
messages: Array<{
role: 'system' | 'developer' | 'user' | 'assistant' | 'tool';
content: string | null;
}>;
model?: string;
stream?: boolean;
ai_search_options?: {
retrieval?: {
retrieval_type?: 'vector' | 'keyword' | 'hybrid';
match_threshold?: number;
max_num_results?: number;
filters?: VectorizeVectorMetadataFilter;
context_expansion?: number;
[key: string]: unknown;
};
query_rewrite?: {
enabled?: boolean;
model?: string;
rewrite_prompt?: string;
[key: string]: unknown;
};
reranking?: {
enabled?: boolean;
model?: '@cf/baai/bge-reranker-base' | '';
match_threshold?: number;
[key: string]: unknown;
};
query_rewrite?: {
enabled?: boolean;
model?: string;
rewrite_prompt?: string;
[key: string]: unknown;
};
reranking?: {
enabled?: boolean;
model?: string;
/** Match threshold (0-1, default 0.4) */
match_threshold?: number;
[key: string]: unknown;
};
cache?: {
enabled?: boolean;
cache_threshold?: 'super_strict_match' | 'close_enough' | 'flexible_friend' | 'anything_goes';
};
[key: string]: unknown;
};
// AI Search V2 Response Types
// ============ AI Search Request Types ============
/**
* Request body for single-instance search.
* Exactly one of `query` or `messages` must be provided.
*/
type AiSearchSearchRequest = {
/** Simple query string. */
query: string;
messages?: never;
ai_search_options?: AiSearchOptions;
} | {
query?: never;
/** Conversation-style input. At least one user message with non-empty content is required. */
messages: AiSearchMessage[];
ai_search_options?: AiSearchOptions;
};
type AiSearchChatCompletionsRequest = {
messages: AiSearchMessage[];
model?: string;
stream?: boolean;
ai_search_options?: AiSearchOptions;
[key: string]: unknown;
};
// ============ AI Search Multi-Instance Types (Namespace-Scoped) ============
/** `ai_search_options` shape for multi-instance requests — requires `instance_ids`. */
type AiSearchMultiSearchOptions = AiSearchOptions & {
/** Instance IDs to search across (1-10). */
instance_ids: string[];
};
/**
* Request for searching across multiple instances within a namespace.
* `ai_search_options` is required and must include `instance_ids`.
* Exactly one of `query` or `messages` must be provided.
*/
type AiSearchMultiSearchRequest = {
/** Simple query string. */
query: string;
messages?: never;
ai_search_options: AiSearchMultiSearchOptions;
} | {
query?: never;
/** Conversation-style input. */
messages: AiSearchMessage[];
ai_search_options: AiSearchMultiSearchOptions;
};
/** A search result chunk tagged with the instance it originated from. */
type AiSearchMultiSearchChunk = AiSearchSearchResponse['chunks'][number] & {
instance_id: string;
};
/** Describes a per-instance error during a multi-instance operation. */
type AiSearchMultiSearchError = {
instance_id: string;
message: string;
};
/** Response from a multi-instance search, with chunks tagged by instance and optional partial-failure errors. */
type AiSearchMultiSearchResponse = {
search_query: string;
chunks: AiSearchMultiSearchChunk[];
errors?: AiSearchMultiSearchError[];
};
/** Request for chat completions across multiple instances within a namespace. `ai_search_options` is required and must include `instance_ids`. */
type AiSearchMultiChatCompletionsRequest = Omit<AiSearchChatCompletionsRequest, 'ai_search_options'> & {
ai_search_options: AiSearchMultiSearchOptions;
};
/** Response from multi-instance chat completions, with chunks tagged by instance and optional partial-failure errors. */
type AiSearchMultiChatCompletionsResponse = Omit<AiSearchChatCompletionsResponse, 'chunks'> & {
chunks: AiSearchMultiSearchChunk[];
errors?: AiSearchMultiSearchError[];
};
// ============ AI Search Response Types ============
type AiSearchSearchResponse = {
search_query: string;
chunks: Array<{
@@ -3433,26 +3918,138 @@ type AiSearchSearchResponse = {
keyword_score?: number;
/** Vector similarity score (0-1) */
vector_score?: number;
/** Keyword rank position */
keyword_rank?: number;
/** Vector rank position */
vector_rank?: number;
/** Reranking model score */
reranking_score?: number;
/** Fusion method used to combine results */
fusion_method?: 'rrf' | 'max';
[key: string]: unknown;
};
}>;
};
type AiSearchListResponse = Array<{
id: string;
internal_id?: string;
account_id?: string;
account_tag?: string;
/** Whether the instance is enabled (default true) */
enable?: boolean;
type?: 'r2' | 'web-crawler';
source?: string;
type AiSearchChatCompletionsResponse = {
id?: string;
object?: string;
model?: string;
choices: Array<{
index?: number;
message: {
role: 'system' | 'developer' | 'user' | 'assistant' | 'tool';
content: string | null;
[key: string]: unknown;
};
[key: string]: unknown;
}>;
chunks: AiSearchSearchResponse['chunks'];
[key: string]: unknown;
}>;
};
type AiSearchStatsResponse = {
queued?: number;
running?: number;
completed?: number;
error?: number;
skipped?: number;
outdated?: number;
last_activity?: string;
/** Storage engine statistics. */
engine?: {
vectorize?: {
vectorsCount: number;
dimensions: number;
};
r2?: {
payloadSizeBytes: number;
metadataSizeBytes: number;
objectCount: number;
};
};
};
// ============ AI Search Instance Info Types ============
type AiSearchInstanceInfo = {
id: string;
type?: 'r2' | 'web-crawler' | string;
source?: string;
source_params?: unknown;
paused?: boolean;
status?: string;
namespace?: string;
created_at?: string;
modified_at?: string;
token_id?: string;
ai_gateway_id?: string;
rewrite_query?: boolean;
reranking?: boolean;
embedding_model?: string;
ai_search_model?: string;
rewrite_model?: string;
reranking_model?: string;
/** @deprecated Use index_method instead. */
hybrid_search_enabled?: boolean;
/** Controls which storage backends are active. */
index_method?: {
vector?: boolean;
keyword?: boolean;
};
/** Fusion method for combining vector and keyword results. */
fusion_method?: 'max' | 'rrf';
indexing_options?: {
keyword_tokenizer?: 'porter' | 'trigram';
} | null;
retrieval_options?: {
keyword_match_mode?: 'and' | 'or';
boost_by?: Array<{
field: string;
direction?: 'asc' | 'desc' | 'exists' | 'not_exists';
}>;
} | null;
chunk?: boolean;
chunk_size?: number;
chunk_overlap?: number;
score_threshold?: number;
max_num_results?: number;
cache?: boolean;
cache_threshold?: 'super_strict_match' | 'close_enough' | 'flexible_friend' | 'anything_goes';
custom_metadata?: Array<{
field_name: string;
data_type: 'text' | 'number' | 'boolean' | 'datetime';
}>;
/** Sync interval in seconds. */
sync_interval?: 3600 | 7200 | 14400 | 21600 | 43200 | 86400;
metadata?: Record<string, unknown>;
[key: string]: unknown;
};
/** Pagination, search, and ordering parameters for listing instances within a namespace. */
type AiSearchListInstancesParams = {
page?: number;
per_page?: number;
/** Search instances by ID. */
search?: string;
/** Field to sort by. */
order_by?: 'created_at';
/** Sort direction. */
order_by_direction?: 'asc' | 'desc';
};
type AiSearchListResponse = {
result: AiSearchInstanceInfo[];
result_info?: {
count: number;
page: number;
per_page: number;
total_count: number;
};
};
// ============ AI Search Config Types ============
type AiSearchConfig = {
/** Instance ID (1-32 chars, pattern: ^[a-z0-9_]+(?:-[a-z0-9_]+)*$) */
id: string;
type: 'r2' | 'web-crawler';
source: string;
source_params?: object;
/** Instance type. Omit to create with built-in storage. */
type?: 'r2' | 'web-crawler' | string;
/** Source URL (required for web-crawler type). */
source?: string;
source_params?: unknown;
/** Token ID (UUID format) */
token_id?: string;
ai_gateway_id?: string;
@@ -3462,52 +4059,460 @@ type AiSearchConfig = {
reranking?: boolean;
embedding_model?: string;
ai_search_model?: string;
};
type AiSearchInstance = {
id: string;
enable?: boolean;
type?: 'r2' | 'web-crawler';
source?: string;
rewrite_model?: string;
reranking_model?: string;
/** @deprecated Use index_method instead. */
hybrid_search_enabled?: boolean;
/** Controls which storage backends are used during indexing. Defaults to vector-only. */
index_method?: {
vector?: boolean;
keyword?: boolean;
};
/** Fusion method for combining vector and keyword results. "rrf" = reciprocal rank fusion (default), "max" = maximum score. */
fusion_method?: 'max' | 'rrf';
indexing_options?: {
keyword_tokenizer?: 'porter' | 'trigram';
} | null;
retrieval_options?: {
keyword_match_mode?: 'and' | 'or';
boost_by?: Array<{
field: string;
direction?: 'asc' | 'desc' | 'exists' | 'not_exists';
}>;
} | null;
chunk?: boolean;
chunk_size?: number;
chunk_overlap?: number;
/** Minimum similarity score (0-1) for a result to be included. */
score_threshold?: number;
max_num_results?: number;
cache?: boolean;
/** Similarity threshold for cache hits. Stricter = fewer cache hits but higher relevance. */
cache_threshold?: 'super_strict_match' | 'close_enough' | 'flexible_friend' | 'anything_goes';
custom_metadata?: Array<{
field_name: string;
data_type: 'text' | 'number' | 'boolean' | 'datetime';
}>;
namespace?: string;
/** Sync interval in seconds. 3600=1h, 7200=2h, 14400=4h, 21600=6h, 43200=12h, 86400=24h. */
sync_interval?: 3600 | 7200 | 14400 | 21600 | 43200 | 86400;
metadata?: Record<string, unknown>;
[key: string]: unknown;
};
// AI Search Instance Service - Instance-level operations
declare abstract class AiSearchInstanceService {
// ============ AI Search Item Types ============
type AiSearchItemInfo = {
id: string;
key: string;
status: 'completed' | 'error' | 'skipped' | 'queued' | 'running' | 'outdated';
next_action?: 'INDEX' | 'DELETE' | null;
error?: string;
checksum?: string;
namespace?: string;
chunks_count?: number | null;
file_size?: number | null;
source_id?: string | null;
last_seen_at?: string;
created_at?: string;
metadata?: Record<string, unknown>;
[key: string]: unknown;
};
type AiSearchItemContentResult = {
body: ReadableStream;
contentType: string;
filename: string;
size: number;
};
type AiSearchUploadItemOptions = {
metadata?: Record<string, unknown>;
};
type AiSearchListItemsParams = {
page?: number;
per_page?: number;
/** Search items by key name. */
search?: string;
/** Sort order for results. */
sort_by?: 'status' | 'modified_at';
/** Filter items by processing status. */
status?: 'queued' | 'running' | 'completed' | 'error' | 'skipped' | 'outdated';
/** Filter items by source (e.g. "builtin" or "web-crawler:https://example.com"). */
source?: string;
/** JSON-encoded Vectorize filter for metadata filtering. */
metadata_filter?: string;
};
type AiSearchListItemsResponse = {
result: AiSearchItemInfo[];
result_info?: {
count: number;
page: number;
per_page: number;
total_count: number;
};
};
// ============ AI Search Item Logs Types ============
type AiSearchItemLogsParams = {
/** Maximum number of log entries to return (1-100, default 50). */
limit?: number;
/** Opaque cursor for pagination. Pass the `cursor` value from a previous response. */
cursor?: string;
};
type AiSearchItemLog = {
timestamp: string;
action: string;
message: string;
fileKey?: string;
chunkCount?: number;
processingTimeMs?: number;
errorType?: string;
};
/** Paginated response for item processing logs (cursor-based). */
type AiSearchItemLogsResponse = {
result: AiSearchItemLog[];
result_info: {
count: number;
per_page: number;
cursor: string | null;
truncated: boolean;
};
};
// ============ AI Search Item Chunks Types ============
type AiSearchItemChunksParams = {
/** Maximum number of chunks to return (1-100, default 20). */
limit?: number;
/** Offset into the chunks list (default 0). */
offset?: number;
};
/** A single indexed chunk belonging to an item, including its text content and byte range. */
type AiSearchItemChunk = {
id: string;
text: string;
start_byte: number;
end_byte: number;
item?: {
timestamp?: number;
key: string;
metadata?: Record<string, unknown>;
};
};
/** Paginated response for item chunks (offset-based). */
type AiSearchItemChunksResponse = {
result: AiSearchItemChunk[];
result_info: {
count: number;
total: number;
limit: number;
offset: number;
};
};
// ============ AI Search Job Types ============
type AiSearchJobInfo = {
id: string;
source: 'user' | 'schedule';
description?: string;
last_seen_at?: string;
started_at?: string;
ended_at?: string;
end_reason?: string;
};
type AiSearchJobLog = {
id: number;
message: string;
message_type: number;
created_at: number;
};
type AiSearchCreateJobParams = {
description?: string;
};
type AiSearchListJobsParams = {
page?: number;
per_page?: number;
};
type AiSearchListJobsResponse = {
result: AiSearchJobInfo[];
result_info?: {
count: number;
page: number;
per_page: number;
total_count: number;
};
};
type AiSearchJobLogsParams = {
page?: number;
per_page?: number;
};
type AiSearchJobLogsResponse = {
result: AiSearchJobLog[];
result_info?: {
count: number;
page: number;
per_page: number;
total_count: number;
};
};
// ============ AI Search Sub-Service Classes ============
/**
* Single item service for an AI Search instance.
* Provides info, download, sync, logs, and chunks operations on a specific item.
*/
declare abstract class AiSearchItem {
/** Get metadata about this item. */
info(): Promise<AiSearchItemInfo>;
/**
* Download the item's content.
* @returns Object with body stream, content type, filename, and size.
*/
download(): Promise<AiSearchItemContentResult>;
/**
* Trigger re-indexing of this item.
* @returns The updated item info.
*/
sync(): Promise<AiSearchItemInfo>;
/**
* Retrieve processing logs for this item (cursor-based pagination).
* @param params Optional pagination parameters (limit, cursor).
* @returns Paginated log entries for this item.
*/
logs(params?: AiSearchItemLogsParams): Promise<AiSearchItemLogsResponse>;
/**
* List indexed chunks for this item (offset-based pagination).
* @param params Optional pagination parameters (limit, offset).
* @returns Paginated chunk entries for this item.
*/
chunks(params?: AiSearchItemChunksParams): Promise<AiSearchItemChunksResponse>;
}
/**
* Items collection service for an AI Search instance.
* Provides list, upload, and access to individual items.
*/
declare abstract class AiSearchItems {
/** List items in this instance. */
list(params?: AiSearchListItemsParams): Promise<AiSearchListItemsResponse>;
/**
* Upload a file as an item. Behaves as an upsert: if an item with the same
* filename already exists, it is overwritten and re-indexed.
* @param name Filename for the uploaded item.
* @param content File content as a ReadableStream, Blob, or string.
* @param options Optional metadata to attach to the item.
* @returns The created item info.
*/
upload(name: string, content: ReadableStream | Blob | string, options?: AiSearchUploadItemOptions): Promise<AiSearchItemInfo>;
/**
* Upload a file and poll until processing completes.
* Behaves as an upsert: if an item with the same filename already exists,
* it is overwritten and re-indexed.
* @param name Filename for the uploaded item.
* @param content File content as a ReadableStream, Blob, or string.
* @param options Optional metadata and polling configuration.
* @returns The item info after processing completes (or timeout).
*/
uploadAndPoll(name: string, content: ReadableStream | Blob | string, options?: AiSearchUploadItemOptions & {
/** Polling interval in milliseconds (default 1000). */
pollIntervalMs?: number;
/** Maximum time to wait in milliseconds (default 30000). */
timeoutMs?: number;
}): Promise<AiSearchItemInfo>;
/**
* Get an item by ID.
* @param itemId The item identifier.
* @returns Item service for info, download, sync, logs, and chunks operations.
*/
get(itemId: string): AiSearchItem;
/**
* Delete an item from the instance.
* @param itemId The item identifier.
*/
delete(itemId: string): Promise<void>;
}
/**
* Single job service for an AI Search instance.
* Provides info, logs, and cancel operations for a specific job.
*/
declare abstract class AiSearchJob {
/** Get metadata about this job. */
info(): Promise<AiSearchJobInfo>;
/** Get logs for this job. */
logs(params?: AiSearchJobLogsParams): Promise<AiSearchJobLogsResponse>;
/**
* Cancel a running job.
* @returns The updated job info.
* @throws AiSearchNotFoundError if the job does not exist.
*/
cancel(): Promise<AiSearchJobInfo>;
}
/**
* Jobs collection service for an AI Search instance.
* Provides list, create, and access to individual jobs.
*/
declare abstract class AiSearchJobs {
/** List jobs for this instance. */
list(params?: AiSearchListJobsParams): Promise<AiSearchListJobsResponse>;
/**
* Create a new indexing job.
* @param params Optional job parameters.
* @returns The created job info.
*/
create(params?: AiSearchCreateJobParams): Promise<AiSearchJobInfo>;
/**
* Get a job by ID.
* @param jobId The job identifier.
* @returns Job service for info, logs, and cancel operations.
*/
get(jobId: string): AiSearchJob;
}
// ============ AI Search Binding Classes ============
/**
* Instance-level AI Search service.
*
* Used as:
* - The return type of `AiSearchNamespace.get(name)` (namespace binding)
* - The type of `env.BLOG_SEARCH` (single instance binding via `ai_search`)
*
* Provides search, chat, update, stats, items, and jobs operations.
*
* @example
* ```ts
* // Via namespace binding
* const instance = env.AI_SEARCH.get("blog");
* const results = await instance.search({
* query: "How does caching work?",
* });
*
* // Via single instance binding
* const results = await env.BLOG_SEARCH.search({
* messages: [{ role: "user", content: "How does caching work?" }],
* });
* ```
*/
declare abstract class AiSearchInstance {
/**
* Search the AI Search instance for relevant chunks.
* @param params Search request with messages and AI search options
* @returns Search response with matching chunks
* @param params Search request with query or messages and optional AI search options.
* @returns Search response with matching chunks and search query.
*/
search(params: AiSearchSearchRequest): Promise<AiSearchSearchResponse>;
/**
* Generate chat completions with AI Search context (streaming).
* @param params Chat completions request with stream: true.
* @returns ReadableStream of server-sent events.
*/
chatCompletions(params: AiSearchChatCompletionsRequest & {
stream: true;
}): Promise<ReadableStream>;
/**
* Generate chat completions with AI Search context.
* @param params Chat completions request with optional streaming
* @returns Response object (if streaming) or chat completion result
* @param params Chat completions request.
* @returns Chat completion response with choices and RAG chunks.
*/
chatCompletions(params: AiSearchChatCompletionsRequest): Promise<Response | object>;
chatCompletions(params: AiSearchChatCompletionsRequest): Promise<AiSearchChatCompletionsResponse>;
/**
* Delete this AI Search instance.
* Update the instance configuration.
* @param config Partial configuration to update.
* @returns Updated instance info.
*/
delete(): Promise<void>;
update(config: Partial<AiSearchConfig>): Promise<AiSearchInstanceInfo>;
/** Get metadata about this instance. */
info(): Promise<AiSearchInstanceInfo>;
/**
* Get instance statistics (item count, indexing status, etc.).
* @returns Statistics with counts per status, last activity time, and engine details.
*/
stats(): Promise<AiSearchStatsResponse>;
/** Items collection — list, upload, and manage items in this instance. */
get items(): AiSearchItems;
/** Jobs collection — list, create, and inspect indexing jobs. */
get jobs(): AiSearchJobs;
}
// AI Search Account Service - Account-level operations
declare abstract class AiSearchAccountService {
/**
* Namespace-level AI Search service.
*
* Used as the type of `env.AI_SEARCH` (namespace binding via `ai_search_namespaces`).
* Scoped to a single namespace. Provides dynamic instance access, creation, deletion,
* and multi-instance search/chat operations.
*
* @example
* ```ts
* // Access an instance within the namespace
* const blog = env.AI_SEARCH.get("blog");
* const results = await blog.search({ query: "How does caching work?" });
*
* // List all instances in the namespace
* const instances = await env.AI_SEARCH.list();
*
* // Create a new instance with built-in storage
* const tenant = await env.AI_SEARCH.create({ id: "tenant-123" });
*
* // Upload items into the instance
* await tenant.items.upload("doc.pdf", fileContent);
*
* // Search across multiple instances
* const multi = await env.AI_SEARCH.search({
* query: "caching",
* ai_search_options: { instance_ids: ["blog", "docs"] },
* });
*
* // Delete an instance
* await env.AI_SEARCH.delete("tenant-123");
* ```
*/
declare abstract class AiSearchNamespace {
/**
* List all AI Search instances in the account.
* @returns Array of AI Search instances
* Get an instance by name within the bound namespace.
* @param name Instance name.
* @returns Instance service for search, chat, update, stats, items, and jobs.
*/
list(): Promise<AiSearchListResponse>;
get(name: string): AiSearchInstance;
/**
* Get an AI Search instance by ID.
* @param name Instance ID
* @returns Instance service for performing operations
* List instances in the bound namespace.
* @param params Optional pagination, search, and ordering parameters.
* @returns Array of instance metadata with pagination info.
*/
get(name: string): AiSearchInstanceService;
list(params?: AiSearchListInstancesParams): Promise<AiSearchListResponse>;
/**
* Create a new AI Search instance.
* @param config Instance configuration
* @returns Instance service for performing operations
* Create a new instance within the bound namespace.
* @param config Instance configuration. Only `id` is required omit `type` and `source` to create with built-in storage.
* @returns Instance service for the newly created instance.
*
* @example
* ```ts
* // Create with built-in storage (upload items manually)
* const instance = await env.AI_SEARCH.create({ id: "my-search" });
*
* // Create with web crawler source
* const instance = await env.AI_SEARCH.create({
* id: "docs-search",
* type: "web-crawler",
* source: "https://developers.cloudflare.com",
* });
* ```
*/
create(config: AiSearchConfig): Promise<AiSearchInstanceService>;
create(config: AiSearchConfig): Promise<AiSearchInstance>;
/**
* Delete an instance from the bound namespace.
* @param name Instance name to delete.
*/
delete(name: string): Promise<void>;
/**
* Search across multiple instances within the bound namespace.
* Fans out to the specified instance_ids and merges results.
* @param params Search request with required `ai_search_options.instance_ids`.
* @returns Search response with chunks tagged by instance_id and optional partial-failure errors.
*/
search(params: AiSearchMultiSearchRequest): Promise<AiSearchMultiSearchResponse>;
/**
* Generate chat completions across multiple instances within the bound namespace (streaming).
* Fans out to the specified instance_ids, merges context, and generates a response.
* @param params Chat completions request with stream: true and required `ai_search_options.instance_ids`.
* @returns ReadableStream of server-sent events.
*/
chatCompletions(params: AiSearchMultiChatCompletionsRequest & {
stream: true;
}): Promise<ReadableStream>;
/**
* Generate chat completions across multiple instances within the bound namespace.
* Fans out to the specified instance_ids, merges context, and generates a response.
* @param params Chat completions request with required `ai_search_options.instance_ids`.
* @returns Chat completion response with choices, chunks tagged by instance_id, and optional partial-failure errors.
*/
chatCompletions(params: AiSearchMultiChatCompletionsRequest): Promise<AiSearchMultiChatCompletionsResponse>;
}
type AiImageClassificationInput = {
image: number[];
@@ -3772,6 +4777,356 @@ declare abstract class BaseAiTranslation {
inputs: AiTranslationInput;
postProcessedOutputs: AiTranslationOutput;
}
/**
* Workers AI support for OpenAI's Chat Completions API
*/
type ChatCompletionContentPartText = {
type: "text";
text: string;
};
type ChatCompletionContentPartImage = {
type: "image_url";
image_url: {
url: string;
detail?: "auto" | "low" | "high";
};
};
type ChatCompletionContentPartInputAudio = {
type: "input_audio";
input_audio: {
/** Base64 encoded audio data. */
data: string;
format: "wav" | "mp3";
};
};
type ChatCompletionContentPartFile = {
type: "file";
file: {
/** Base64 encoded file data. */
file_data?: string;
/** The ID of an uploaded file. */
file_id?: string;
filename?: string;
};
};
type ChatCompletionContentPartRefusal = {
type: "refusal";
refusal: string;
};
type ChatCompletionContentPart = ChatCompletionContentPartText | ChatCompletionContentPartImage | ChatCompletionContentPartInputAudio | ChatCompletionContentPartFile;
type FunctionDefinition = {
name: string;
description?: string;
parameters?: Record<string, unknown>;
strict?: boolean | null;
};
type ChatCompletionFunctionTool = {
type: "function";
function: FunctionDefinition;
};
type ChatCompletionCustomToolGrammarFormat = {
type: "grammar";
grammar: {
definition: string;
syntax: "lark" | "regex";
};
};
type ChatCompletionCustomToolTextFormat = {
type: "text";
};
type ChatCompletionCustomToolFormat = ChatCompletionCustomToolTextFormat | ChatCompletionCustomToolGrammarFormat;
type ChatCompletionCustomTool = {
type: "custom";
custom: {
name: string;
description?: string;
format?: ChatCompletionCustomToolFormat;
};
};
type ChatCompletionTool = ChatCompletionFunctionTool | ChatCompletionCustomTool;
type ChatCompletionMessageFunctionToolCall = {
id: string;
type: "function";
function: {
name: string;
/** JSON-encoded arguments string. */
arguments: string;
};
};
type ChatCompletionMessageCustomToolCall = {
id: string;
type: "custom";
custom: {
name: string;
input: string;
};
};
type ChatCompletionMessageToolCall = ChatCompletionMessageFunctionToolCall | ChatCompletionMessageCustomToolCall;
type ChatCompletionToolChoiceFunction = {
type: "function";
function: {
name: string;
};
};
type ChatCompletionToolChoiceCustom = {
type: "custom";
custom: {
name: string;
};
};
type ChatCompletionToolChoiceAllowedTools = {
type: "allowed_tools";
allowed_tools: {
mode: "auto" | "required";
tools: Array<Record<string, unknown>>;
};
};
type ChatCompletionToolChoiceOption = "none" | "auto" | "required" | ChatCompletionToolChoiceFunction | ChatCompletionToolChoiceCustom | ChatCompletionToolChoiceAllowedTools;
type DeveloperMessage = {
role: "developer";
content: string | Array<{
type: "text";
text: string;
}>;
name?: string;
};
type SystemMessage = {
role: "system";
content: string | Array<{
type: "text";
text: string;
}>;
name?: string;
};
/**
* Permissive merged content part used inside UserMessage arrays.
*
* Cabidela has a limitation where anyOf/oneOf with enum-based discrimination
* inside nested array items does not correctly match different branches for
* different array elements, so the schema uses a single merged object.
*/
type UserMessageContentPart = {
type: "text" | "image_url" | "input_audio" | "file";
text?: string;
image_url?: {
url?: string;
detail?: "auto" | "low" | "high";
};
input_audio?: {
data?: string;
format?: "wav" | "mp3";
};
file?: {
file_data?: string;
file_id?: string;
filename?: string;
};
};
type UserMessage = {
role: "user";
content: string | Array<UserMessageContentPart>;
name?: string;
};
type AssistantMessageContentPart = {
type: "text" | "refusal";
text?: string;
refusal?: string;
};
type AssistantMessage = {
role: "assistant";
content?: string | null | Array<AssistantMessageContentPart>;
refusal?: string | null;
name?: string;
audio?: {
id: string;
};
tool_calls?: Array<ChatCompletionMessageToolCall>;
function_call?: {
name: string;
arguments: string;
};
};
type ToolMessage = {
role: "tool";
content: string | Array<{
type: "text";
text: string;
}>;
tool_call_id: string;
};
type FunctionMessage = {
role: "function";
content: string;
name: string;
};
type ChatCompletionMessageParam = DeveloperMessage | SystemMessage | UserMessage | AssistantMessage | ToolMessage | FunctionMessage;
type ChatCompletionsResponseFormatText = {
type: "text";
};
type ChatCompletionsResponseFormatJSONObject = {
type: "json_object";
};
type ResponseFormatJSONSchema = {
type: "json_schema";
json_schema: {
name: string;
description?: string;
schema?: Record<string, unknown>;
strict?: boolean | null;
};
};
type ResponseFormat = ChatCompletionsResponseFormatText | ChatCompletionsResponseFormatJSONObject | ResponseFormatJSONSchema;
type ChatCompletionsStreamOptions = {
include_usage?: boolean;
include_obfuscation?: boolean;
};
type PredictionContent = {
type: "content";
content: string | Array<{
type: "text";
text: string;
}>;
};
type AudioParams = {
voice: string | {
id: string;
};
format: "wav" | "aac" | "mp3" | "flac" | "opus" | "pcm16";
};
type WebSearchUserLocation = {
type: "approximate";
approximate: {
city?: string;
country?: string;
region?: string;
timezone?: string;
};
};
type WebSearchOptions = {
search_context_size?: "low" | "medium" | "high";
user_location?: WebSearchUserLocation;
};
type ChatTemplateKwargs = {
/** Whether to enable reasoning, enabled by default. */
enable_thinking?: boolean;
/** If false, preserves reasoning context between turns. */
clear_thinking?: boolean;
};
/** Shared optional properties used by both Prompt and Messages input branches. */
type ChatCompletionsCommonOptions = {
model?: string;
audio?: AudioParams;
frequency_penalty?: number | null;
logit_bias?: Record<string, unknown> | null;
logprobs?: boolean | null;
top_logprobs?: number | null;
max_tokens?: number | null;
max_completion_tokens?: number | null;
metadata?: Record<string, unknown> | null;
modalities?: Array<"text" | "audio"> | null;
n?: number | null;
parallel_tool_calls?: boolean;
prediction?: PredictionContent;
presence_penalty?: number | null;
reasoning_effort?: "low" | "medium" | "high" | null;
chat_template_kwargs?: ChatTemplateKwargs;
response_format?: ResponseFormat;
seed?: number | null;
service_tier?: "auto" | "default" | "flex" | "scale" | "priority" | null;
stop?: string | Array<string> | null;
store?: boolean | null;
stream?: boolean | null;
stream_options?: ChatCompletionsStreamOptions;
temperature?: number | null;
tool_choice?: ChatCompletionToolChoiceOption;
tools?: Array<ChatCompletionTool>;
top_p?: number | null;
user?: string;
web_search_options?: WebSearchOptions;
function_call?: "none" | "auto" | {
name: string;
};
functions?: Array<FunctionDefinition>;
};
type PromptTokensDetails = {
cached_tokens?: number;
audio_tokens?: number;
};
type CompletionTokensDetails = {
reasoning_tokens?: number;
audio_tokens?: number;
accepted_prediction_tokens?: number;
rejected_prediction_tokens?: number;
};
type CompletionUsage = {
prompt_tokens: number;
completion_tokens: number;
total_tokens: number;
prompt_tokens_details?: PromptTokensDetails;
completion_tokens_details?: CompletionTokensDetails;
};
type ChatCompletionTopLogprob = {
token: string;
logprob: number;
bytes: Array<number> | null;
};
type ChatCompletionTokenLogprob = {
token: string;
logprob: number;
bytes: Array<number> | null;
top_logprobs: Array<ChatCompletionTopLogprob>;
};
type ChatCompletionAudio = {
id: string;
/** Base64 encoded audio bytes. */
data: string;
expires_at: number;
transcript: string;
};
type ChatCompletionUrlCitation = {
type: "url_citation";
url_citation: {
url: string;
title: string;
start_index: number;
end_index: number;
};
};
type ChatCompletionResponseMessage = {
role: "assistant";
content: string | null;
refusal: string | null;
annotations?: Array<ChatCompletionUrlCitation>;
audio?: ChatCompletionAudio;
tool_calls?: Array<ChatCompletionMessageToolCall>;
function_call?: {
name: string;
arguments: string;
} | null;
};
type ChatCompletionLogprobs = {
content: Array<ChatCompletionTokenLogprob> | null;
refusal?: Array<ChatCompletionTokenLogprob> | null;
};
type ChatCompletionChoice = {
index: number;
message: ChatCompletionResponseMessage;
finish_reason: "stop" | "length" | "tool_calls" | "content_filter" | "function_call";
logprobs: ChatCompletionLogprobs | null;
};
type ChatCompletionsMessagesInput = {
messages: Array<ChatCompletionMessageParam>;
} & ChatCompletionsCommonOptions;
type ChatCompletionsOutput = {
id: string;
object: string;
created: number;
model: string;
choices: Array<ChatCompletionChoice>;
usage?: CompletionUsage;
system_fingerprint?: string | null;
service_tier?: "auto" | "default" | "flex" | "scale" | "priority" | null;
};
/**
* Workers AI support for OpenAI's Responses API
* Reference: https://github.com/openai/openai-node/blob/master/src/resources/responses/responses.ts
@@ -4129,6 +5484,12 @@ type ReasoningEffort = "minimal" | "low" | "medium" | "high" | null;
type StreamOptions = {
include_obfuscation?: boolean;
};
/** Marks keys from T that aren't in U as optional never */
type Without<T, U> = {
[P in Exclude<keyof T, keyof U>]?: never;
};
/** Either T or U, but not both (mutually exclusive) */
type XOR<T, U> = (T & Without<U, T>) | (U & Without<T, U>);
type Ai_Cf_Baai_Bge_Base_En_V1_5_Input = {
text: string | string[];
/**
@@ -4399,10 +5760,10 @@ declare abstract class Base_Ai_Cf_Openai_Whisper_Tiny_En {
postProcessedOutputs: Ai_Cf_Openai_Whisper_Tiny_En_Output;
}
interface Ai_Cf_Openai_Whisper_Large_V3_Turbo_Input {
/**
* Base64 encoded value of the audio data.
*/
audio: string;
audio: string | {
body?: object;
contentType?: string;
};
/**
* Supported tasks are 'translate' or 'transcribe'.
*/
@@ -4420,9 +5781,33 @@ interface Ai_Cf_Openai_Whisper_Large_V3_Turbo_Input {
*/
initial_prompt?: string;
/**
* The prefix it appended the the beginning of the output of the transcription and can guide the transcription result.
* The prefix appended to the beginning of the output of the transcription and can guide the transcription result.
*/
prefix?: string;
/**
* The number of beams to use in beam search decoding. Higher values may improve accuracy at the cost of speed.
*/
beam_size?: number;
/**
* Whether to condition on previous text during transcription. Setting to false may help prevent hallucination loops.
*/
condition_on_previous_text?: boolean;
/**
* Threshold for detecting no-speech segments. Segments with no-speech probability above this value are skipped.
*/
no_speech_threshold?: number;
/**
* Threshold for filtering out segments with high compression ratio, which often indicate repetitive or hallucinated text.
*/
compression_ratio_threshold?: number;
/**
* Threshold for filtering out segments with low average log probability, indicating low confidence.
*/
log_prob_threshold?: number;
/**
* Optional threshold (in seconds) to skip silent periods that may cause hallucinations.
*/
hallucination_silence_threshold?: number;
}
interface Ai_Cf_Openai_Whisper_Large_V3_Turbo_Output {
transcription_info?: {
@@ -4562,8 +5947,8 @@ interface Ai_Cf_Baai_Bge_M3_Input_Embedding_1 {
*/
truncate_inputs?: boolean;
}
type Ai_Cf_Baai_Bge_M3_Output = Ai_Cf_Baai_Bge_M3_Ouput_Query | Ai_Cf_Baai_Bge_M3_Output_EmbeddingFor_Contexts | Ai_Cf_Baai_Bge_M3_Ouput_Embedding | Ai_Cf_Baai_Bge_M3_AsyncResponse;
interface Ai_Cf_Baai_Bge_M3_Ouput_Query {
type Ai_Cf_Baai_Bge_M3_Output = Ai_Cf_Baai_Bge_M3_Output_Query | Ai_Cf_Baai_Bge_M3_Output_EmbeddingFor_Contexts | Ai_Cf_Baai_Bge_M3_Output_Embedding | Ai_Cf_Baai_Bge_M3_AsyncResponse;
interface Ai_Cf_Baai_Bge_M3_Output_Query {
response?: {
/**
* Index of the context in the request
@@ -4583,7 +5968,7 @@ interface Ai_Cf_Baai_Bge_M3_Output_EmbeddingFor_Contexts {
*/
pooling?: "mean" | "cls";
}
interface Ai_Cf_Baai_Bge_M3_Ouput_Embedding {
interface Ai_Cf_Baai_Bge_M3_Output_Embedding {
shape?: number[];
/**
* Embeddings of the requested text values
@@ -4686,7 +6071,7 @@ interface Ai_Cf_Meta_Llama_3_2_11B_Vision_Instruct_Messages {
*/
role?: string;
/**
* The tool call id. Must be supplied for tool calls for Mistral-3. If you don't know what to put here you can fall back to 000000001
* The tool call id. If you don't know what to put here you can fall back to 000000001
*/
tool_call_id?: string;
content?: string | {
@@ -4932,10 +6317,16 @@ interface Ai_Cf_Meta_Llama_3_3_70B_Instruct_Fp8_Fast_Messages {
* The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool').
*/
role: string;
/**
* The content of the message as a string.
*/
content: string;
content: string | {
/**
* Type of the content (text)
*/
type?: string;
/**
* Text content
*/
text?: string;
}[];
}[];
functions?: {
name: string;
@@ -5576,7 +6967,7 @@ interface Ai_Cf_Qwen_Qwq_32B_Messages {
*/
role?: string;
/**
* The tool call id. Must be supplied for tool calls for Mistral-3. If you don't know what to put here you can fall back to 000000001
* The tool call id. If you don't know what to put here you can fall back to 000000001
*/
tool_call_id?: string;
content?: string | {
@@ -5697,7 +7088,7 @@ interface Ai_Cf_Qwen_Qwq_32B_Messages {
};
})[];
/**
* JSON schema that should be fulfilled for the response.
* JSON schema that should be fufilled for the response.
*/
guided_json?: object;
/**
@@ -5963,7 +7354,7 @@ interface Ai_Cf_Mistralai_Mistral_Small_3_1_24B_Instruct_Messages {
};
})[];
/**
* JSON schema that should be fulfilled for the response.
* JSON schema that should be fufilled for the response.
*/
guided_json?: object;
/**
@@ -6054,7 +7445,7 @@ interface Ai_Cf_Google_Gemma_3_12B_It_Prompt {
*/
prompt: string;
/**
* JSON schema that should be fulfilled for the response.
* JSON schema that should be fufilled for the response.
*/
guided_json?: object;
/**
@@ -6213,7 +7604,7 @@ interface Ai_Cf_Google_Gemma_3_12B_It_Messages {
};
})[];
/**
* JSON schema that should be fulfilled for the response.
* JSON schema that should be fufilled for the response.
*/
guided_json?: object;
/**
@@ -6485,7 +7876,7 @@ interface Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Messages {
})[];
response_format?: Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_JSON_Mode;
/**
* JSON schema that should be fulfilled for the response.
* JSON schema that should be fufilled for the response.
*/
guided_json?: object;
/**
@@ -6715,7 +8106,7 @@ interface Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_Messages_Inner {
})[];
response_format?: Ai_Cf_Meta_Llama_4_Scout_17B_16E_Instruct_JSON_Mode;
/**
* JSON schema that should be fulfilled for the response.
* JSON schema that should be fufilled for the response.
*/
guided_json?: object;
/**
@@ -6877,10 +8268,16 @@ interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Messages {
* The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool').
*/
role: string;
/**
* The content of the message as a string.
*/
content: string;
content: string | {
/**
* Type of the content (text)
*/
type?: string;
/**
* Text content
*/
text?: string;
}[];
}[];
functions?: {
name: string;
@@ -7086,10 +8483,16 @@ interface Ai_Cf_Qwen_Qwen3_30B_A3B_Fp8_Messages_1 {
* The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool').
*/
role: string;
/**
* The content of the message as a string.
*/
content: string;
content: string | {
/**
* Type of the content (text)
*/
type?: string;
/**
* Text content
*/
text?: string;
}[];
}[];
functions?: {
name: string;
@@ -7640,12 +9043,12 @@ declare abstract class Base_Ai_Cf_Pipecat_Ai_Smart_Turn_V2 {
postProcessedOutputs: Ai_Cf_Pipecat_Ai_Smart_Turn_V2_Output;
}
declare abstract class Base_Ai_Cf_Openai_Gpt_Oss_120B {
inputs: ResponsesInput;
postProcessedOutputs: ResponsesOutput;
inputs: XOR<ResponsesInput, ChatCompletionsMessagesInput>;
postProcessedOutputs: XOR<ResponsesOutput, ChatCompletionsOutput>;
}
declare abstract class Base_Ai_Cf_Openai_Gpt_Oss_20B {
inputs: ResponsesInput;
postProcessedOutputs: ResponsesOutput;
inputs: XOR<ResponsesInput, ChatCompletionsMessagesInput>;
postProcessedOutputs: XOR<ResponsesOutput, ChatCompletionsOutput>;
}
interface Ai_Cf_Leonardo_Phoenix_1_0_Input {
/**
@@ -7765,7 +9168,7 @@ interface Ai_Cf_Ai4Bharat_Indictrans2_En_Indic_1B_Input {
*/
text: string | string[];
/**
* Target language to translate to
* Target langauge to translate to
*/
target_language: "asm_Beng" | "awa_Deva" | "ben_Beng" | "bho_Deva" | "brx_Deva" | "doi_Deva" | "eng_Latn" | "gom_Deva" | "gon_Deva" | "guj_Gujr" | "hin_Deva" | "hne_Deva" | "kan_Knda" | "kas_Arab" | "kas_Deva" | "kha_Latn" | "lus_Latn" | "mag_Deva" | "mai_Deva" | "mal_Mlym" | "mar_Deva" | "mni_Beng" | "mni_Mtei" | "npi_Deva" | "ory_Orya" | "pan_Guru" | "san_Deva" | "sat_Olck" | "snd_Arab" | "snd_Deva" | "tam_Taml" | "tel_Telu" | "urd_Arab" | "unr_Deva";
}
@@ -7844,10 +9247,16 @@ interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Messages {
* The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool').
*/
role: string;
/**
* The content of the message as a string.
*/
content: string;
content: string | {
/**
* Type of the content (text)
*/
type?: string;
/**
* Text content
*/
text?: string;
}[];
}[];
functions?: {
name: string;
@@ -8053,10 +9462,16 @@ interface Ai_Cf_Aisingapore_Gemma_Sea_Lion_V4_27B_It_Messages_1 {
* The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool').
*/
role: string;
/**
* The content of the message as a string.
*/
content: string;
content: string | {
/**
* Type of the content (text)
*/
type?: string;
/**
* Text content
*/
text?: string;
}[];
}[];
functions?: {
name: string;
@@ -8552,6 +9967,74 @@ declare abstract class Base_Ai_Cf_Deepgram_Aura_2_Es {
inputs: Ai_Cf_Deepgram_Aura_2_Es_Input;
postProcessedOutputs: Ai_Cf_Deepgram_Aura_2_Es_Output;
}
interface Ai_Cf_Black_Forest_Labs_Flux_2_Dev_Input {
multipart: {
body?: object;
contentType?: string;
};
}
interface Ai_Cf_Black_Forest_Labs_Flux_2_Dev_Output {
/**
* Generated image as Base64 string.
*/
image?: string;
}
declare abstract class Base_Ai_Cf_Black_Forest_Labs_Flux_2_Dev {
inputs: Ai_Cf_Black_Forest_Labs_Flux_2_Dev_Input;
postProcessedOutputs: Ai_Cf_Black_Forest_Labs_Flux_2_Dev_Output;
}
interface Ai_Cf_Black_Forest_Labs_Flux_2_Klein_4B_Input {
multipart: {
body?: object;
contentType?: string;
};
}
interface Ai_Cf_Black_Forest_Labs_Flux_2_Klein_4B_Output {
/**
* Generated image as Base64 string.
*/
image?: string;
}
declare abstract class Base_Ai_Cf_Black_Forest_Labs_Flux_2_Klein_4B {
inputs: Ai_Cf_Black_Forest_Labs_Flux_2_Klein_4B_Input;
postProcessedOutputs: Ai_Cf_Black_Forest_Labs_Flux_2_Klein_4B_Output;
}
interface Ai_Cf_Black_Forest_Labs_Flux_2_Klein_9B_Input {
multipart: {
body?: object;
contentType?: string;
};
}
interface Ai_Cf_Black_Forest_Labs_Flux_2_Klein_9B_Output {
/**
* Generated image as Base64 string.
*/
image?: string;
}
declare abstract class Base_Ai_Cf_Black_Forest_Labs_Flux_2_Klein_9B {
inputs: Ai_Cf_Black_Forest_Labs_Flux_2_Klein_9B_Input;
postProcessedOutputs: Ai_Cf_Black_Forest_Labs_Flux_2_Klein_9B_Output;
}
declare abstract class Base_Ai_Cf_Zai_Org_Glm_4_7_Flash {
inputs: ChatCompletionsInput;
postProcessedOutputs: ChatCompletionsOutput;
}
declare abstract class Base_Ai_Cf_Moonshotai_Kimi_K2_5 {
inputs: ChatCompletionsInput;
postProcessedOutputs: ChatCompletionsOutput;
}
declare abstract class Base_Ai_Cf_Moonshotai_Kimi_K2_6 {
inputs: ChatCompletionsInput;
postProcessedOutputs: ChatCompletionsOutput;
}
declare abstract class Base_Ai_Cf_Nvidia_Nemotron_3_120B_A12B {
inputs: ChatCompletionsInput;
postProcessedOutputs: ChatCompletionsOutput;
}
declare abstract class Base_Ai_Cf_Google_Gemma_4_26B_A4B_IT {
inputs: ChatCompletionsInput;
postProcessedOutputs: ChatCompletionsOutput;
}
interface AiModels {
"@cf/huggingface/distilbert-sst-2-int8": BaseAiTextClassification;
"@cf/stabilityai/stable-diffusion-xl-base-1.0": BaseAiTextToImage;
@@ -8570,7 +10053,6 @@ interface AiModels {
"@hf/thebloke/zephyr-7b-beta-awq": BaseAiTextGeneration;
"@hf/thebloke/openhermes-2.5-mistral-7b-awq": BaseAiTextGeneration;
"@hf/thebloke/neural-chat-7b-v3-1-awq": BaseAiTextGeneration;
"@hf/thebloke/llamaguard-7b-awq": BaseAiTextGeneration;
"@hf/thebloke/deepseek-coder-6.7b-base-awq": BaseAiTextGeneration;
"@hf/thebloke/deepseek-coder-6.7b-instruct-awq": BaseAiTextGeneration;
"@cf/deepseek-ai/deepseek-math-7b-instruct": BaseAiTextGeneration;
@@ -8637,6 +10119,14 @@ interface AiModels {
"@cf/deepgram/flux": Base_Ai_Cf_Deepgram_Flux;
"@cf/deepgram/aura-2-en": Base_Ai_Cf_Deepgram_Aura_2_En;
"@cf/deepgram/aura-2-es": Base_Ai_Cf_Deepgram_Aura_2_Es;
"@cf/black-forest-labs/flux-2-dev": Base_Ai_Cf_Black_Forest_Labs_Flux_2_Dev;
"@cf/black-forest-labs/flux-2-klein-4b": Base_Ai_Cf_Black_Forest_Labs_Flux_2_Klein_4B;
"@cf/black-forest-labs/flux-2-klein-9b": Base_Ai_Cf_Black_Forest_Labs_Flux_2_Klein_9B;
"@cf/zai-org/glm-4.7-flash": Base_Ai_Cf_Zai_Org_Glm_4_7_Flash;
"@cf/moonshotai/kimi-k2.5": Base_Ai_Cf_Moonshotai_Kimi_K2_5;
"@cf/moonshotai/kimi-k2.6": Base_Ai_Cf_Moonshotai_Kimi_K2_6;
"@cf/nvidia/nemotron-3-120b-a12b": Base_Ai_Cf_Nvidia_Nemotron_3_120B_A12B;
"@cf/google/gemma-4-26b-a4b-it": Base_Ai_Cf_Google_Gemma_4_26B_A4B_IT;
}
type AiOptions = {
/**
@@ -8662,6 +10152,7 @@ type AiOptions = {
returnRawResponse?: boolean;
prefix?: string;
extraHeaders?: object;
signal?: AbortSignal;
};
type AiModelsSearchParams = {
author?: string;
@@ -8688,64 +10179,61 @@ type AiModelsSearchObject = {
value: string;
}[];
};
type ChatCompletionsBase = ChatCompletionsMessagesInput;
type ChatCompletionsInput = ChatCompletionsMessagesInput;
interface InferenceUpstreamError extends Error {
}
interface AiInternalError extends Error {
}
type AiModelListType = Record<string, any>;
type AiAsyncBatchResponse = {
request_id: string;
};
declare abstract class Ai<AiModelList extends AiModelListType = AiModels> {
aiGatewayLogId: string | null;
gateway(gatewayId: string): AiGateway;
/**
* Access the AI Search API for managing AI-powered search instances.
*
* This is the new API that replaces AutoRAG with better namespace separation:
* - Account-level operations: `list()`, `create()`
* - Instance-level operations: `get(id).search()`, `get(id).chatCompletions()`, `get(id).delete()`
*
* @example
* ```typescript
* // List all AI Search instances
* const instances = await env.AI.aiSearch.list();
*
* // Search an instance
* const results = await env.AI.aiSearch.get('my-search').search({
* messages: [{ role: 'user', content: 'What is the policy?' }],
* ai_search_options: {
* retrieval: { max_num_results: 10 }
* }
* });
*
* // Generate chat completions with AI Search context
* const response = await env.AI.aiSearch.get('my-search').chatCompletions({
* messages: [{ role: 'user', content: 'What is the policy?' }],
* model: '@cf/meta/llama-3.3-70b-instruct-fp8-fast'
* });
* ```
* @deprecated Use the standalone `ai_search_namespaces` or `ai_search` Workers bindings instead.
* See https://developers.cloudflare.com/ai-search/usage/workers-binding/
*/
aiSearch(): AiSearchAccountService;
aiSearch(): AiSearchNamespace;
/**
* @deprecated AutoRAG has been replaced by AI Search.
* Use `env.AI.aiSearch` instead for better API design and new features.
* Use the standalone `ai_search_namespaces` or `ai_search` Workers bindings instead.
* See https://developers.cloudflare.com/ai-search/usage/workers-binding/
*
* Migration guide:
* - `env.AI.autorag().list()` `env.AI.aiSearch.list()`
* - `env.AI.autorag('id').search({ query: '...' })` `env.AI.aiSearch.get('id').search({ messages: [{ role: 'user', content: '...' }] })`
* - `env.AI.autorag('id').aiSearch(...)` `env.AI.aiSearch.get('id').chatCompletions(...)`
*
* Note: The old API continues to work for backwards compatibility, but new projects should use AI Search.
*
* @see AiSearchAccountService
* @param autoragId Optional instance ID (omit for account-level operations)
* @param autoragId Instance ID
*/
autorag(autoragId: string): AutoRAG;
run<Name extends keyof AiModelList, Options extends AiOptions, InputOptions extends AiModelList[Name]["inputs"]>(model: Name, inputs: InputOptions, options?: Options): Promise<Options extends {
// Batch request
run<Name extends keyof AiModelList>(model: Name, inputs: {
requests: AiModelList[Name]['inputs'][];
}, options: AiOptions & {
queueRequest: true;
}): Promise<AiAsyncBatchResponse>;
// Raw response
run<Name extends keyof AiModelList>(model: Name, inputs: AiModelList[Name]['inputs'], options: AiOptions & {
returnRawResponse: true;
} | {
}): Promise<Response>;
// WebSocket
run<Name extends keyof AiModelList>(model: Name, inputs: AiModelList[Name]['inputs'], options: AiOptions & {
websocket: true;
} ? Response : InputOptions extends {
}): Promise<Response>;
// Streaming
run<Name extends keyof AiModelList>(model: Name, inputs: AiModelList[Name]['inputs'] & {
stream: true;
} ? ReadableStream : AiModelList[Name]["postProcessedOutputs"]>;
}, options?: AiOptions): Promise<ReadableStream>;
// Normal (default) - known model
run<Name extends keyof AiModelList>(model: Name, inputs: AiModelList[Name]['inputs'], options?: AiOptions): Promise<AiModelList[Name]['postProcessedOutputs']>;
// Unknown model (fallback).
//
// The `Exclude<..., keyof AiModelList>` constraint forces TypeScript to
// route any model name that is a literal key of `AiModelList` to one of
// the known-model overloads above (so input/output mismatches surface as
// type errors rather than silently falling back to `Record<string, unknown>`).
// Names that aren't in `AiModelList` — e.g. third-party gateway models
// like `"google/nano-banana"` — still hit this overload.
run<Model extends string>(model: Model extends keyof AiModelList ? never : Model, inputs: Record<string, unknown>, options?: AiOptions): Promise<Record<string, unknown>>;
models(params?: AiModelsSearchParams): Promise<AiModelsSearchObject[]>;
toMarkdown(): ToMarkdownService;
toMarkdown(files: MarkdownDocument[], options?: ConversionRequestOptions): Promise<ConversionResponse[]>;
@@ -8843,29 +10331,250 @@ declare abstract class AiGateway {
run(data: AIGatewayUniversalRequest | AIGatewayUniversalRequest[], options?: {
gateway?: UniversalGatewayOptions;
extraHeaders?: object;
signal?: AbortSignal;
}): Promise<Response>;
getUrl(provider?: AIGatewayProviders | string): Promise<string>; // eslint-disable-line
}
// Copyright (c) 2022-2025 Cloudflare, Inc.
// Licensed under the Apache 2.0 license found in the LICENSE file or at:
// https://opensource.org/licenses/Apache-2.0
/**
* @deprecated AutoRAG has been replaced by AI Search. Use AiSearchInternalError instead.
* @see AiSearchInternalError
* Artifacts Git-compatible file storage on Cloudflare Workers.
*
* Provides programmatic access to create, manage, and fork repositories,
* and to issue and revoke scoped access tokens.
*/
/** Information about a repository. */
interface ArtifactsRepoInfo {
/** Unique repository ID. */
id: string;
/** Repository name. */
name: string;
/** Repository description, or null if not set. */
description: string | null;
/** Default branch name (e.g. "main"). */
defaultBranch: string;
/** ISO 8601 creation timestamp. */
createdAt: string;
/** ISO 8601 last-updated timestamp. */
updatedAt: string;
/** ISO 8601 timestamp of the last push, or null if never pushed. */
lastPushAt: string | null;
/** Fork source (e.g. "github:owner/repo", "artifacts:namespace/repo"), or null if not a fork. */
source: string | null;
/** Whether the repository is read-only. */
readOnly: boolean;
/** HTTPS git remote URL. */
remote: string;
}
/** Result of creating a repository — includes the initial access token. */
interface ArtifactsCreateRepoResult {
/** Unique repository ID. */
id: string;
/** Repository name. */
name: string;
/** Repository description, or null if not set. */
description: string | null;
/** Default branch name. */
defaultBranch: string;
/** HTTPS git remote URL. */
remote: string;
/** Plaintext access token (only returned at creation time). */
token: string;
/** ISO 8601 token expiry timestamp. */
tokenExpiresAt: string;
}
/** Paginated list of repositories. */
interface ArtifactsRepoListResult {
/** Repositories in this page (without the `remote` field). */
repos: Omit<ArtifactsRepoInfo, 'remote'>[];
/** Total number of repositories in the namespace. */
total: number;
/** Cursor for the next page, if there are more results. */
cursor?: string;
}
/** Result of creating an access token. */
interface ArtifactsCreateTokenResult {
/** Unique token ID. */
id: string;
/** Plaintext token (only returned at creation time). */
plaintext: string;
/** Token scope: "read" or "write". */
scope: 'read' | 'write';
/** ISO 8601 token expiry timestamp. */
expiresAt: string;
}
/** Token metadata (no plaintext). */
interface ArtifactsTokenInfo {
/** Unique token ID. */
id: string;
/** Token scope: "read" or "write". */
scope: 'read' | 'write';
/** Token state: "active", "expired", or "revoked". */
state: 'active' | 'expired' | 'revoked';
/** ISO 8601 creation timestamp. */
createdAt: string;
/** ISO 8601 expiry timestamp. */
expiresAt: string;
}
/** Paginated list of tokens for a repository. */
interface ArtifactsTokenListResult {
/** Tokens in this page. */
tokens: ArtifactsTokenInfo[];
/** Total number of tokens for the repository. */
total: number;
}
/**
* Handle for a single repository. Returned by Artifacts.get().
*
* Methods may throw `ArtifactsError` with code `INTERNAL_ERROR` if an unexpected service error occurs.
*/
interface ArtifactsRepo extends ArtifactsRepoInfo {
/**
* Create an access token for this repo.
* @param scope Token scope: "write" (default) or "read".
* @param ttl Time-to-live in seconds (default 86400, min 60, max 31536000).
* @throws {ArtifactsError} with code `INVALID_TTL` if ttl is out of range.
*/
createToken(scope?: 'write' | 'read', ttl?: number): Promise<ArtifactsCreateTokenResult>;
/** List tokens for this repo (metadata only, no plaintext). */
listTokens(): Promise<ArtifactsTokenListResult>;
/**
* Revoke a token by plaintext or ID.
* @param tokenOrId Plaintext token or token ID.
* @returns true if revoked, false if not found.
* @throws {ArtifactsError} with code `INVALID_INPUT` if tokenOrId is empty.
*/
revokeToken(tokenOrId: string): Promise<boolean>;
// ── Fork ──
/**
* Fork this repo to a new repo.
* @param name Target repository name.
* @param opts Optional: description, readOnly flag, defaultBranchOnly (default true).
* @throws {ArtifactsError} with code `INVALID_REPO_NAME` if name is invalid.
* @throws {ArtifactsError} with code `ALREADY_EXISTS` if the target repo already exists.
* @throws {ArtifactsError} with code `FORK_IN_PROGRESS` if a fork is already running.
*/
fork(name: string, opts?: {
description?: string;
readOnly?: boolean;
defaultBranchOnly?: boolean;
}): Promise<ArtifactsCreateRepoResult>;
}
// ── Error types ──────────────────────────────────────────────────────────────
/**
* Error codes returned by Artifacts binding operations.
*
* Each code maps to a numeric code available on `ArtifactsError.numericCode`.
*/
type ArtifactsErrorCode = 'ALREADY_EXISTS' | 'NOT_FOUND' | 'IMPORT_IN_PROGRESS' | 'FORK_IN_PROGRESS' | 'INVALID_INPUT' | 'INVALID_REPO_NAME' | 'INVALID_TTL' | 'INVALID_URL' | 'REMOTE_AUTH_REQUIRED' | 'UPSTREAM_UNAVAILABLE' | 'MEMORY_LIMIT' | 'INTERNAL_ERROR';
/**
* Error thrown by Artifacts binding operations.
*
* Uses a string `.code` discriminator following the Cloudflare platform
* convention (StreamError, ImagesError, etc.). The `.numericCode` matches
* the REST API `errors[].code` values.
*/
interface ArtifactsError extends Error {
readonly name: 'ArtifactsError';
/** String error code for programmatic matching. */
readonly code: ArtifactsErrorCode;
/** Numeric error code matching the REST API. */
readonly numericCode: number;
}
// ── Binding ──────────────────────────────────────────────────────────────────
/**
* Artifacts binding namespace-level operations.
*
* Methods may throw `ArtifactsError` with code `INTERNAL_ERROR` if an unexpected service error occurs.
*/
interface Artifacts {
/**
* Create a new repository with an initial access token.
* @param name Repository name (alphanumeric, dots, hyphens, underscores).
* @param opts Optional: readOnly flag, description, default branch name.
* @returns Repo metadata with initial token.
* @throws {ArtifactsError} with code `INVALID_REPO_NAME` if name is invalid.
* @throws {ArtifactsError} with code `ALREADY_EXISTS` if the repo already exists.
*/
create(name: string, opts?: {
readOnly?: boolean;
description?: string;
setDefaultBranch?: string;
}): Promise<ArtifactsCreateRepoResult>;
/**
* Get a handle to an existing repository.
* @param name Repository name.
* @returns Repo handle.
* @throws {ArtifactsError} with code `NOT_FOUND` if the repo does not exist.
* @throws {ArtifactsError} with code `IMPORT_IN_PROGRESS` if the repo is still importing.
* @throws {ArtifactsError} with code `FORK_IN_PROGRESS` if the repo is still forking.
*/
get(name: string): Promise<ArtifactsRepo>;
/**
* Import a repository from an external git remote.
* @param params Source URL and optional branch/depth, plus target name and options.
* @returns Repo metadata with initial token.
* @throws {ArtifactsError} with code `INVALID_REPO_NAME` if the target name is invalid.
* @throws {ArtifactsError} with code `INVALID_INPUT` if the source URL is not valid HTTPS.
* @throws {ArtifactsError} with code `INVALID_URL` if the source URL does not point to a git repository.
* @throws {ArtifactsError} with code `REMOTE_AUTH_REQUIRED` if the remote requires authentication.
* @throws {ArtifactsError} with code `NOT_FOUND` if the remote repository does not exist.
* @throws {ArtifactsError} with code `UPSTREAM_UNAVAILABLE` if the remote cannot be reached.
* @throws {ArtifactsError} with code `MEMORY_LIMIT` if the import exceeds service memory limits.
* @throws {ArtifactsError} with code `ALREADY_EXISTS` if the target repo already exists.
*/
import(params: {
source: {
url: string;
branch?: string;
depth?: number;
};
target: {
name: string;
opts?: {
description?: string;
readOnly?: boolean;
};
};
}): Promise<ArtifactsCreateRepoResult>;
/**
* List repositories with cursor-based pagination.
* @param opts Optional: limit (1200, default 50), cursor for next page.
*/
list(opts?: {
limit?: number;
cursor?: string;
}): Promise<ArtifactsRepoListResult>;
/**
* Delete a repository and all associated tokens.
* @param name Repository name.
* @returns true if deleted, false if not found.
* @throws {ArtifactsError} with code `INVALID_REPO_NAME` if name is invalid.
*/
delete(name: string): Promise<boolean>;
}
/**
* @deprecated Use the standalone AI Search Workers binding instead.
* See https://developers.cloudflare.com/ai-search/usage/workers-binding/
*/
interface AutoRAGInternalError extends Error {
}
/**
* @deprecated AutoRAG has been replaced by AI Search. Use AiSearchNotFoundError instead.
* @see AiSearchNotFoundError
* @deprecated Use the standalone AI Search Workers binding instead.
* See https://developers.cloudflare.com/ai-search/usage/workers-binding/
*/
interface AutoRAGNotFoundError extends Error {
}
/**
* @deprecated This error type is no longer used in the AI Search API.
* @deprecated Use the standalone AI Search Workers binding instead.
* See https://developers.cloudflare.com/ai-search/usage/workers-binding/
*/
interface AutoRAGUnauthorizedError extends Error {
}
/**
* @deprecated AutoRAG has been replaced by AI Search. Use AiSearchNameNotSetError instead.
* @see AiSearchNameNotSetError
* @deprecated Use the standalone AI Search Workers binding instead.
* See https://developers.cloudflare.com/ai-search/usage/workers-binding/
*/
interface AutoRAGNameNotSetError extends Error {
}
@@ -8879,9 +10588,8 @@ type CompoundFilter = {
filters: ComparisonFilter[];
};
/**
* @deprecated AutoRAG has been replaced by AI Search.
* Use AiSearchSearchRequest with the new API instead.
* @see AiSearchSearchRequest
* @deprecated Use the standalone AI Search Workers binding instead.
* See https://developers.cloudflare.com/ai-search/usage/workers-binding/
*/
type AutoRagSearchRequest = {
query: string;
@@ -8898,26 +10606,23 @@ type AutoRagSearchRequest = {
rewrite_query?: boolean;
};
/**
* @deprecated AutoRAG has been replaced by AI Search.
* Use AiSearchChatCompletionsRequest with the new API instead.
* @see AiSearchChatCompletionsRequest
* @deprecated Use the standalone AI Search Workers binding instead.
* See https://developers.cloudflare.com/ai-search/usage/workers-binding/
*/
type AutoRagAiSearchRequest = AutoRagSearchRequest & {
stream?: boolean;
system_prompt?: string;
};
/**
* @deprecated AutoRAG has been replaced by AI Search.
* Use AiSearchChatCompletionsRequest with stream: true instead.
* @see AiSearchChatCompletionsRequest
* @deprecated Use the standalone AI Search Workers binding instead.
* See https://developers.cloudflare.com/ai-search/usage/workers-binding/
*/
type AutoRagAiSearchRequestStreaming = Omit<AutoRagAiSearchRequest, 'stream'> & {
stream: true;
};
/**
* @deprecated AutoRAG has been replaced by AI Search.
* Use AiSearchSearchResponse with the new API instead.
* @see AiSearchSearchResponse
* @deprecated Use the standalone AI Search Workers binding instead.
* See https://developers.cloudflare.com/ai-search/usage/workers-binding/
*/
type AutoRagSearchResponse = {
object: 'vector_store.search_results.page';
@@ -8936,9 +10641,8 @@ type AutoRagSearchResponse = {
next_page: string | null;
};
/**
* @deprecated AutoRAG has been replaced by AI Search.
* Use AiSearchListResponse with the new API instead.
* @see AiSearchListResponse
* @deprecated Use the standalone AI Search Workers binding instead.
* See https://developers.cloudflare.com/ai-search/usage/workers-binding/
*/
type AutoRagListResponse = {
id: string;
@@ -8950,123 +10654,488 @@ type AutoRagListResponse = {
status: string;
}[];
/**
* @deprecated AutoRAG has been replaced by AI Search.
* The new API returns different response formats for chat completions.
* @deprecated Use the standalone AI Search Workers binding instead.
* See https://developers.cloudflare.com/ai-search/usage/workers-binding/
*/
type AutoRagAiSearchResponse = AutoRagSearchResponse & {
response: string;
};
/**
* @deprecated AutoRAG has been replaced by AI Search.
* Use the new AI Search API instead: `env.AI.aiSearch`
*
* Migration guide:
* - `env.AI.autorag().list()` `env.AI.aiSearch.list()`
* - `env.AI.autorag('id').search(...)` `env.AI.aiSearch.get('id').search(...)`
* - `env.AI.autorag('id').aiSearch(...)` `env.AI.aiSearch.get('id').chatCompletions(...)`
*
* @see AiSearchAccountService
* @see AiSearchInstanceService
* @deprecated Use the standalone AI Search Workers binding instead.
* See https://developers.cloudflare.com/ai-search/usage/workers-binding/
*/
declare abstract class AutoRAG {
/**
* @deprecated Use `env.AI.aiSearch.list()` instead.
* @see AiSearchAccountService.list
* @deprecated Use the standalone AI Search Workers binding instead.
* See https://developers.cloudflare.com/ai-search/usage/workers-binding/
*/
list(): Promise<AutoRagListResponse>;
/**
* @deprecated Use `env.AI.aiSearch.get(id).search(...)` instead.
* Note: The new API uses a messages array instead of a query string.
* @see AiSearchInstanceService.search
* @deprecated Use the standalone AI Search Workers binding instead.
* See https://developers.cloudflare.com/ai-search/usage/workers-binding/
*/
search(params: AutoRagSearchRequest): Promise<AutoRagSearchResponse>;
/**
* @deprecated Use `env.AI.aiSearch.get(id).chatCompletions(...)` instead.
* @see AiSearchInstanceService.chatCompletions
* @deprecated Use the standalone AI Search Workers binding instead.
* See https://developers.cloudflare.com/ai-search/usage/workers-binding/
*/
aiSearch(params: AutoRagAiSearchRequestStreaming): Promise<Response>;
/**
* @deprecated Use `env.AI.aiSearch.get(id).chatCompletions(...)` instead.
* @see AiSearchInstanceService.chatCompletions
* @deprecated Use the standalone AI Search Workers binding instead.
* See https://developers.cloudflare.com/ai-search/usage/workers-binding/
*/
aiSearch(params: AutoRagAiSearchRequest): Promise<AutoRagAiSearchResponse>;
/**
* @deprecated Use `env.AI.aiSearch.get(id).chatCompletions(...)` instead.
* @see AiSearchInstanceService.chatCompletions
* @deprecated Use the standalone AI Search Workers binding instead.
* See https://developers.cloudflare.com/ai-search/usage/workers-binding/
*/
aiSearch(params: AutoRagAiSearchRequest): Promise<AutoRagAiSearchResponse | Response>;
}
interface BasicImageTransformations {
/**
* Maximum width in image pixels. The value must be an integer.
type BrowserRunLifecycleEvent = 'load' | 'domcontentloaded' | 'networkidle0' | 'networkidle2';
type BrowserRunResourceType = 'document' | 'stylesheet' | 'image' | 'media' | 'font' | 'script' | 'texttrack' | 'xhr' | 'fetch' | 'prefetch' | 'eventsource' | 'websocket' | 'manifest' | 'signedexchange' | 'ping' | 'cspviolationreport' | 'preflight' | 'other';
/** Options fields shared by all quick actions. */
interface BrowserRunBaseOptions {
/** Adds `<script>` tags into the page with the desired URL or content.
* @see https://pptr.dev/api/puppeteer.frameaddscripttagoptions
*/
width?: number;
/**
* Maximum height in image pixels. The value must be an integer.
addScriptTag?: Array<{
content?: string;
url?: string;
type?: string;
id?: string;
}>;
/** Adds `<link rel="stylesheet">` or `<style>` tags into the page.
* @see https://pptr.dev/api/puppeteer.frameaddstyletagoptions
*/
height?: number;
/**
* Resizing mode as a string. It affects interpretation of width and height
* options:
* - scale-down: Similar to contain, but the image is never enlarged. If
* the image is larger than given width or height, it will be resized.
* Otherwise its original size will be kept.
* - contain: Resizes to maximum size that fits within the given width and
* height. If only a single dimension is given (e.g. only width), the
* image will be shrunk or enlarged to exactly match that dimension.
* Aspect ratio is always preserved.
* - cover: Resizes (shrinks or enlarges) to fill the entire area of width
* and height. If the image has an aspect ratio different from the ratio
* of width and height, it will be cropped to fit.
* - crop: The image will be shrunk and cropped to fit within the area
* specified by width and height. The image will not be enlarged. For images
* smaller than the given dimensions it's the same as scale-down. For
* images larger than the given dimensions, it's the same as cover.
* See also trim.
* - pad: Resizes to the maximum size that fits within the given width and
* height, and then fills the remaining area with a background color
* (white by default). Use of this mode is not recommended, as the same
* effect can be more efficiently achieved with the contain mode and the
* CSS object-fit: contain property.
* - squeeze: Stretches and deforms to the width and height given, even if it
* breaks aspect ratio
addStyleTag?: Array<{
content?: string;
url?: string;
}>;
/** Provide credentials for HTTP authentication. @see https://pptr.dev/api/puppeteer.credentials */
authenticate?: {
username: string;
password: string;
};
/** Set cookies before navigating. @see https://pptr.dev/api/puppeteer.cookieparam */
cookies?: Array<{
name: string;
value: string;
url?: string;
domain?: string;
path?: string;
secure?: boolean;
httpOnly?: boolean;
sameSite?: 'Strict' | 'Lax' | 'None';
expires?: number;
priority?: 'Low' | 'Medium' | 'High';
sameParty?: boolean;
sourceScheme?: 'Unset' | 'NonSecure' | 'Secure';
sourcePort?: number;
partitionKey?: string;
}>;
/** Emulate a specific CSS media type (e.g. `"screen"`, `"print"`). */
emulateMediaType?: string;
/** Navigation options. @see https://pptr.dev/api/puppeteer.gotooptions */
gotoOptions?: {
/** Navigation timeout in milliseconds (max 60 000). @default 30000 */
timeout?: number;
/** When to consider navigation complete. @default "domcontentloaded" */
waitUntil?: BrowserRunLifecycleEvent | BrowserRunLifecycleEvent[];
referer?: string;
referrerPolicy?: string;
};
/** Block requests matching these regex patterns. Mutually exclusive with `allowRequestPattern`. */
rejectRequestPattern?: string[];
/** Only allow requests matching these regex patterns. Mutually exclusive with `rejectRequestPattern`. */
allowRequestPattern?: string[];
/** Block requests of these resource types. Mutually exclusive with `allowResourceTypes`. */
rejectResourceTypes?: BrowserRunResourceType[];
/** Only allow requests of these resource types. Mutually exclusive with `rejectResourceTypes`. */
allowResourceTypes?: BrowserRunResourceType[];
/** Additional HTTP headers sent with every request. */
setExtraHTTPHeaders?: Record<string, string>;
/** Whether JavaScript is enabled on the page. */
setJavaScriptEnabled?: boolean;
/** Override the default user agent string.
* @default "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"
* */
userAgent?: string;
/** Set the browser viewport size.
* @see https://pptr.dev/api/puppeteer.viewport
* @default {width:1920,height:1080}
* */
viewport?: {
width: number;
height: number;
deviceScaleFactor?: number;
isMobile?: boolean;
isLandscape?: boolean;
hasTouch?: boolean;
};
/** Wait for a CSS selector to appear in the page before proceeding.
* @see https://pptr.dev/api/puppeteer.waitforselectoroptions
*/
fit?: "scale-down" | "contain" | "cover" | "crop" | "pad" | "squeeze";
/**
* Image segmentation using artificial intelligence models. Sets pixels not
* within selected segment area to transparent e.g "foreground" sets every
* background pixel as transparent.
waitForSelector?: {
selector: string;
hidden?: true;
visible?: true;
/** Timeout in milliseconds. Max 120000 */
timeout?: number;
};
/** Wait for a fixed delay in milliseconds before proceeding. Max 120000 */
waitForTimeout?: number;
/** When true, continue on best-effort when awaited events fail or timeout. */
bestAttempt?: boolean;
/** Maximum duration in milliseconds for the browser action after page load. Max 120000 */
actionTimeout?: number;
/** Cache time to live in seconds (0-86400). Set to 0 to disable.
* @default 5
*/
segment?: "foreground";
/**
* When cropping with fit: "cover", this defines the side or point that should
* be left uncropped. The value is either a string
* "left", "right", "top", "bottom", "auto", or "center" (the default),
* or an object {x, y} containing focal point coordinates in the original
* image expressed as fractions ranging from 0.0 (top or left) to 1.0
* (bottom or right), 0.5 being the center. {fit: "cover", gravity: "top"} will
* crop bottom or left and right sides as necessary, but wont crop anything
* from the top. {fit: "cover", gravity: {x:0.5, y:0.2}} will crop each side to
* preserve as much as possible around a point at 20% of the height of the
* source image.
*/
gravity?: 'face' | 'left' | 'right' | 'top' | 'bottom' | 'center' | 'auto' | 'entropy' | BasicImageTransformationsGravityCoordinates;
/**
* Background color to add underneath the image. Applies only to images with
* transparency (such as PNG). Accepts any CSS color (#RRGGBB, rgba(),
* hsl(), etc.)
*/
background?: string;
/**
* Number of degrees (90, 180, 270) to rotate the image by. width and height
* options refer to axes after rotation.
*/
rotate?: 0 | 90 | 180 | 270 | 360;
cacheTTL?: number;
}
interface BasicImageTransformationsGravityCoordinates {
x?: number;
y?: number;
mode?: 'remainder' | 'box-center';
/** Common options shared by all quick actions. Exactly one of `url` or `html` must be provided.*/
type BrowserRunCommonOptions = (BrowserRunBaseOptions & {
/** URL to navigate to, e.g. `"https://example.com"`. */
url: string;
}) | (BrowserRunBaseOptions & {
/** Set the HTML content of the page directly. */
html: string;
});
type BrowserRunPuppeteerScreenshotOptions = {
/** @default "png" */
type?: 'png' | 'jpeg' | 'webp';
/** @default "binary" */
encoding?: 'binary' | 'base64';
quality?: number;
fullPage?: boolean;
clip?: {
x: number;
y: number;
width: number;
height: number;
scale?: number;
};
omitBackground?: boolean;
optimizeForSpeed?: boolean;
captureBeyondViewport?: boolean;
fromSurface?: boolean;
};
type BrowserRunScreenshotOptions = BrowserRunCommonOptions & {
/** CSS selector of the element to screenshot. */
selector?: string;
/** When true, scroll the entire page before taking the screenshot. */
scrollPage?: boolean;
/** @see https://pptr.dev/api/puppeteer.screenshotoptions */
screenshotOptions?: BrowserRunPuppeteerScreenshotOptions;
};
type BrowserRunPDFOptions = BrowserRunCommonOptions & {
/** @see https://pptr.dev/api/puppeteer.pdfoptions */
pdfOptions?: {
/** @default 1 */
scale?: number;
/** @default false */
displayHeaderFooter?: boolean;
headerTemplate?: string;
footerTemplate?: string;
/** @default false */
printBackground?: boolean;
/** @default false */
landscape?: boolean;
pageRanges?: string;
/** @default "letter" */
format?: 'letter' | 'legal' | 'tabloid' | 'ledger' | 'a0' | 'a1' | 'a2' | 'a3' | 'a4' | 'a5' | 'a6';
width?: string | number;
height?: string | number;
/** @default false */
preferCSSPageSize?: boolean;
margin?: {
top?: string | number;
right?: string | number;
bottom?: string | number;
left?: string | number;
};
/** @default false */
omitBackground?: boolean;
/** @default true */
tagged?: boolean;
/** @default false */
outline?: boolean;
/** @default 30000 */
timeout?: number;
};
};
type BrowserRunScrapeOptions = BrowserRunCommonOptions & {
/** CSS selectors to scrape. At least one element is required. */
elements: Array<{
selector: string;
}>;
};
type BrowserRunLinksOptions = BrowserRunCommonOptions & {
/** When true, only return links that are visible on the page. @default false */
visibleLinksOnly?: boolean;
/** When true, exclude links pointing to external domains. @default false */
excludeExternalLinks?: boolean;
};
type BrowserRunSnapshotOptions = BrowserRunCommonOptions & {
/** @see https://pptr.dev/api/puppeteer.screenshotoptions */
screenshotOptions?: Omit<BrowserRunPuppeteerScreenshotOptions, 'encoding'>;
};
interface BrowserRunJsonBaseOptions {
/** Custom AI models to try in order. Max 3. Falls back to next on error. */
custom_ai?: Array<{
/** Model ID in `<provider>/<model_name>` format, e.g. `"workers-ai/@cf/meta/llama-3.3-70b-instruct-fp8-fast"`. */
model: string;
/** Bearer token. Not needed for workers-ai models. */
authorization?: string;
}>;
}
/**
* Options for the `json` quick action.
* At least one of `prompt` or `response_format` must be provided.
*/
type BrowserRunJsonOptions = BrowserRunCommonOptions & BrowserRunJsonBaseOptions & ({
/** Natural-language prompt describing what data to extract. */
prompt: string;
/** Structured output schema for the AI model. @see https://developers.cloudflare.com/workers-ai/json-mode/ */
response_format?: AiTextGenerationResponseFormat;
} | {
/** Natural-language prompt describing what data to extract. */
prompt?: string;
/** Structured output schema for the AI model. @see https://developers.cloudflare.com/workers-ai/json-mode/ */
response_format: AiTextGenerationResponseFormat;
});
type BrowserRunContentOptions = BrowserRunCommonOptions;
type BrowserRunMarkdownOptions = BrowserRunCommonOptions;
type BrowserRunResponseMeta = {
/** HTTP status code of the rendered page */
status: number;
/** Page title */
title: string;
};
/** Success response for `content` action. */
type BrowserRunContentSuccessResponse = {
success: true;
/** Extracted HTML content */
result: string;
meta: BrowserRunResponseMeta;
};
/** Success response for `links` action. */
type BrowserRunLinksSuccessResponse = {
success: true;
/** Extracted links */
result: string[];
};
/** Success response for `scrape` action. */
type BrowserRunScrapeSuccessResponse = {
success: true;
result: Array<{
/** The CSS selector used to find elements. */
selector: string;
/** Array of elements matching the selector. */
results: Array<{
/** Outer HTML of the element. */
html: string;
/** Text content of the element. */
text: string;
/** Width of the element in pixels. */
width: number;
/** Height of the element in pixels. */
height: number;
/** Top position of the element relative to the viewport in pixels. */
top: number;
/** Left position of the element relative to the viewport in pixels. */
left: number;
/** Array of HTML attributes on the element. */
attributes: Array<{
/** Attribute name. */
name: string;
/** Attribute value. */
value: string;
}>;
}>;
}>;
};
/** Success response for `snapshot` action. */
type BrowserRunSnapshotSuccessResponse = {
success: true;
result: {
/** HTML content of the page. */
content: string;
/** Base64-encoded screenshot image. */
screenshot: string;
};
meta: BrowserRunResponseMeta;
};
/** Success response for `json` action. */
type BrowserRunJsonSuccessResponse = {
success: true;
/** JSON data extracted from the page using an AI model */
result: Record<string, unknown>;
};
/** Success response for `markdown` action. */
type BrowserRunMarkdownSuccessResponse = {
success: true;
/** Extracted markdown content */
result: string;
};
/** Error response for BrowserRun actions. */
type BrowserRunErrorResponse = {
success: false;
errors: {
message: string;
code?: number;
detail?: string;
path?: string;
}[];
};
/** Error response for BrowserRun `json` action. */
type BrowserRunJsonErrorResponse = BrowserRunErrorResponse & {
/** Raw AI response text for debugging */
rawAiResponse?: string;
};
/**
* Browser Run API binding for automating headless browsers.
* @see https://developers.cloudflare.com/browser-run/
*/
declare abstract class BrowserRun {
/**
* Send a raw HTTP request to the Browser Run API.
* Used by libraries like `@cloudflare/puppeteer` to acquire and connect to a browser instance.
* @see https://developers.cloudflare.com/browser-run/
*/
fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;
/**
* Take a screenshot of a web page.
* @param action - Must be `'screenshot'`.
* @param options - Screenshot options including viewport, selectors, and image format.
* @returns A `Response` containing one of:
*
* **Success (HTTP 200):**
* - Binary image data with `Content-Type: image/png`, `image/jpeg`, or `image/webp` (when `encoding: 'binary'`, the default)
* - Data URI string with `Content-Type: text/plain` (when `encoding: 'base64'`)
*
* **Error:**
* - `BrowserRunErrorResponse` JSON with appropriate HTTP status code (400, 422, 429, 500, 503)
*
* **Headers:**
* - `X-Browser-Ms-Used`: Browser time consumed in milliseconds (set when status < 500)
*/
quickAction(action: 'screenshot', options: BrowserRunScreenshotOptions): Promise<Response>;
/**
* Generate a PDF of a web page.
* @param action - Must be `'pdf'`.
* @param options - PDF generation options including page size, margins, and headers/footers.
* @returns A `Response` containing one of:
*
* **Success (HTTP 200):**
* - Binary PDF data with `Content-Type: application/pdf`
*
* **Error:**
* - `BrowserRunErrorResponse` JSON with appropriate HTTP status code (400, 422, 429, 500, 503)
*
* **Headers:**
* - `X-Browser-Ms-Used`: Browser time consumed in milliseconds (set when status < 500)
*/
quickAction(action: 'pdf', options: BrowserRunPDFOptions): Promise<Response>;
/**
* Get the HTML content of a web page.
* @param action - Must be `'content'`.
* @param options - Navigation and page interaction options.
* @returns A `Response` containing one of:
*
* **Success (HTTP 200):**
* - `BrowserRunContentSuccessResponse` JSON with `Content-Type: application/json`
*
* **Error:**
* - `BrowserRunErrorResponse` JSON with appropriate HTTP status code (400, 422, 429, 500, 503)
*
* **Headers:**
* - `X-Browser-Ms-Used`: Browser time consumed in milliseconds (set when status < 500)
*/
quickAction(action: 'content', options: BrowserRunContentOptions): Promise<Response>;
/**
* Scrape elements from a web page by CSS selector.
* @param action - Must be `'scrape'`.
* @param options - Scrape options with CSS selectors for elements to extract.
* @returns A `Response` containing one of:
*
* **Success (HTTP 200):**
* - `BrowserRunScrapeSuccessResponse` JSON with `Content-Type: application/json`
*
* **Error:**
* - `BrowserRunErrorResponse` JSON with appropriate HTTP status code (400, 422, 429, 500, 503)
*
* **Headers:**
* - `X-Browser-Ms-Used`: Browser time consumed in milliseconds (set when status < 500)
*/
quickAction(action: 'scrape', options: BrowserRunScrapeOptions): Promise<Response>;
/**
* Extract all links from a web page.
* @param action - Must be `'links'`.
* @param options - Options to filter visible or internal links only.
* @returns A `Response` containing one of:
*
* **Success (HTTP 200):**
* - `BrowserRunLinksSuccessResponse` JSON with `Content-Type: application/json`
*
* **Error:**
* - `BrowserRunErrorResponse` JSON with appropriate HTTP status code (400, 422, 429, 500, 503)
*
* **Headers:**
* - `X-Browser-Ms-Used`: Browser time consumed in milliseconds (set when status < 500)
*/
quickAction(action: 'links', options: BrowserRunLinksOptions): Promise<Response>;
/**
* Get both the HTML content and a base64-encoded screenshot of a web page.
* @param action - Must be `'snapshot'`.
* @param options - Snapshot options including screenshot settings (encoding is always base64).
* @returns A `Response` containing one of:
*
* **Success (HTTP 200):**
* - `BrowserRunSnapshotSuccessResponse` JSON with `Content-Type: application/json`
*
* **Error:**
* - `BrowserRunErrorResponse` JSON with appropriate HTTP status code (400, 422, 429, 500, 503)
*
* **Headers:**
* - `X-Browser-Ms-Used`: Browser time consumed in milliseconds (set when status < 500)
*/
quickAction(action: 'snapshot', options: BrowserRunSnapshotOptions): Promise<Response>;
/**
* Extract structured JSON data from a web page using AI.
* @param action - Must be `'json'`.
* @param options - JSON extraction options with prompt or response_format schema.
* @returns A `Response` containing one of:
*
* **Success (HTTP 200):**
* - `BrowserRunJsonSuccessResponse` JSON with `Content-Type: application/json`
*
* **Error:**
* - `BrowserRunErrorResponse` JSON with appropriate HTTP status code (400, 422, 429, 500, 503)
* - HTTP 422 with code `2012` for HTML-to-markdown conversion failures
* - HTTP 422/500 for AI extraction failures (may include `rawAiResponse` field)
*
* **Headers:**
* - `X-Browser-Ms-Used`: Browser time consumed in milliseconds (set when status < 500)
*/
quickAction(action: 'json', options: BrowserRunJsonOptions): Promise<Response>;
/**
* Convert a web page to Markdown.
* @param action - Must be `'markdown'`.
* @param options - Navigation and page interaction options.
* @returns A `Response` containing one of:
*
* **Success (HTTP 200):**
* - `BrowserRunMarkdownSuccessResponse` JSON with `Content-Type: application/json`
*
* **Error:**
* - `BrowserRunErrorResponse` JSON with appropriate HTTP status code (400, 422, 429, 500, 503)
* - HTTP 422 with code `2012` for HTML-to-markdown conversion failures
*
* **Headers:**
* - `X-Browser-Ms-Used`: Browser time consumed in milliseconds (set when status < 500)
*/
quickAction(action: 'markdown', options: BrowserRunMarkdownOptions): Promise<Response>;
}
/**
* In addition to the properties you can set in the RequestInit dict
@@ -9106,8 +11175,56 @@ interface RequestInitCfProperties extends Record<string, unknown> {
* (e.g. { '200-299': 86400, '404': 1, '500-599': 0 })
*/
cacheTtlByStatus?: Record<string, number>;
/** Controls how responses with a `Vary` header are cached for this request. */
vary?: RequestInitCfPropertiesVary;
/**
* Explicit Cache-Control header value to set on the response stored in cache.
* This gives full control over cache directives (e.g. 'public, max-age=3600, s-maxage=86400').
*
* Cannot be used together with `cacheTtl` or the `cache` request option (`no-store`/`no-cache`),
* as these are mutually exclusive cache control mechanisms. Setting both will throw a TypeError.
*
* Can be used together with `cacheTtlByStatus`.
*/
cacheControl?: string;
/**
* Whether the response should be eligible for Cache Reserve storage.
*/
cacheReserveEligible?: boolean;
/**
* Whether to respect strong ETags (as opposed to weak ETags) from the origin.
*/
respectStrongEtag?: boolean;
/**
* Whether to strip ETag headers from the origin response before caching.
*/
stripEtags?: boolean;
/**
* Whether to strip Last-Modified headers from the origin response before caching.
*/
stripLastModified?: boolean;
/**
* Whether to enable Cache Deception Armor, which protects against web cache
* deception attacks by verifying the Content-Type matches the URL extension.
*/
cacheDeceptionArmor?: boolean;
/**
* Minimum file size in bytes for a response to be eligible for Cache Reserve storage.
*/
cacheReserveMinimumFileSize?: number;
scrapeShield?: boolean;
apps?: boolean;
/**
* Controls whether an outbound gRPC-web subrequest from this Worker is
* converted to gRPC at the Cloudflare edge.
*
* - `"passthrough"`: forward the subrequest unchanged as gRPC-web (default).
* - `"convert"`: convert the gRPC-web subrequest to gRPC at the edge.
*
* Provides per-request control over the same edge conversion behavior
* gated by the `auto_grpc_convert` compatibility flag.
*/
grpcWeb?: "passthrough" | "convert";
image?: RequestInitCfPropertiesImage;
minify?: RequestInitCfPropertiesImageMinify;
mirage?: boolean;
@@ -9128,49 +11245,122 @@ interface RequestInitCfProperties extends Record<string, unknown> {
*/
resolveOverride?: string;
}
interface RequestInitCfPropertiesImageDraw extends BasicImageTransformations {
/**
* Controls how Workers Standard Vary handles a request header listed by an
* origin `Vary` response header:
*
* - `"normalize"`: normalize the request header value before it is used in the
* cache variance key.
* - `"passthrough"`: use the raw request header value in the cache variance
* key.
* - `"bypass"`: bypass cache when the header appears in the origin `Vary`
* response header.
*/
type RequestInitCfPropertiesVaryAction = "normalize" | "passthrough" | "bypass";
/** Configuration for Workers Standard Vary support. */
interface RequestInitCfPropertiesVary {
/** The fallback action for varied request headers not listed in `headers`. */
default: RequestInitCfPropertiesVaryHeader;
/**
* Absolute URL of the image file to use for the drawing. It can be any of
* the supported file formats. For drawing of watermarks or non-rectangular
* overlays we recommend using PNG or WebP images.
*/
url: string;
/**
* Floating-point number between 0 (transparent) and 1 (opaque).
* For example, opacity: 0.5 makes overlay semitransparent.
*/
opacity?: number;
/**
* - If set to true, the overlay image will be tiled to cover the entire
* area. This is useful for stock-photo-like watermarks.
* - If set to "x", the overlay image will be tiled horizontally only
* (form a line).
* - If set to "y", the overlay image will be tiled vertically only
* (form a line).
*/
repeat?: true | "x" | "y";
/**
* Position of the overlay image relative to a given edge. Each property is
* an offset in pixels. 0 aligns exactly to the edge. For example, left: 10
* positions left side of the overlay 10 pixels from the left edge of the
* image it's drawn over. bottom: 0 aligns bottom of the overlay with bottom
* of the background image.
* Lowercase request header names and their Vary configuration.
*
* Setting both left & right, or both top & bottom is an error.
*
* If no position is specified, the image will be centered.
* The `accept` header can include `media_types`, the `accept-language`
* header can include `languages`, and other headers support only `action`.
*/
top?: number;
left?: number;
bottom?: number;
right?: number;
headers?: RequestInitCfPropertiesVaryHeaders;
}
interface RequestInitCfPropertiesImage extends BasicImageTransformations {
/** Common Vary behavior for a single request header. */
interface RequestInitCfPropertiesVaryHeader {
/** How this request header contributes to cache variance. */
action: RequestInitCfPropertiesVaryAction;
}
/** Vary behavior for the `accept` request header. */
interface RequestInitCfPropertiesVaryAcceptHeader extends RequestInitCfPropertiesVaryHeader {
/**
* Device Pixel Ratio. Default 1. Multiplier for width/height that makes it
* easier to specify higher-DPI sizes in <img srcset>.
* Media types to keep when normalizing the `Accept` request header.
*
* Named `media_types` to match the serialized `cf.vary` configuration.
*/
dpr?: number;
media_types?: string[];
}
/** Vary behavior for the `accept-language` request header. */
interface RequestInitCfPropertiesVaryAcceptLanguageHeader extends RequestInitCfPropertiesVaryHeader {
/**
* Language tags to keep when normalizing the `Accept-Language` request
* header.
*/
languages?: string[];
}
/**
* Lowercase request header names and their Vary behavior.
*
* The index signature allows arbitrary custom request headers beyond the
* well-known `accept` and `accept-language` specializations.
*/
interface RequestInitCfPropertiesVaryHeaders {
accept?: RequestInitCfPropertiesVaryAcceptHeader;
"accept-language"?: RequestInitCfPropertiesVaryAcceptLanguageHeader;
[header: string]: RequestInitCfPropertiesVaryHeader | RequestInitCfPropertiesVaryAcceptHeader | RequestInitCfPropertiesVaryAcceptLanguageHeader | undefined;
}
interface BasicImageTransformations {
/**
* Maximum width in image pixels. The value must be an integer.
*/
width?: number;
/**
* Maximum height in image pixels. The value must be an integer.
*/
height?: number;
/**
* When cropping with fit: "cover", this defines the side or point that should
* be left uncropped. The value is either a string
* "left", "right", "top", "bottom", "auto", or "center" (the default),
* or an object {x, y} containing focal point coordinates in the original
* image expressed as fractions ranging from 0.0 (top or left) to 1.0
* (bottom or right), 0.5 being the center. {fit: "cover", gravity: "top"} will
* crop bottom or left and right sides as necessary, but wont crop anything
* from the top. {fit: "cover", gravity: {x:0.5, y:0.2}} will crop each side to
* preserve as much as possible around a point at 20% of the height of the
* source image.
*/
gravity?: 'face' | 'left' | 'right' | 'top' | 'bottom' | 'center' | 'auto' | 'entropy' | BasicImageTransformationsGravityCoordinates;
/**
* Specifies how closely the image is cropped toward detected faces when combined
* with the gravity=face option. Accepts a valid range between 0.0 (includes as much
* of the background as possible) and 1.0 (crops the image as closely to the face as
* possible). The default is 0.
*/
zoom?: number;
/**
* Resizing mode as a string. It affects interpretation of width and height
* options:
* - scale-down: Similar to contain, but the image is never enlarged. If
* the image is larger than given width or height, it will be resized.
* Otherwise its original size will be kept.
* - scale-up: Similar to contain, but the image is never shrunk. If the
* image is smaller than the given width or height, it will be resized.
* Otherwise its original size will be kept.
* - contain: Resizes to maximum size that fits within the given width and
* height. If only a single dimension is given (e.g. only width), the
* image will be shrunk or enlarged to exactly match that dimension.
* Aspect ratio is always preserved.
* - cover: Resizes (shrinks or enlarges) to fill the entire area of width
* and height. If the image has an aspect ratio different from the ratio
* of width and height, it will be cropped to fit.
* - crop: The image will be shrunk and cropped to fit within the area
* specified by width and height. The image will not be enlarged. For images
* smaller than the given dimensions it's the same as scale-down. For
* images larger than the given dimensions, it's the same as cover.
* See also trim.
* - pad: Resizes to the maximum size that fits within the given width and
* height, and then fills the remaining area with a background color
* (white by default). Use of this mode is not recommended, as the same
* effect can be more efficiently achieved with the contain mode and the
* CSS object-fit: contain property.
* - squeeze: Stretches and deforms to the width and height given, even if it
* breaks aspect ratio
*/
fit?: "scale-down" | "scale-up" | "contain" | "cover" | "crop" | "pad" | "squeeze";
/**
* Allows you to trim your image. Takes dpr into account and is performed before
* resizing or rotation.
@@ -9199,6 +11389,154 @@ interface RequestInitCfPropertiesImage extends BasicImageTransformations {
keep?: number;
};
};
/**
* Background color to add underneath the image. Applies only to images with
* transparency (such as PNG). Accepts any CSS color (#RRGGBB, rgba(),
* hsl(), etc.)
*/
background?: string;
/**
* Flips the images horizontally, vertically, or both. Flipping is applied before
* rotation, so if you apply flip=h,rotate=90 then the image will be flipped
* horizontally, then rotated by 90 degrees.
*/
flip?: 'h' | 'v' | 'hv';
/**
* Number of degrees (90, 180, 270) to rotate the image by. width and height
* options refer to axes after rotation.
*/
rotate?: 0 | 90 | 180 | 270 | 360;
/**
* Strength of sharpening filter to apply to the image. Floating-point
* number between 0 (no sharpening, default) and 10 (maximum). 1.0 is a
* recommended value for downscaled images.
*/
sharpen?: number;
/**
* Radius of a blur filter (approximate gaussian). Maximum supported radius
* is 250.
*/
blur?: number;
/**
* Increase contrast by a factor. A value of 1.0 equals no change, a value of
* 0.5 equals low contrast, and a value of 2.0 equals high contrast. 0 is
* ignored.
*/
contrast?: number;
/**
* Increase brightness by a factor. A value of 1.0 equals no change, a value
* of 0.5 equals half brightness, and a value of 2.0 equals twice as bright.
* 0 is ignored.
*/
brightness?: number;
/**
* Increase exposure by a factor. A value of 1.0 equals no change, a value of
* 0.5 darkens the image, and a value of 2.0 lightens the image. 0 is ignored.
*/
gamma?: number;
/**
* Increase contrast by a factor. A value of 1.0 equals no change, a value of
* 0.5 equals low contrast, and a value of 2.0 equals high contrast. 0 is
* ignored.
*/
saturation?: number;
/**
* Device Pixel Ratio. Default 1. Multiplier for width/height that makes it
* easier to specify higher-DPI sizes in <img srcset>.
*/
dpr?: number;
/**
* Adds a border around the image. The border is added after resizing. Border
* width takes dpr into account, and can be specified either using a single
* width property, or individually for each side.
*/
border?: {
color: string;
width: number;
} | {
color: string;
top: number;
right: number;
bottom: number;
left: number;
};
/**
* Image segmentation using artificial intelligence models. Sets pixels not
* within selected segment area to transparent e.g "foreground" sets every
* background pixel as transparent.
*/
segment?: "foreground";
/**
* Controls the algorithm used when an image needs to be enlarged. This
* parameter works with any fit mode that upscales, such as `contain`,
* `cover`, and `scale-up`. It has no effect when `fit=scale-down` or when
* the target dimensions are smaller than the source.
* - interpolate: Uses bicubic interpolation, which may reduce image quality.
* This is the default behavior when `upscale` is not specified.
* - generate: Uses AI upscaling to produce sharper, more detailed results
* when enlarging images.
*/
upscale?: "interpolate" | "generate";
}
interface BasicImageTransformationsGravityCoordinates {
x?: number;
y?: number;
mode?: 'remainder' | 'box-center';
}
interface RequestInitCfPropertiesImageDraw extends BasicImageTransformations {
/**
* Absolute URL of the image file to use for the drawing. It can be any of
* the supported file formats. For drawing of watermarks or non-rectangular
* overlays we recommend using PNG or WebP images.
*/
url: string;
/**
* Floating-point number between 0 (transparent) and 1 (opaque).
* For example, opacity: 0.5 makes overlay semitransparent.
*/
opacity?: number;
/**
* - If set to true, the overlay image will be tiled to cover the entire
* area. This is useful for stock-photo-like watermarks.
* - If set to "x", the overlay image will be tiled horizontally only
* (form a line).
* - If set to "y", the overlay image will be tiled vertically only
* (form a line).
*/
repeat?: true | "x" | "y";
/**
* How to combine the foreground and backdrop pixels to create the result
*/
composite?:
/** Foreground drawn on top of backdrop (default) */
'over'
/** Foreground shown only where backdrop is opaque */
| 'in'
/** Foreground drawn on top, but clipped to the backdrop's shape */
| 'atop'
/** Foreground shown only where backdrop is transparent */
| 'out'
/** Foreground and backdrop visible only where the other is not */
| 'xor'
/** Foreground and backdrop channels added (brightening) */
| 'lighter';
/**
* Position of the overlay image relative to a given edge. Each property is
* an offset in pixels. 0 aligns exactly to the edge. For example, left: 10
* positions left side of the overlay 10 pixels from the left edge of the
* image it's drawn over. bottom: 0 aligns bottom of the overlay with bottom
* of the background image.
*
* Setting both left & right, or both top & bottom is an error.
*
* If no position is specified, the image will be centered.
*/
top?: number;
left?: number;
bottom?: number;
right?: number;
}
interface RequestInitCfPropertiesImage extends BasicImageTransformations {
/**
* Quality setting from 1-100 (useful values are in 60-90 range). Lower values
* make images look worse, but load faster. The default is 85. It applies only
@@ -9240,17 +11578,6 @@ interface RequestInitCfPropertiesImage extends BasicImageTransformations {
* output formats always discard metadata.
*/
metadata?: "keep" | "copyright" | "none";
/**
* Strength of sharpening filter to apply to the image. Floating-point
* number between 0 (no sharpening, default) and 10 (maximum). 1.0 is a
* recommended value for downscaled images.
*/
sharpen?: number;
/**
* Radius of a blur filter (approximate gaussian). Maximum supported radius
* is 250.
*/
blur?: number;
/**
* Overlays are drawn in the order they appear in the array (last array
* entry is the topmost layer).
@@ -9262,50 +11589,6 @@ interface RequestInitCfPropertiesImage extends BasicImageTransformations {
* the origin.
*/
"origin-auth"?: "share-publicly";
/**
* Adds a border around the image. The border is added after resizing. Border
* width takes dpr into account, and can be specified either using a single
* width property, or individually for each side.
*/
border?: {
color: string;
width: number;
} | {
color: string;
top: number;
right: number;
bottom: number;
left: number;
};
/**
* Increase brightness by a factor. A value of 1.0 equals no change, a value
* of 0.5 equals half brightness, and a value of 2.0 equals twice as bright.
* 0 is ignored.
*/
brightness?: number;
/**
* Increase contrast by a factor. A value of 1.0 equals no change, a value of
* 0.5 equals low contrast, and a value of 2.0 equals high contrast. 0 is
* ignored.
*/
contrast?: number;
/**
* Increase exposure by a factor. A value of 1.0 equals no change, a value of
* 0.5 darkens the image, and a value of 2.0 lightens the image. 0 is ignored.
*/
gamma?: number;
/**
* Increase contrast by a factor. A value of 1.0 equals no change, a value of
* 0.5 equals low contrast, and a value of 2.0 equals high contrast. 0 is
* ignored.
*/
saturation?: number;
/**
* Flips the images horizontally, vertically, or both. Flipping is applied before
* rotation, so if you apply flip=h,rotate=90 then the image will be flipped
* horizontally, then rotated by 90 degrees.
*/
flip?: 'h' | 'v' | 'hv';
/**
* Slightly reduces latency on a cache miss by selecting a
* quickest-to-compress file format, at a cost of increased file size and
@@ -9686,6 +11969,32 @@ interface IncomingRequestCfPropertiesTLSClientAuth {
* @example "Dec 22 19:39:00 2018 GMT"
*/
certNotAfter: string;
/**
* The client leaf certificate in [RFC 9440](https://www.rfc-editor.org/rfc/rfc9440)
* format (`:base64-DER:`). Empty if no client certificate was presented or if
* the leaf certificate exceeded 10 KB (see {@link certRFC9440TooLarge}).
*
* Suitable for forwarding to an origin via the `Client-Cert` HTTP header.
*/
certRFC9440: string;
/**
* `true` if the leaf certificate exceeded 10 KB and was omitted from
* {@link certRFC9440}.
*/
certRFC9440TooLarge: boolean;
/**
* The intermediate certificate chain in [RFC 9440](https://www.rfc-editor.org/rfc/rfc9440)
* format as a comma-separated list. Empty if no intermediates were sent or
* if the chain exceeded 16 KB (see {@link certChainRFC9440TooLarge}).
*
* Suitable for forwarding to an origin via the `Client-Cert-Chain` HTTP header.
*/
certChainRFC9440: string;
/**
* `true` if the intermediate chain exceeded 16 KB and was omitted from
* {@link certChainRFC9440}.
*/
certChainRFC9440TooLarge: boolean;
}
/** Placeholder values for TLS Client Authorization */
interface IncomingRequestCfPropertiesTLSClientAuthPlaceholder {
@@ -9706,6 +12015,10 @@ interface IncomingRequestCfPropertiesTLSClientAuthPlaceholder {
certFingerprintSHA256: "";
certNotBefore: "";
certNotAfter: "";
certRFC9440: "";
certRFC9440TooLarge: false;
certChainRFC9440: "";
certChainRFC9440TooLarge: false;
}
/** Possible outcomes of TLS verification */
declare type CertVerificationStatus =
@@ -9920,11 +12233,11 @@ interface SendEmail {
send(message: EmailMessage): Promise<EmailSendResult>;
send(builder: {
from: string | EmailAddress;
to: string | string[];
to: string | EmailAddress | (string | EmailAddress)[];
subject: string;
replyTo?: string | EmailAddress;
cc?: string | string[];
bcc?: string | string[];
cc?: string | EmailAddress | (string | EmailAddress)[];
bcc?: string | EmailAddress | (string | EmailAddress)[];
headers?: Record<string, string>;
text?: string;
html?: string;
@@ -9942,6 +12255,105 @@ declare module "cloudflare:email" {
};
export { _EmailMessage as EmailMessage };
}
/**
* Evaluation context for targeting rules.
* Keys are attribute names (e.g. "userId", "country"), values are the attribute values.
*/
type FlagshipEvaluationContext = Record<string, string | number | boolean>;
interface FlagshipEvaluationDetails<T> {
flagKey: string;
value: T;
variant?: string | undefined;
reason?: string | undefined;
errorCode?: string | undefined;
errorMessage?: string | undefined;
}
interface FlagshipEvaluationError extends Error {
}
/**
* Feature flags binding for evaluating feature flags from a Cloudflare Workers script.
*
* @example
* ```typescript
* // Get a boolean flag value with a default
* const enabled = await env.FLAGS.getBooleanValue('my-feature', false);
*
* // Get a flag value with evaluation context for targeting
* const variant = await env.FLAGS.getStringValue('experiment', 'control', {
* userId: 'user-123',
* country: 'US',
* });
*
* // Get full evaluation details including variant and reason
* const details = await env.FLAGS.getBooleanDetails('my-feature', false);
* console.log(details.variant, details.reason);
* ```
*/
declare abstract class Flagship {
/**
* Get a flag value without type checking.
* @param flagKey The key of the flag to evaluate.
* @param defaultValue Optional default value returned when evaluation fails.
* @param context Optional evaluation context for targeting rules.
*/
get(flagKey: string, defaultValue?: unknown, context?: FlagshipEvaluationContext): Promise<unknown>;
/**
* Get a boolean flag value.
* @param flagKey The key of the flag to evaluate.
* @param defaultValue Default value returned when evaluation fails or the flag type does not match.
* @param context Optional evaluation context for targeting rules.
*/
getBooleanValue(flagKey: string, defaultValue: boolean, context?: FlagshipEvaluationContext): Promise<boolean>;
/**
* Get a string flag value.
* @param flagKey The key of the flag to evaluate.
* @param defaultValue Default value returned when evaluation fails or the flag type does not match.
* @param context Optional evaluation context for targeting rules.
*/
getStringValue(flagKey: string, defaultValue: string, context?: FlagshipEvaluationContext): Promise<string>;
/**
* Get a number flag value.
* @param flagKey The key of the flag to evaluate.
* @param defaultValue Default value returned when evaluation fails or the flag type does not match.
* @param context Optional evaluation context for targeting rules.
*/
getNumberValue(flagKey: string, defaultValue: number, context?: FlagshipEvaluationContext): Promise<number>;
/**
* Get an object flag value.
* @param flagKey The key of the flag to evaluate.
* @param defaultValue Default value returned when evaluation fails or the flag type does not match.
* @param context Optional evaluation context for targeting rules.
*/
getObjectValue<T extends object>(flagKey: string, defaultValue: T, context?: FlagshipEvaluationContext): Promise<T>;
/**
* Get a boolean flag value with full evaluation details.
* @param flagKey The key of the flag to evaluate.
* @param defaultValue Default value returned when evaluation fails or the flag type does not match.
* @param context Optional evaluation context for targeting rules.
*/
getBooleanDetails(flagKey: string, defaultValue: boolean, context?: FlagshipEvaluationContext): Promise<FlagshipEvaluationDetails<boolean>>;
/**
* Get a string flag value with full evaluation details.
* @param flagKey The key of the flag to evaluate.
* @param defaultValue Default value returned when evaluation fails or the flag type does not match.
* @param context Optional evaluation context for targeting rules.
*/
getStringDetails(flagKey: string, defaultValue: string, context?: FlagshipEvaluationContext): Promise<FlagshipEvaluationDetails<string>>;
/**
* Get a number flag value with full evaluation details.
* @param flagKey The key of the flag to evaluate.
* @param defaultValue Default value returned when evaluation fails or the flag type does not match.
* @param context Optional evaluation context for targeting rules.
*/
getNumberDetails(flagKey: string, defaultValue: number, context?: FlagshipEvaluationContext): Promise<FlagshipEvaluationDetails<number>>;
/**
* Get an object flag value with full evaluation details.
* @param flagKey The key of the flag to evaluate.
* @param defaultValue Default value returned when evaluation fails or the flag type does not match.
* @param context Optional evaluation context for targeting rules.
*/
getObjectDetails<T extends object>(flagKey: string, defaultValue: T, context?: FlagshipEvaluationContext): Promise<FlagshipEvaluationDetails<T>>;
}
/**
* Hello World binding to serve as an explanatory example. DO NOT USE
*/
@@ -10061,11 +12473,25 @@ type ImageTransform = {
type ImageDrawOptions = {
opacity?: number;
repeat?: boolean | string;
composite?: ImageCompositeMode;
top?: number;
left?: number;
bottom?: number;
right?: number;
};
type ImageCompositeMode =
/** Foreground drawn on top of backdrop (default) */
'over'
/** Foreground shown only where backdrop is opaque */
| 'in'
/** Foreground drawn on top, but clipped to the backdrop's shape */
| 'atop'
/** Foreground shown only where backdrop is transparent */
| 'out'
/** Foreground and backdrop visible only where the other is not */
| 'xor'
/** Foreground and backdrop channels added (brightening) */
| 'lighter';
type ImageInputOptions = {
encoding?: 'base64';
};
@@ -10109,19 +12535,37 @@ interface ImageList {
cursor?: string;
listComplete: boolean;
}
interface HostedImagesBinding {
interface ImageHandle {
/**
* Get detailed metadata for a hosted image
* @param imageId The ID of the image (UUID or custom ID)
* Get metadata for a hosted image
* @returns Image metadata, or null if not found
*/
details(imageId: string): Promise<ImageMetadata | null>;
details(): Promise<ImageMetadata | null>;
/**
* Get the raw image data for a hosted image
* @param imageId The ID of the image (UUID or custom ID)
* @returns ReadableStream of image bytes, or null if not found
*/
image(imageId: string): Promise<ReadableStream<Uint8Array> | null>;
bytes(): Promise<ReadableStream<Uint8Array> | null>;
/**
* Update hosted image metadata
* @param options Properties to update
* @returns Updated image metadata
* @throws {@link ImagesError} if update fails
*/
update(options: ImageUpdateOptions): Promise<ImageMetadata>;
/**
* Delete a hosted image
* @returns True if deleted, false if not found
*/
delete(): Promise<boolean>;
}
interface HostedImagesBinding {
/**
* Get a handle for a hosted image
* @param imageId The ID of the image (UUID or custom ID)
* @returns A handle for per-image operations
*/
image(imageId: string): ImageHandle;
/**
* Upload a new hosted image
* @param image The image file to upload
@@ -10130,20 +12574,6 @@ interface HostedImagesBinding {
* @throws {@link ImagesError} if upload fails
*/
upload(image: ReadableStream<Uint8Array> | ArrayBuffer, options?: ImageUploadOptions): Promise<ImageMetadata>;
/**
* Update hosted image metadata
* @param imageId The ID of the image
* @param options Properties to update
* @returns Updated image metadata
* @throws {@link ImagesError} if update fails
*/
update(imageId: string, options: ImageUpdateOptions): Promise<ImageMetadata>;
/**
* Delete a hosted image
* @param imageId The ID of the image
* @returns True if deleted, false if not found
*/
delete(imageId: string): Promise<boolean>;
/**
* List hosted images with pagination
* @param options List configuration
@@ -10611,7 +13041,8 @@ declare namespace CloudflareWorkersModule {
constructor(ctx: ExecutionContext, env: Env);
email?(message: ForwardableEmailMessage): void | Promise<void>;
fetch?(request: Request): Response | Promise<Response>;
queue?(batch: MessageBatch<unknown>): void | Promise<void>;
connect?(socket: Socket): void | Promise<void>;
queue?(batch: MessageBatch): void | Promise<void>;
scheduled?(controller: ScheduledController): void | Promise<void>;
tail?(events: TraceItem[]): void | Promise<void>;
tailStream?(event: TailStream.TailEvent<TailStream.Onset>): TailStream.TailEventHandlerType | Promise<TailStream.TailEventHandlerType>;
@@ -10625,6 +13056,7 @@ declare namespace CloudflareWorkersModule {
constructor(ctx: DurableObjectState, env: Env);
alarm?(alarmInfo?: AlarmInvocationInfo): void | Promise<void>;
fetch?(request: Request): Response | Promise<Response>;
connect?(socket: Socket): void | Promise<void>;
webSocketMessage?(ws: WebSocket, message: string | ArrayBuffer): void | Promise<void>;
webSocketClose?(ws: WebSocket, code: number, reason: string, wasClean: boolean): void | Promise<void>;
webSocketError?(ws: WebSocket, error: unknown): void | Promise<void>;
@@ -10635,6 +13067,7 @@ declare namespace CloudflareWorkersModule {
export type WorkflowTimeoutDuration = WorkflowSleepDuration;
export type WorkflowRetentionDuration = WorkflowSleepDuration;
export type WorkflowBackoff = 'constant' | 'linear' | 'exponential';
export type WorkflowStepSensitivity = 'output';
export type WorkflowStepConfig = {
retries?: {
limit: number;
@@ -10642,23 +13075,51 @@ declare namespace CloudflareWorkersModule {
backoff?: WorkflowBackoff;
};
timeout?: WorkflowTimeoutDuration | number;
sensitive?: WorkflowStepSensitivity;
};
export type WorkflowStepRollbackConfig = Pick<WorkflowStepConfig, 'retries' | 'timeout'>;
export type WorkflowCronSchedule = {
/** Cron expression that triggered this event. */
cron: string;
/** Timestamp of the scheduled trigger, in milliseconds since the Unix epoch. */
scheduledTime: number;
};
export type WorkflowEvent<T> = {
payload: Readonly<T>;
timestamp: Date;
instanceId: string;
workflowName: string;
schedule?: WorkflowCronSchedule;
};
export type WorkflowStepEvent<T> = {
payload: Readonly<T>;
timestamp: Date;
type: string;
sensitive?: WorkflowStepSensitivity;
};
export type WorkflowStepContext = {
step: {
name: string;
count: number;
};
attempt: number;
config: WorkflowStepConfig;
};
export type WorkflowRollbackContext<T = unknown> = {
ctx: WorkflowStepContext;
error: Error;
output: T | undefined;
/** @deprecated Use `ctx.step.name` and `ctx.step.count` instead. */
stepName: string;
};
export type WorkflowRollbackHandler<T = unknown> = (ctx: WorkflowRollbackContext<T>) => Promise<void>;
export type WorkflowStepRollbackOptions<T = unknown> = {
rollback: WorkflowRollbackHandler<T>;
rollbackConfig?: WorkflowStepRollbackConfig;
};
export abstract class WorkflowStep {
do<T extends Rpc.Serializable<T>>(name: string, callback: (ctx: WorkflowStepContext) => Promise<T>): Promise<T>;
do<T extends Rpc.Serializable<T>>(name: string, config: WorkflowStepConfig, callback: (ctx: WorkflowStepContext) => Promise<T>): Promise<T>;
do<T extends Rpc.Serializable<T>>(name: string, callback: (ctx: WorkflowStepContext) => Promise<T>, rollbackOptions?: WorkflowStepRollbackOptions<T>): Promise<T>;
do<T extends Rpc.Serializable<T>>(name: string, config: WorkflowStepConfig, callback: (ctx: WorkflowStepContext) => Promise<T>, rollbackOptions?: WorkflowStepRollbackOptions<T>): Promise<T>;
sleep: (name: string, duration: WorkflowSleepDuration) => Promise<void>;
sleepUntil: (name: string, timestamp: Date | number) => Promise<void>;
waitForEvent<T extends Rpc.Serializable<T>>(name: string, options: {
@@ -10680,6 +13141,8 @@ declare namespace CloudflareWorkersModule {
export function withEnvAndExports(newEnv: unknown, newExports: unknown, fn: () => unknown): unknown;
export const env: Cloudflare.Env;
export const exports: Cloudflare.Exports;
export const cache: CacheContext;
export const tracing: Tracing;
}
declare module 'cloudflare:workers' {
export = CloudflareWorkersModule;
@@ -10724,17 +13187,6 @@ interface StreamBinding {
* @returns A handle for per-video operations.
*/
video(id: string): StreamVideoHandle;
/**
* Uploads a new video from a File.
* @param file The video file to upload.
* @returns The uploaded video details.
* @throws {BadRequestError} if the upload parameter is invalid
* @throws {QuotaReachedError} if the account storage capacity is exceeded
* @throws {MaxFileSizeError} if the file size is too large
* @throws {RateLimitedError} if the server received too many requests
* @throws {InternalError} if an unexpected error occurs
*/
upload(file: File): Promise<StreamVideo>;
/**
* Uploads a new video from a provided URL.
* @param url The URL to upload from.
@@ -11069,14 +13521,13 @@ interface StreamScopedCaptions {
* Uploads the caption or subtitle file to the endpoint for a specific BCP47 language.
* One caption or subtitle file per language is allowed.
* @param language The BCP 47 language tag for the caption or subtitle.
* @param file The caption or subtitle file to upload.
* @param input The caption or subtitle stream to upload.
* @returns The created caption entry.
* @throws {NotFoundError} if the video is not found
* @throws {BadRequestError} if the language or file is invalid
* @throws {MaxFileSizeError} if the file size is too large
* @throws {InternalError} if an unexpected error occurs
*/
upload(language: string, file: File): Promise<StreamCaption>;
upload(language: string, input: ReadableStream): Promise<StreamCaption>;
/**
* Generate captions or subtitles for the provided language via AI.
* @param language The BCP 47 language tag to generate.
@@ -11150,16 +13601,15 @@ interface StreamVideos {
interface StreamWatermarks {
/**
* Generate a new watermark profile
* @param file The image file to upload
* @param input The image stream to upload
* @param params The watermark creation parameters.
* @returns The created watermark profile.
* @throws {BadRequestError} if the parameters are invalid
* @throws {InvalidURLError} if the URL is invalid
* @throws {MaxFileSizeError} if the file size is too large
* @throws {TooManyWatermarksError} if the number of allowed watermarks is reached
* @throws {InternalError} if an unexpected error occurs
*/
generate(file: File, params: StreamWatermarkCreateParams): Promise<StreamWatermark>;
generate(input: ReadableStream, params: StreamWatermarkCreateParams): Promise<StreamWatermark>;
/**
* Generate a new watermark profile
* @param url The image url to upload
@@ -11167,7 +13617,6 @@ interface StreamWatermarks {
* @returns The created watermark profile.
* @throws {BadRequestError} if the parameters are invalid
* @throws {InvalidURLError} if the URL is invalid
* @throws {MaxFileSizeError} if the file size is too large
* @throws {TooManyWatermarksError} if the number of allowed watermarks is reached
* @throws {InternalError} if an unexpected error occurs
*/
@@ -11558,12 +14007,20 @@ declare namespace TailStream {
readonly type: "fetch";
readonly statusCode: number;
}
type EventOutcome = "ok" | "canceled" | "exception" | "unknown" | "killSwitch" | "daemonDown" | "exceededCpu" | "exceededMemory" | "loadShed" | "responseStreamDisconnected" | "scriptNotFound";
interface ConnectEventInfo {
readonly type: "connect";
}
type EventOutcome = "ok" | "canceled" | "exception" | "unknown" | "killSwitch" | "daemonDown" | "exceededCpu" | "exceededMemory" | "loadShed" | "responseStreamDisconnected" | "scriptNotFound" | "internalError" | "exceededWallTime";
interface ScriptVersion {
readonly id: string;
readonly tag?: string;
readonly message?: string;
}
interface TracePreviewInfo {
readonly id: string;
readonly slug: string;
readonly name: string;
}
interface Onset {
readonly type: "onset";
readonly attributes: Attribute[];
@@ -11575,7 +14032,8 @@ declare namespace TailStream {
readonly scriptName?: string;
readonly scriptTags?: string[];
readonly scriptVersion?: ScriptVersion;
readonly info: FetchEventInfo | JsRpcEventInfo | ScheduledEventInfo | AlarmEventInfo | QueueEventInfo | EmailEventInfo | TraceEventInfo | HibernatableWebSocketEventInfo | CustomEventInfo;
readonly preview?: TracePreviewInfo;
readonly info: FetchEventInfo | ConnectEventInfo | JsRpcEventInfo | ScheduledEventInfo | AlarmEventInfo | QueueEventInfo | EmailEventInfo | TraceEventInfo | HibernatableWebSocketEventInfo | CustomEventInfo;
}
interface Outcome {
readonly type: "outcome";
@@ -11651,6 +14109,9 @@ declare namespace TailStream {
// 1. This is an Onset event
// 2. We are not inheriting any SpanContext. (e.g. this is a cross-account service binding or a new top-level invocation)
readonly spanId?: string;
// W3C trace flags from an upstream traceparent. Absent when no upstream
// sampling decision was made.
readonly traceFlags?: number;
}
interface TailEvent<Event extends EventType> {
// invocation id of the currently invoked worker stage.
@@ -11924,6 +14385,103 @@ type WorkerVersionMetadata = {
/** The timestamp of when the Worker Version was uploaded */
timestamp: string;
};
// ============ Web Search Request Types ============
/**
* Options for a Web Search query.
*/
type WebSearchSearchOptions = {
/** The search query. */
query: string;
/**
* Maximum number of results to return. Defaults to 10, capped at 20.
* The actual count may be lower if fewer matches exist.
*/
limit?: number;
};
// ============ Web Search Response Types ============
/**
* A single Web Search result.
*
* Web Search is discovery-only -- results carry catalog metadata about a page
* but never the page body. To read a result's content the caller invokes the
* global `fetch()` API against the result's `url`, at which point the
* destination's own access controls apply (including Cloudflare Pay-per-Crawl).
*/
type WebSearchResult = {
/** Canonical URL. */
url: string;
/** Page title. */
title: string;
/** Page-level description. May be absent. */
description?: string;
/**
* Last-modified date for the page, when known. Naive (no timezone)
* ISO-8601 datetime, e.g. `"2025-11-30T04:39:48"`.
*/
lastModifiedDate?: string;
/**
* Page meta image URL (typically the `og:image`). May be absent.
*/
imageUrl?: string;
/** Optional favicon URL for UI hints. */
faviconUrl?: string;
};
/**
* Per-response metadata for a Web Search query. Carries operational
* fields useful for support and debugging.
*/
type WebSearchResponseMetadata = {
/** The query that was executed. */
query: string;
/** Opaque request identifier used for support and debugging. */
requestId: string;
/** End-to-end latency for this search request, in milliseconds. */
latencyMs: number;
};
/**
* Response from a Web Search query.
*/
type WebSearchSearchResponse = {
items: WebSearchResult[];
metadata: WebSearchResponseMetadata;
};
// ============ Web Search Binding Class ============
/**
* Cloudflare Web Search binding.
*
* Discovery-only primitive for agents and Workers. Returns URLs and catalog
* metadata for a query; never returns page content or excerpts. To read a
* result's body, fetch the URL with the global `fetch()` API.
*
* Declared in wrangler with a single object (there is exactly one corpus, the
* public web, so there is no name, namespace, or instance to specify):
*
* ```jsonc
* { "web_search": { "binding": "WEBSEARCH" } }
* ```
*
* @example
* ```ts
* const { items, metadata } = await env.WEBSEARCH.search({
* query: "Cloudflare Workers",
* });
*
* const top = items[0];
* console.log(top.url, top.title, metadata.latencyMs);
*
* // Read content yourself; pay-per-crawl and other publisher
* // controls apply at the fetch site, not at search time.
* const page = await fetch(top.url);
* ```
*/
declare abstract class WebSearch {
/**
* Run a Web Search query.
* @param options Search options. Only `query` is required.
* @returns The matching results plus per-response metadata.
*/
search(options: WebSearchSearchOptions): Promise<WebSearchSearchResponse>;
}
interface DynamicDispatchLimits {
/**
* Limit CPU time in milliseconds.
@@ -12025,6 +14583,27 @@ interface WorkflowError {
code?: number;
message: string;
}
interface WorkflowInstanceRestartOptions {
/**
* Restart from a specific step. If omitted, the instance restarts from the beginning.
* The step must exist in the instance's execution history.
*/
from?: {
/**
* The step name as defined in your workflow code.
*/
name: string;
/**
* 1-indexed occurrence of this step name. Use when the same step name appears multiple times (e.g. in a loop).
* @default 1
*/
count?: number;
/**
* Step type filter. Use when different step types share the same name.
*/
type?: 'do' | 'sleep' | 'waitForEvent';
};
}
declare abstract class WorkflowInstance {
public id: string;
/**
@@ -12040,9 +14619,11 @@ declare abstract class WorkflowInstance {
*/
public terminate(): Promise<void>;
/**
* Restart the instance.
* Restart the instance. Optionally restart from a specific step, preserving
* cached results for all steps before it.
* @param options Options for the restart, including an optional step to restart from.
*/
public restart(): Promise<void>;
public restart(options?: WorkflowInstanceRestartOptions): Promise<void>;
/**
* Returns the current status of the instance.
*/