[{"data":1,"prerenderedAt":3080},["ShallowReactive",2],{"navigation_docs":3,"docs-navigation-with-icons":419,"-docs-api-media":561,"-docs-api-media-surround":3075},[4,66,87,124,405],{"title":5,"path":6,"stem":7,"children":8,"page":65},"Api","\u002Fdocs\u002Fapi","docs\u002Fapi",[9,13,17,21,25,29,33,37,41,45,49,53,57,61],{"title":10,"path":11,"stem":12},"Best Practices","\u002Fdocs\u002Fapi\u002Fbest-practices","docs\u002Fapi\u002Fbest-practices",{"title":14,"path":15,"stem":16},"Blog","\u002Fdocs\u002Fapi\u002Fblog","docs\u002Fapi\u002Fblog",{"title":18,"path":19,"stem":20},"Code Examples","\u002Fdocs\u002Fapi\u002Fcode-examples","docs\u002Fapi\u002Fcode-examples",{"title":22,"path":23,"stem":24},"Collections","\u002Fdocs\u002Fapi\u002Fcollections","docs\u002Fapi\u002Fcollections",{"title":26,"path":27,"stem":28},"Field Types","\u002Fdocs\u002Fapi\u002Ffield-types","docs\u002Fapi\u002Ffield-types",{"title":30,"path":31,"stem":32},"Rate Limits & Errors","\u002Fdocs\u002Fapi\u002Flimits-and-errors","docs\u002Fapi\u002Flimits-and-errors",{"title":34,"path":35,"stem":36},"Media","\u002Fdocs\u002Fapi\u002Fmedia","docs\u002Fapi\u002Fmedia",{"title":38,"path":39,"stem":40},"Overview","\u002Fdocs\u002Fapi\u002Foverview","docs\u002Fapi\u002Foverview",{"title":42,"path":43,"stem":44},"Pages","\u002Fdocs\u002Fapi\u002Fpages","docs\u002Fapi\u002Fpages",{"title":46,"path":47,"stem":48},"Query Parameters","\u002Fdocs\u002Fapi\u002Fquery-parameters","docs\u002Fapi\u002Fquery-parameters",{"title":50,"path":51,"stem":52},"Responses & Caching","\u002Fdocs\u002Fapi\u002Fresponses","docs\u002Fapi\u002Fresponses",{"title":54,"path":55,"stem":56},"Troubleshooting","\u002Fdocs\u002Fapi\u002Ftroubleshooting","docs\u002Fapi\u002Ftroubleshooting",{"title":58,"path":59,"stem":60},"Validation","\u002Fdocs\u002Fapi\u002Fvalidation","docs\u002Fapi\u002Fvalidation",{"title":62,"path":63,"stem":64},"Webhooks","\u002Fdocs\u002Fapi\u002Fwebhooks","docs\u002Fapi\u002Fwebhooks",false,{"title":67,"path":68,"stem":69,"children":70,"page":65},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002Fgetting-started",[71,75,79,83],{"title":72,"path":73,"stem":74},"Authentication","\u002Fdocs\u002Fgetting-started\u002Fauthentication","docs\u002Fgetting-started\u002Fauthentication",{"title":76,"path":77,"stem":78},"Introduction","\u002Fdocs\u002Fgetting-started\u002Fintroduction","docs\u002Fgetting-started\u002Fintroduction",{"title":80,"path":81,"stem":82},"Quickstart","\u002Fdocs\u002Fgetting-started\u002Fquickstart","docs\u002Fgetting-started\u002Fquickstart",{"title":84,"path":85,"stem":86},"Write Operations","\u002Fdocs\u002Fgetting-started\u002Fwrite-operations","docs\u002Fgetting-started\u002Fwrite-operations",{"title":88,"path":89,"stem":90,"children":91,"page":65},"Guides","\u002Fdocs\u002Fguides","docs\u002Fguides",[92,96,100,104,108,112,116,120],{"title":93,"path":94,"stem":95},"Admin Interface","\u002Fdocs\u002Fguides\u002Fadmin-interface","docs\u002Fguides\u002Fadmin-interface",{"title":97,"path":98,"stem":99},"ButterCMS Migration","\u002Fdocs\u002Fguides\u002Fbuttercms-migration","docs\u002Fguides\u002Fbuttercms-migration",{"title":101,"path":102,"stem":103},"Migrations","\u002Fdocs\u002Fguides\u002Fmigrations","docs\u002Fguides\u002Fmigrations",{"title":105,"path":106,"stem":107},"Page Management","\u002Fdocs\u002Fguides\u002Fpage-management","docs\u002Fguides\u002Fpage-management",{"title":109,"path":110,"stem":111},"Public API Usage","\u002Fdocs\u002Fguides\u002Fpublic-api-usage","docs\u002Fguides\u002Fpublic-api-usage",{"title":113,"path":114,"stem":115},"Schema Builder","\u002Fdocs\u002Fguides\u002Fschema-builder","docs\u002Fguides\u002Fschema-builder",{"title":117,"path":118,"stem":119},"User Management","\u002Fdocs\u002Fguides\u002Fuser-management","docs\u002Fguides\u002Fuser-management",{"title":121,"path":122,"stem":123},"Rich Text Editor","\u002Fdocs\u002Fguides\u002Fwysiwyg-editor","docs\u002Fguides\u002Fwysiwyg-editor",{"title":125,"path":126,"stem":127,"children":128,"page":65},"Sdk","\u002Fdocs\u002Fsdk","docs\u002Fsdk",[129,132,136,140,144],{"title":38,"path":130,"stem":131},"\u002Fdocs\u002Fsdk\u002Freadme","docs\u002Fsdk\u002FREADME",{"title":133,"path":134,"stem":135},"Astro","\u002Fdocs\u002Fsdk\u002Fastro","docs\u002Fsdk\u002Fastro",{"title":137,"path":138,"stem":139},"Next.js","\u002Fdocs\u002Fsdk\u002Fnextjs","docs\u002Fsdk\u002Fnextjs",{"title":141,"path":142,"stem":143},"Nuxt","\u002Fdocs\u002Fsdk\u002Fnuxt","docs\u002Fsdk\u002Fnuxt",{"title":145,"path":146,"stem":147,"children":148,"page":65},"Reference","\u002Fdocs\u002Fsdk\u002Freference","docs\u002Fsdk\u002Freference",[149,153,222,235,380],{"title":150,"path":151,"stem":152},"@tentocms\u002Fclient","\u002Fdocs\u002Fsdk\u002Freference\u002Freadme","docs\u002Fsdk\u002Freference\u002FREADME",{"title":154,"path":155,"stem":156,"children":157,"page":65},"Classes","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses","docs\u002Fsdk\u002Freference\u002Fclasses",[158,162,166,170,174,178,182,186,190,194,198,202,206,210,214,218],{"title":159,"path":160,"stem":161},"Class: BlogCategoriesResource","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Fblogcategoriesresource","docs\u002Fsdk\u002Freference\u002Fclasses\u002FBlogCategoriesResource",{"title":163,"path":164,"stem":165},"Class: BlogPostsResource","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Fblogpostsresource","docs\u002Fsdk\u002Freference\u002Fclasses\u002FBlogPostsResource",{"title":167,"path":168,"stem":169},"Class: BlogResource","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Fblogresource","docs\u002Fsdk\u002Freference\u002Fclasses\u002FBlogResource",{"title":171,"path":172,"stem":173},"Class: BlogTagsResource","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Fblogtagsresource","docs\u002Fsdk\u002Freference\u002Fclasses\u002FBlogTagsResource",{"title":175,"path":176,"stem":177},"Class: CollectionsResource","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Fcollectionsresource","docs\u002Fsdk\u002Freference\u002Fclasses\u002FCollectionsResource",{"title":179,"path":180,"stem":181},"Class: CollectionsWriteResource","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Fcollectionswriteresource","docs\u002Fsdk\u002Freference\u002Fclasses\u002FCollectionsWriteResource",{"title":183,"path":184,"stem":185},"Class: MediaResource","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Fmediaresource","docs\u002Fsdk\u002Freference\u002Fclasses\u002FMediaResource",{"title":187,"path":188,"stem":189},"Class: MediaWriteResource","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Fmediawriteresource","docs\u002Fsdk\u002Freference\u002Fclasses\u002FMediaWriteResource",{"title":191,"path":192,"stem":193},"Class: PagesResource","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Fpagesresource","docs\u002Fsdk\u002Freference\u002Fclasses\u002FPagesResource",{"title":195,"path":196,"stem":197},"Class: PagesWriteResource","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Fpageswriteresource","docs\u002Fsdk\u002Freference\u002Fclasses\u002FPagesWriteResource",{"title":199,"path":200,"stem":201},"Class: TentoAuthenticationError","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Ftentoauthenticationerror","docs\u002Fsdk\u002Freference\u002Fclasses\u002FTentoAuthenticationError",{"title":203,"path":204,"stem":205},"Class: TentoClient","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Ftentoclient","docs\u002Fsdk\u002Freference\u002Fclasses\u002FTentoClient",{"title":207,"path":208,"stem":209},"Class: TentoError","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Ftentoerror","docs\u002Fsdk\u002Freference\u002Fclasses\u002FTentoError",{"title":211,"path":212,"stem":213},"Class: TentoNetworkError","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Ftentonetworkerror","docs\u002Fsdk\u002Freference\u002Fclasses\u002FTentoNetworkError",{"title":215,"path":216,"stem":217},"Class: TentoNotFoundError","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Ftentonotfounderror","docs\u002Fsdk\u002Freference\u002Fclasses\u002FTentoNotFoundError",{"title":219,"path":220,"stem":221},"Class: TentoRateLimitError","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Ftentoratelimiterror","docs\u002Fsdk\u002Freference\u002Fclasses\u002FTentoRateLimitError",{"title":223,"path":224,"stem":225,"children":226,"page":65},"Functions","\u002Fdocs\u002Fsdk\u002Freference\u002Ffunctions","docs\u002Fsdk\u002Freference\u002Ffunctions",[227,231],{"title":228,"path":229,"stem":230},"Function: getUrl()","\u002Fdocs\u002Fsdk\u002Freference\u002Ffunctions\u002Fgeturl","docs\u002Fsdk\u002Freference\u002Ffunctions\u002FgetUrl",{"title":232,"path":233,"stem":234},"Function: mockMedia()","\u002Fdocs\u002Fsdk\u002Freference\u002Ffunctions\u002Fmockmedia","docs\u002Fsdk\u002Freference\u002Ffunctions\u002FmockMedia",{"title":236,"path":237,"stem":238,"children":239,"page":65},"Interfaces","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces","docs\u002Fsdk\u002Freference\u002Finterfaces",[240,244,248,252,256,260,264,268,272,276,280,284,288,292,296,300,304,308,312,316,320,324,328,332,336,340,344,348,352,356,360,364,368,372,376],{"title":241,"path":242,"stem":243},"Interface: BlogAuthor","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fblogauthor","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FBlogAuthor",{"title":245,"path":246,"stem":247},"Interface: BlogCategory","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fblogcategory","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FBlogCategory",{"title":249,"path":250,"stem":251},"Interface: BlogPost","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fblogpost","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FBlogPost",{"title":253,"path":254,"stem":255},"Interface: BlogPostListOptions","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fblogpostlistoptions","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FBlogPostListOptions",{"title":257,"path":258,"stem":259},"Interface: BlogTag","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fblogtag","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FBlogTag",{"title":261,"path":262,"stem":263},"Interface: CollectionItemResponse\u003CT>","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fcollectionitemresponse","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FCollectionItemResponse",{"title":265,"path":266,"stem":267},"Interface: CollectionListOptions","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fcollectionlistoptions","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FCollectionListOptions",{"title":269,"path":270,"stem":271},"Interface: CollectionListResponse\u003CT>","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fcollectionlistresponse","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FCollectionListResponse",{"title":273,"path":274,"stem":275},"Interface: CollectionTypeMeta","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fcollectiontypemeta","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FCollectionTypeMeta",{"title":277,"path":278,"stem":279},"Interface: CreateCollectionItemInput","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fcreatecollectioniteminput","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FCreateCollectionItemInput",{"title":281,"path":282,"stem":283},"Interface: CreatePageInput","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fcreatepageinput","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FCreatePageInput",{"title":285,"path":286,"stem":287},"Interface: DryRunResult","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fdryrunresult","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FDryRunResult",{"title":289,"path":290,"stem":291},"Interface: FilterCondition","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Ffiltercondition","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FFilterCondition",{"title":293,"path":294,"stem":295},"Interface: ItemResponse\u003CT>","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fitemresponse","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FItemResponse",{"title":297,"path":298,"stem":299},"Interface: ListResponse\u003CT>","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Flistresponse","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FListResponse",{"title":301,"path":302,"stem":303},"Interface: Media","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fmedia","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FMedia",{"title":305,"path":306,"stem":307},"Interface: MediaItem","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fmediaitem","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FMediaItem",{"title":309,"path":310,"stem":311},"Interface: MediaOption","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fmediaoption","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FMediaOption",{"title":313,"path":314,"stem":315},"Interface: MediaTransformOptions","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fmediatransformoptions","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FMediaTransformOptions",{"title":317,"path":318,"stem":319},"Interface: Page\u003CTContent>","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fpage","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FPage",{"title":321,"path":322,"stem":323},"Interface: PageGetOptions","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fpagegetoptions","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FPageGetOptions",{"title":325,"path":326,"stem":327},"Interface: PageListOptions","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fpagelistoptions","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FPageListOptions",{"title":329,"path":330,"stem":331},"Interface: PageWithRedirect\u003CTContent>","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fpagewithredirect","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FPageWithRedirect",{"title":333,"path":334,"stem":335},"Interface: PaginationMeta","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fpaginationmeta","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FPaginationMeta",{"title":337,"path":338,"stem":339},"Interface: PreviewOption","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fpreviewoption","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FPreviewOption",{"title":341,"path":342,"stem":343},"Interface: RedirectInfo","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fredirectinfo","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FRedirectInfo",{"title":345,"path":346,"stem":347},"Interface: RefTypesOption","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Freftypesoption","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FRefTypesOption",{"title":349,"path":350,"stem":351},"Interface: SeoMetadata","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fseometadata","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FSeoMetadata",{"title":353,"path":354,"stem":355},"Interface: TentoClientConfig","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Ftentoclientconfig","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FTentoClientConfig",{"title":357,"path":358,"stem":359},"Interface: TentoMedia","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Ftentomedia","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FTentoMedia",{"title":361,"path":362,"stem":363},"Interface: UpdateCollectionItemInput","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fupdatecollectioniteminput","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FUpdateCollectionItemInput",{"title":365,"path":366,"stem":367},"Interface: UpdatePageInput","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fupdatepageinput","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FUpdatePageInput",{"title":369,"path":370,"stem":371},"Interface: UploadMediaInput","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fuploadmediainput","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FUploadMediaInput",{"title":373,"path":374,"stem":375},"Interface: WriteCollectionItem","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fwritecollectionitem","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FWriteCollectionItem",{"title":377,"path":378,"stem":379},"Interface: WritePage","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fwritepage","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FWritePage",{"title":381,"path":382,"stem":383,"children":384,"page":65},"Type Aliases","\u002Fdocs\u002Fsdk\u002Freference\u002Ftype-aliases","docs\u002Fsdk\u002Freference\u002Ftype-aliases",[385,389,393,397,401],{"title":386,"path":387,"stem":388},"Type Alias: BlogPostListItem","\u002Fdocs\u002Fsdk\u002Freference\u002Ftype-aliases\u002Fblogpostlistitem","docs\u002Fsdk\u002Freference\u002Ftype-aliases\u002FBlogPostListItem",{"title":390,"path":391,"stem":392},"Type Alias: BlogPostListResponse","\u002Fdocs\u002Fsdk\u002Freference\u002Ftype-aliases\u002Fblogpostlistresponse","docs\u002Fsdk\u002Freference\u002Ftype-aliases\u002FBlogPostListResponse",{"title":394,"path":395,"stem":396},"Type Alias: CollectionItem\u003CTContent>","\u002Fdocs\u002Fsdk\u002Freference\u002Ftype-aliases\u002Fcollectionitem","docs\u002Fsdk\u002Freference\u002Ftype-aliases\u002FCollectionItem",{"title":398,"path":399,"stem":400},"Type Alias: FilterOperator","\u002Fdocs\u002Fsdk\u002Freference\u002Ftype-aliases\u002Ffilteroperator","docs\u002Fsdk\u002Freference\u002Ftype-aliases\u002FFilterOperator",{"title":402,"path":403,"stem":404},"Type Alias: MediaMode","\u002Fdocs\u002Fsdk\u002Freference\u002Ftype-aliases\u002Fmediamode","docs\u002Fsdk\u002Freference\u002Ftype-aliases\u002FMediaMode",{"title":406,"path":407,"stem":408,"children":409,"page":65},"Typegen","\u002Fdocs\u002Ftypegen","docs\u002Ftypegen",[410,413,416],{"title":133,"path":411,"stem":412},"\u002Fdocs\u002Ftypegen\u002Fastro","docs\u002Ftypegen\u002Fastro",{"title":137,"path":414,"stem":415},"\u002Fdocs\u002Ftypegen\u002Fnextjs","docs\u002Ftypegen\u002Fnextjs",{"title":141,"path":417,"stem":418},"\u002Fdocs\u002Ftypegen\u002Fnuxt","docs\u002Ftypegen\u002Fnuxt",[420,450,460,478,556],{"title":5,"path":6,"stem":7,"children":421,"page":65},[422,424,426,428,430,432,434,436,438,440,442,444,446,448],{"title":10,"path":11,"stem":12,"icon":423},"i-lucide-sparkles",{"title":14,"path":15,"stem":16,"icon":425},"i-lucide-newspaper",{"title":18,"path":19,"stem":20,"icon":427},"i-lucide-terminal",{"title":22,"path":23,"stem":24,"icon":429},"i-lucide-layers",{"title":26,"path":27,"stem":28,"icon":431},"i-lucide-type",{"title":30,"path":31,"stem":32,"icon":433},"i-lucide-triangle-alert",{"title":34,"path":35,"stem":36,"icon":435},"i-lucide-image",{"title":38,"path":39,"stem":40,"icon":437},"i-lucide-map",{"title":42,"path":43,"stem":44,"icon":439},"i-lucide-file-text",{"title":46,"path":47,"stem":48,"icon":441},"i-lucide-sliders-horizontal",{"title":50,"path":51,"stem":52,"icon":443},"i-lucide-braces",{"title":54,"path":55,"stem":56,"icon":445},"i-lucide-wrench",{"title":58,"path":59,"stem":60,"icon":447},"i-lucide-shield-check",{"title":62,"path":63,"stem":64,"icon":449},"i-lucide-webhook",{"title":67,"path":68,"stem":69,"children":451,"page":65},[452,454,456,458],{"title":72,"path":73,"stem":74,"icon":453},"i-lucide-key-round",{"title":76,"path":77,"stem":78,"icon":455},"i-lucide-compass",{"title":80,"path":81,"stem":82,"icon":457},"i-lucide-rocket",{"title":84,"path":85,"stem":86,"icon":459},"i-lucide-pencil",{"title":88,"path":89,"stem":90,"children":461,"page":65},[462,464,466,468,470,472,474,476],{"title":93,"path":94,"stem":95,"icon":463},"i-lucide-layout-dashboard",{"title":97,"path":98,"stem":99,"icon":465},"i-lucide-package",{"title":101,"path":102,"stem":103,"icon":467},"i-lucide-git-branch",{"title":105,"path":106,"stem":107,"icon":469},"i-lucide-files",{"title":109,"path":110,"stem":111,"icon":471},"i-lucide-plug-zap",{"title":113,"path":114,"stem":115,"icon":473},"i-lucide-wand",{"title":117,"path":118,"stem":119,"icon":475},"i-lucide-users",{"title":121,"path":122,"stem":123,"icon":477},"i-lucide-pilcrow",{"title":125,"path":126,"stem":127,"children":479,"page":65},[480,481,482,484,486],{"title":38,"path":130,"stem":131,"icon":465},{"title":133,"path":134,"stem":135,"icon":457},{"title":137,"path":138,"stem":139,"icon":483},"i-lucide-triangle",{"title":141,"path":142,"stem":143,"icon":485},"i-lucide-hexagon",{"title":145,"path":146,"stem":147,"children":487,"page":65},[488,490,508,512,549],{"title":150,"path":151,"stem":152,"icon":489},null,{"title":154,"path":155,"stem":156,"children":491,"page":65},[492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507],{"title":159,"path":160,"stem":161,"icon":489},{"title":163,"path":164,"stem":165,"icon":489},{"title":167,"path":168,"stem":169,"icon":489},{"title":171,"path":172,"stem":173,"icon":489},{"title":175,"path":176,"stem":177,"icon":489},{"title":179,"path":180,"stem":181,"icon":489},{"title":183,"path":184,"stem":185,"icon":489},{"title":187,"path":188,"stem":189,"icon":489},{"title":191,"path":192,"stem":193,"icon":489},{"title":195,"path":196,"stem":197,"icon":489},{"title":199,"path":200,"stem":201,"icon":489},{"title":203,"path":204,"stem":205,"icon":489},{"title":207,"path":208,"stem":209,"icon":489},{"title":211,"path":212,"stem":213,"icon":489},{"title":215,"path":216,"stem":217,"icon":489},{"title":219,"path":220,"stem":221,"icon":489},{"title":223,"path":224,"stem":225,"children":509,"page":65},[510,511],{"title":228,"path":229,"stem":230,"icon":489},{"title":232,"path":233,"stem":234,"icon":489},{"title":236,"path":237,"stem":238,"children":513,"page":65},[514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548],{"title":241,"path":242,"stem":243,"icon":489},{"title":245,"path":246,"stem":247,"icon":489},{"title":249,"path":250,"stem":251,"icon":489},{"title":253,"path":254,"stem":255,"icon":489},{"title":257,"path":258,"stem":259,"icon":489},{"title":261,"path":262,"stem":263,"icon":489},{"title":265,"path":266,"stem":267,"icon":489},{"title":269,"path":270,"stem":271,"icon":489},{"title":273,"path":274,"stem":275,"icon":489},{"title":277,"path":278,"stem":279,"icon":489},{"title":281,"path":282,"stem":283,"icon":489},{"title":285,"path":286,"stem":287,"icon":489},{"title":289,"path":290,"stem":291,"icon":489},{"title":293,"path":294,"stem":295,"icon":489},{"title":297,"path":298,"stem":299,"icon":489},{"title":301,"path":302,"stem":303,"icon":489},{"title":305,"path":306,"stem":307,"icon":489},{"title":309,"path":310,"stem":311,"icon":489},{"title":313,"path":314,"stem":315,"icon":489},{"title":317,"path":318,"stem":319,"icon":489},{"title":321,"path":322,"stem":323,"icon":489},{"title":325,"path":326,"stem":327,"icon":489},{"title":329,"path":330,"stem":331,"icon":489},{"title":333,"path":334,"stem":335,"icon":489},{"title":337,"path":338,"stem":339,"icon":489},{"title":341,"path":342,"stem":343,"icon":489},{"title":345,"path":346,"stem":347,"icon":489},{"title":349,"path":350,"stem":351,"icon":489},{"title":353,"path":354,"stem":355,"icon":489},{"title":357,"path":358,"stem":359,"icon":489},{"title":361,"path":362,"stem":363,"icon":489},{"title":365,"path":366,"stem":367,"icon":489},{"title":369,"path":370,"stem":371,"icon":489},{"title":373,"path":374,"stem":375,"icon":489},{"title":377,"path":378,"stem":379,"icon":489},{"title":381,"path":382,"stem":383,"children":550,"page":65},[551,552,553,554,555],{"title":386,"path":387,"stem":388,"icon":489},{"title":390,"path":391,"stem":392,"icon":489},{"title":394,"path":395,"stem":396,"icon":489},{"title":398,"path":399,"stem":400,"icon":489},{"title":402,"path":403,"stem":404,"icon":489},{"title":406,"path":407,"stem":408,"children":557,"page":65},[558,559,560],{"title":133,"path":411,"stem":412,"icon":457},{"title":137,"path":414,"stem":415,"icon":483},{"title":141,"path":417,"stem":418,"icon":485},{"id":562,"title":34,"body":563,"description":3070,"extension":3071,"icon":435,"links":489,"meta":3072,"navigation":1960,"path":35,"seo":3073,"stem":36,"__hash__":3074},"docs\u002Fdocs\u002Fapi\u002Fmedia.md",{"type":564,"value":565,"toc":3045},"minimark",[566,585,594,597,601,609,614,630,639,641,645,690,692,695,708,719,724,726,729,733,736,757,762,828,832,839,966,971,996,1000,1005,1015,1020,1026,1057,1062,1068,1073,1079,1083,1088,1094,1117,1123,1127,1141,1185,1192,1196,1223,1227,1233,1325,1334,1337,1373,1375,1378,1382,1389,1578,1608,1611,1614,1824,1828,1831,1909,1918,1922,1925,2009,2011,2014,2018,2021,2086,2090,2223,2227,2232,2242,2248,2250,2253,2256,2301,2312,2314,2317,2321,2326,2329,2625,2630,2633,2729,2734,2737,2871,2875,2880,2883,2938,2943,2945,2949,2952,2998,3003,3026,3029,3041],[567,568,569,573,574,577,578,582,584],"p",{},[570,571,572],"strong",{},"Version",": 1.0\n",[570,575,576],{},"Base URL",": ",[579,580,581],"code",{},"\u002Fapi\u002Fv1",[570,583,72],{},": Not required for public media serving",[567,586,587,588,593],{},"For uploading and managing media (admin), see the ",[589,590,592],"a",{"href":591},"..\u002F..\u002Fadmin-api\u002Fmedia","Media Admin API",".",[595,596],"hr",{},[598,599,38],"h2",{"id":600},"overview",[567,602,603,604,608],{},"The public Media endpoint serves media assets — images, documents, and videos — over a fast, CDN-cached URL, with optional on-the-fly image transformations. Serving requires no authentication; isolation relies on the URL being unguessable (UUID filenames), not on server-side validation of the project ID against the requester. See ",[589,605,607],{"href":606},"#security-considerations","Security Considerations"," for details.",[567,610,611],{},[570,612,613],{},"Key Features:",[615,616,617,621,624,627],"ul",{},[618,619,620],"li",{},"Serve media publicly with image transformations",[618,622,623],{},"Cloudflare R2 storage backend",[618,625,626],{},"Cloudflare Image Resizing integration",[618,628,629],{},"1-year immutable cache for optimal performance",[567,631,632,633,636,637,593],{},"To ",[570,634,635],{},"upload, organise, update, or delete"," media (all of which require an authenticated admin session), see the ",[589,638,592],{"href":591},[595,640],{},[598,642,644],{"id":643},"table-of-contents","Table of Contents",[646,647,648,653,667,673,679,685],"ol",{},[618,649,650],{},[589,651,72],{"href":652},"#authentication",[618,654,655,659],{},[589,656,658],{"href":657},"#public-endpoints","Public Endpoints",[615,660,661],{},[618,662,663],{},[589,664,666],{"href":665},"#get-mediaprojectidfilename","Serve Media File",[618,668,669],{},[589,670,672],{"href":671},"#data-models","Data Models",[618,674,675],{},[589,676,678],{"href":677},"#error-handling","Error Handling",[618,680,681],{},[589,682,684],{"href":683},"#rate-limiting","Rate Limiting",[618,686,687],{},[589,688,10],{"href":689},"#best-practices",[595,691],{},[598,693,72],{"id":694},"authentication",[567,696,697,698,701,702,705,706,608],{},"The public media serving endpoint (",[579,699,700],{},"GET \u002Fmedia\u002F:projectId\u002F:filename",") requires ",[570,703,704],{},"no authentication"," — anyone with the URL can retrieve the file. The project ID embedded in the URL is used as-is to build the tenant-prefixed R2 key, with no cross-check against an authenticated session or API key; isolation instead relies on UUID-based filenames being unguessable, which prevents URL enumeration. See ",[589,707,607],{"href":606},[567,709,710,711,714,715,608],{},"For the rest of the public content API (fetching pages, collections, and their resolved media), requests are authenticated with an ",[570,712,713],{},"API key",". See the ",[589,716,718],{"href":717},".\u002Foverview","Public REST API",[567,720,721,722,593],{},"Admin media operations (upload, update, move, delete) use session-cookie authentication and are documented separately in the ",[589,723,592],{"href":591},[595,725],{},[598,727,658],{"id":728},"public-endpoints",[730,731,700],"h3",{"id":732},"get-mediaprojectidfilename",[567,734,735],{},"Serve a media file publicly with optional image transformations.",[567,737,738,740,741,577,744,747,748,752,753,756],{},[570,739,72],{},": Not required\n",[570,742,743],{},"Rate Limit",[570,745,746],{},"no per-key in-Worker limit"," — this endpoint is unauthenticated, so there is no API key to key a limit on. It is covered only by the coarse per-IP Cloudflare WAF backstop (live since 2026-07-13); Cloudflare's CDN cache further reduces how often requests reach the origin. Figures: ",[589,749,751],{"href":750},".\u002Flimits-and-errors","Limits & Errors",". This matches the per-endpoint breakdown under ",[589,754,755],{"href":683},"Rate limiting"," below.",[758,759,761],"h4",{"id":760},"path-parameters","Path Parameters",[763,764,765,784],"table",{},[766,767,768],"thead",{},[769,770,771,775,778,781],"tr",{},[772,773,774],"th",{},"Parameter",[772,776,777],{},"Type",[772,779,780],{},"Required",[772,782,783],{},"Description",[785,786,787,814],"tbody",{},[769,788,789,795,798,801],{},[790,791,792],"td",{},[579,793,794],{},"projectId",[790,796,797],{},"string",[790,799,800],{},"Yes",[790,802,803,804,807,808,811,812,593],{},"Project UUID; used as-is to build the R2 key (",[579,805,806],{},"projectId\u002Ffilename",") — ",[570,809,810],{},"not"," cross-checked against any session or API key. See ",[589,813,607],{"href":606},[769,815,816,821,823,825],{},[790,817,818],{},[579,819,820],{},"filename",[790,822,797],{},[790,824,800],{},[790,826,827],{},"Generated filename (from R2 key)",[758,829,831],{"id":830},"query-parameters-image-transformations","Query Parameters (Image Transformations)",[567,833,834,835,838],{},"Only apply to image files (",[579,836,837],{},"image\u002F*"," MIME types). Non-images ignore transform params.",[763,840,841,854],{},[766,842,843],{},[769,844,845,847,849,851],{},[772,846,774],{},[772,848,777],{},[772,850,783],{},[772,852,853],{},"Example Values",[785,855,856,878,897,923,943],{},[769,857,858,863,866,869],{},[790,859,860],{},[579,861,862],{},"width",[790,864,865],{},"number",[790,867,868],{},"Target width in pixels",[790,870,871,874,875],{},[579,872,873],{},"800",", ",[579,876,877],{},"1200",[769,879,880,885,887,890],{},[790,881,882],{},[579,883,884],{},"height",[790,886,865],{},[790,888,889],{},"Target height in pixels",[790,891,892,874,895],{},[579,893,894],{},"600",[579,896,873],{},[769,898,899,904,906,909],{},[790,900,901],{},[579,902,903],{},"fit",[790,905,797],{},[790,907,908],{},"Resize fit mode",[790,910,911,874,914,874,917,874,920],{},[579,912,913],{},"contain",[579,915,916],{},"cover",[579,918,919],{},"crop",[579,921,922],{},"scale-down",[769,924,925,930,932,935],{},[790,926,927],{},[579,928,929],{},"quality",[790,931,865],{},[790,933,934],{},"Image quality (1-100)",[790,936,937,874,940],{},[579,938,939],{},"80",[579,941,942],{},"90",[769,944,945,950,952,955],{},[790,946,947],{},[579,948,949],{},"format",[790,951,797],{},[790,953,954],{},"Output format",[790,956,957,874,960,874,963],{},[579,958,959],{},"webp",[579,961,962],{},"avif",[579,964,965],{},"auto",[567,967,968],{},[570,969,970],{},"Fit Modes:",[615,972,973,978,983,988],{},[618,974,975,977],{},[570,976,913],{},": Preserve aspect ratio, image fits within dimensions (may have whitespace)",[618,979,980,982],{},[570,981,916],{},": Preserve aspect ratio, fills dimensions (may crop)",[618,984,985,987],{},[570,986,919],{},": Crop to exact dimensions",[618,989,990,992,993,995],{},[570,991,922],{},": Like ",[579,994,913],{}," but never upscale",[758,997,999],{"id":998},"request-examples","Request Examples",[567,1001,1002],{},[570,1003,1004],{},"Original image:",[1006,1007,1012],"pre",{"className":1008,"code":1010,"language":1011},[1009],"language-text","https:\u002F\u002Fcms.example.com\u002Fapi\u002Fv1\u002Fmedia\u002Ftenant-slug\u002Fabc123-def456.jpg\n","text",[579,1013,1010],{"__ignoreMap":1014},"",[567,1016,1017],{},[570,1018,1019],{},"Thumbnail (200x200 cover crop):",[1006,1021,1024],{"className":1022,"code":1023,"language":1011},[1009],"https:\u002F\u002Fcms.example.com\u002Fapi\u002Fv1\u002Fmedia\u002Ftenant-slug\u002Fabc123-def456.jpg?width=200&height=200&fit=cover\n",[579,1025,1023],{"__ignoreMap":1014},[1027,1028,1029],"blockquote",{},[567,1030,1031,1034,1035,1037,1038,1041,1042,1044,1045,1047,1048,1051,1052,1056],{},[570,1032,1033],{},"Note",": This does ",[570,1036,810],{}," preserve the original ",[579,1039,1040],{},".jpg"," format. Supplying any transform parameter without an explicit ",[579,1043,949],{}," still re-encodes the output — the default output format is ",[579,1046,959],{},", not the source format. Pass ",[579,1049,1050],{},"&format=avif"," for AVIF, or see ",[589,1053,1055],{"href":1054},"#cloudflare-image-resizing","Fallback"," below for when the original bytes are served unchanged.",[567,1058,1059],{},[570,1060,1061],{},"Responsive image (800px wide, WebP):",[1006,1063,1066],{"className":1064,"code":1065,"language":1011},[1009],"https:\u002F\u002Fcms.example.com\u002Fapi\u002Fv1\u002Fmedia\u002Ftenant-slug\u002Fabc123-def456.jpg?width=800&format=webp&quality=85\n",[579,1067,1065],{"__ignoreMap":1014},[567,1069,1070],{},[570,1071,1072],{},"Hero image (1920px, scale-down, AVIF):",[1006,1074,1077],{"className":1075,"code":1076,"language":1011},[1009],"https:\u002F\u002Fcms.example.com\u002Fapi\u002Fv1\u002Fmedia\u002Ftenant-slug\u002Fabc123-def456.jpg?width=1920&fit=scale-down&format=avif\n",[579,1078,1076],{"__ignoreMap":1014},[758,1080,1082],{"id":1081},"response-200-ok","Response (200 OK)",[567,1084,1085],{},[570,1086,1087],{},"Headers (untransformed \u002F fallback path — no transform params, or a non-image file):",[1006,1089,1092],{"className":1090,"code":1091,"language":1011},[1009],"Content-Type: image\u002Fjpeg\nCache-Control: public, max-age=31536000\nETag: \"\u003Cr2-object-etag>\"\n",[579,1093,1091],{"__ignoreMap":1014},[567,1095,1096,1099,1100,1103,1104,1107,1108,1114,1115,593],{},[570,1097,1098],{},"Headers (successfully transformed image):"," the Cloudflare Images binding's own response headers are passed through, with ",[579,1101,1102],{},"Cache-Control"," overridden to ",[579,1105,1106],{},"public, max-age=31536000",". ",[570,1109,1110,1113],{},[579,1111,1112],{},"ETag"," is not guaranteed on this path"," — the binding does not necessarily emit one, so don't rely on it for conditional requests against transformed URLs. Only the untransformed\u002Ffallback response above is guaranteed to carry the R2 object's ",[579,1116,1112],{},[567,1118,1119,1122],{},[570,1120,1121],{},"Body",": Binary image data (original or transformed)",[758,1124,1126],{"id":1125},"cloudflare-image-resizing","Cloudflare Image Resizing",[567,1128,1129,1130,874,1132,874,1134,874,1136,874,1138,1140],{},"If transform params (",[579,1131,862],{},[579,1133,884],{},[579,1135,903],{},[579,1137,929],{},[579,1139,949],{},") are present on an image request:",[646,1142,1143,1173,1176,1182],{},[618,1144,1145,1146,1149,1150,1153,1154,1157,1158,1161,1162,1165,1166,1168,1169,1172],{},"The Worker reads the file's bytes from R2 and passes them to the ",[570,1147,1148],{},"Cloudflare Images binding"," (",[579,1151,1152],{},"env.IMAGES.input(...).transform(...).output(...)",") — not by setting a ",[579,1155,1156],{},"cf: { image }"," option on the ",[579,1159,1160],{},"Response"," object. The code's own comment calls out that ",[579,1163,1164],{},"cf.image"," on a ",[579,1167,1160],{}," is a documented no-op; it only has an effect on a ",[579,1170,1171],{},"fetch()"," subrequest, which this route doesn't make.",[618,1174,1175],{},"The binding transforms the image bytes directly and returns the result.",[618,1177,1178,1179,1181],{},"Cloudflare's CDN caches the resulting response at edge locations (via the ",[579,1180,1102],{}," header above).",[618,1183,1184],{},"Subsequent requests for the same transformed URL are served from cache.",[567,1186,1187,1189,1190,593],{},[570,1188,1055],{},": If the Images binding throws (e.g. unsupported input), the original, untransformed bytes are served instead (graceful degradation) — this response uses the plain R2 headers shown above, including ",[579,1191,1112],{},[758,1193,1195],{"id":1194},"caching-behavior","Caching Behavior",[615,1197,1198,1205,1211,1217],{},[618,1199,1200,577,1202,1204],{},[570,1201,1102],{},[579,1203,1106],{}," (1 year)",[618,1206,1207,1210],{},[570,1208,1209],{},"Immutable content",": Generated filenames (UUIDs) never change",[618,1212,1213,1216],{},[570,1214,1215],{},"Cache invalidation",": Not needed (UUID ensures unique URLs)",[618,1218,1219,1222],{},[570,1220,1221],{},"Cloudflare CDN",": Caches at edge locations globally",[758,1224,1226],{"id":1225},"error-responses","Error Responses",[567,1228,1229,1232],{},[570,1230,1231],{},"404 Not Found"," - Media doesn't exist or tenant mismatch",[1006,1234,1238],{"className":1235,"code":1236,"language":1237,"meta":1014,"style":1014},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"Media not found\"\n  }\n}\n","json",[579,1239,1240,1249,1268,1293,1313,1319],{"__ignoreMap":1014},[1241,1242,1245],"span",{"class":1243,"line":1244},"line",1,[1241,1246,1248],{"class":1247},"sMK4o","{\n",[1241,1250,1252,1255,1259,1262,1265],{"class":1243,"line":1251},2,[1241,1253,1254],{"class":1247},"  \"",[1241,1256,1258],{"class":1257},"spNyl","error",[1241,1260,1261],{"class":1247},"\"",[1241,1263,1264],{"class":1247},":",[1241,1266,1267],{"class":1247}," {\n",[1241,1269,1271,1274,1277,1279,1281,1284,1288,1290],{"class":1243,"line":1270},3,[1241,1272,1273],{"class":1247},"    \"",[1241,1275,579],{"class":1276},"sBMFI",[1241,1278,1261],{"class":1247},[1241,1280,1264],{"class":1247},[1241,1282,1283],{"class":1247}," \"",[1241,1285,1287],{"class":1286},"sfazB","NOT_FOUND",[1241,1289,1261],{"class":1247},[1241,1291,1292],{"class":1247},",\n",[1241,1294,1296,1298,1301,1303,1305,1307,1310],{"class":1243,"line":1295},4,[1241,1297,1273],{"class":1247},[1241,1299,1300],{"class":1276},"message",[1241,1302,1261],{"class":1247},[1241,1304,1264],{"class":1247},[1241,1306,1283],{"class":1247},[1241,1308,1309],{"class":1286},"Media not found",[1241,1311,1312],{"class":1247},"\"\n",[1241,1314,1316],{"class":1243,"line":1315},5,[1241,1317,1318],{"class":1247},"  }\n",[1241,1320,1322],{"class":1243,"line":1321},6,[1241,1323,1324],{"class":1247},"}\n",[567,1326,1327,1329,1330,1333],{},[570,1328,1033],{},": No authentication required means anyone with the URL can access media. Isolation relies on the URL being unguessable (UUID filename), not on server-side validation of ",[579,1331,1332],{},":projectId"," against the requester.",[758,1335,607],{"id":1336},"security-considerations",[615,1338,1339,1351,1357,1363],{},[618,1340,1341,1344,1345,1347,1348,1350],{},[570,1342,1343],{},"Tenant Isolation",": R2 key is ",[579,1346,806],{}," — the URL's ",[579,1349,1332],{}," segment is used as-is to build the key, with no cross-check against an authenticated session",[618,1352,1353,1356],{},[570,1354,1355],{},"URL Enumeration",": UUID filenames prevent guessing",[618,1358,1359,1362],{},[570,1360,1361],{},"No Directory Listing",": R2 bucket not publicly browsable",[618,1364,1365,1368,1369,1372],{},[570,1366,1367],{},"Content-Type",": Set correctly to prevent execution (e.g., SVG as ",[579,1370,1371],{},"image\u002Fsvg+xml",")",[595,1374],{},[598,1376,672],{"id":1377},"data-models",[730,1379,1381],{"id":1380},"media-shapes-by-context-read-this-first","Media shapes by context (read this first)",[567,1383,1384,1385,1388],{},"Media is represented ",[570,1386,1387],{},"two different ways"," depending on where you get it. Mixing them up is a\ncommon migration snag:",[763,1390,1391,1414],{},[766,1392,1393],{},[769,1394,1395,1398,1401,1404,1411],{},[772,1396,1397],{},"Context",[772,1399,1400],{},"Shape",[772,1402,1403],{},"Key fields",[772,1405,1406,1407,1410],{},"Has ",[579,1408,1409],{},"id","?",[772,1412,1413],{},"Notes",[785,1415,1416,1492],{},[769,1417,1418,1427,1433,1453,1458],{},[790,1419,1420,1423,1424],{},[570,1421,1422],{},"Inline media"," resolved inside page\u002Fcollection ",[570,1425,1426],{},"content",[790,1428,1429,1432],{},[579,1430,1431],{},"TentoMedia"," (underscore-prefixed)",[790,1434,1435,874,1438,874,1441,874,1444,874,1447,874,1450],{},[579,1436,1437],{},"_url",[579,1439,1440],{},"_filename",[579,1442,1443],{},"_mimeType",[579,1445,1446],{},"_width?",[579,1448,1449],{},"_height?",[579,1451,1452],{},"_altText?",[790,1454,1455],{},[570,1456,1457],{},"No",[790,1459,1460,1461,1464,1465,1468,1469,1472,1473,1483,1484,1487,1488,1491],{},"Use ",[579,1462,1463],{},"client.media.transformUrl(_url, …)"," for transforms — there's no id. ",[579,1466,1467],{},"_altText"," is ",[570,1470,1471],{},"omitted when unset","; ",[570,1474,1475,1476,1479,1480],{},"SVGs omit ",[579,1477,1478],{},"_width","\u002F",[579,1481,1482],{},"_height",". An empty image field can come back as ",[579,1485,1486],{},"\"\""," (so a field is ",[579,1489,1490],{},"TentoMedia | \"\" | undefined",").",[769,1493,1494,1505,1510,1546,1550],{},[790,1495,1496,1501,1502],{},[570,1497,1498],{},[579,1499,1500],{},"GET \u002Fapi\u002Fv1\u002Fmedia\u002F:id"," (metadata) and ",[570,1503,1504],{},"admin list\u002Fget",[790,1506,1507,1509],{},[579,1508,34],{}," (non-underscore)",[790,1511,1512,874,1514,874,1516,874,1519,874,1522,874,1525,874,1528,874,1531,874,1534,874,1537,874,1540,874,1543],{},[579,1513,1409],{},[579,1515,820],{},[579,1517,1518],{},"originalFilename",[579,1520,1521],{},"mimeType",[579,1523,1524],{},"size",[579,1526,1527],{},"width?",[579,1529,1530],{},"height?",[579,1532,1533],{},"altText?",[579,1535,1536],{},"folder?",[579,1538,1539],{},"url",[579,1541,1542],{},"createdAt",[579,1544,1545],{},"updatedAt",[790,1547,1548],{},[570,1549,800],{},[790,1551,1552,1553,1557,1558,1561,1562,1565,1566,1569,1570,1573,1574,1577],{},"Render from the returned ",[570,1554,1555],{},[579,1556,1539],{}," (it points at the served bytes and carries any transform params); fetch it via ",[579,1559,1560],{},"client.media.getById(id)",". Note: ",[579,1563,1564],{},"\u002Fapi\u002Fv1\u002Fmedia\u002F:id"," returns ",[570,1567,1568],{},"JSON metadata, not image bytes"," — don't point an ",[579,1571,1572],{},"\u003Cimg src>"," at it (or at ",[579,1575,1576],{},"getImageUrl(id)",") directly.",[567,1579,1580,1581,1583,1584,1149,1586,1588,1589,1592,1593,1595,1596,874,1598,1600,1601,1479,1603,1479,1605,1607],{},"So: in ",[570,1582,1426],{},", code against ",[579,1585,1431],{},[579,1587,1437],{},", no id); from the ",[570,1590,1591],{},"media API",", code against the ",[579,1594,34],{}," object (",[579,1597,1409],{},[579,1599,1539],{},"). Don't expect ",[579,1602,1467],{},[579,1604,1478],{},[579,1606,1482],{}," to always be present on inline media.",[730,1609,34],{"id":1610},"media",[567,1612,1613],{},"Complete media object returned by API endpoints.",[1006,1615,1619],{"className":1616,"code":1617,"language":1618,"meta":1014,"style":1014},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","interface Media {\n  id: string                \u002F\u002F UUID\n  projectId: string          \u002F\u002F Project UUID\n  filename: string          \u002F\u002F Generated filename (UUID + ext)\n  originalFilename: string  \u002F\u002F User's original filename\n  mimeType: string          \u002F\u002F MIME type (e.g., \"image\u002Fjpeg\")\n  size: number              \u002F\u002F File size in bytes\n  r2Key: string             \u002F\u002F R2 storage key (tenant\u002Ffilename)\n  altText?: string          \u002F\u002F Alt text for images (max 500 chars)\n  folder: string            \u002F\u002F Folder path (empty string = root)\n  metadata?: MediaMetadata  \u002F\u002F Additional metadata\n  createdBy: string         \u002F\u002F User UUID who uploaded\n  createdAt: string         \u002F\u002F ISO 8601 timestamp\n  updatedAt: string         \u002F\u002F ISO 8601 timestamp\n  deletedAt?: string | null \u002F\u002F Soft delete timestamp\n}\n","typescript",[579,1620,1621,1631,1646,1658,1670,1682,1694,1708,1721,1735,1748,1762,1775,1788,1800,1819],{"__ignoreMap":1014},[1241,1622,1623,1626,1629],{"class":1243,"line":1244},[1241,1624,1625],{"class":1257},"interface",[1241,1627,1628],{"class":1276}," Media",[1241,1630,1267],{"class":1247},[1241,1632,1633,1637,1639,1642],{"class":1243,"line":1251},[1241,1634,1636],{"class":1635},"swJcz","  id",[1241,1638,1264],{"class":1247},[1241,1640,1641],{"class":1276}," string",[1241,1643,1645],{"class":1644},"sHwdD","                \u002F\u002F UUID\n",[1241,1647,1648,1651,1653,1655],{"class":1243,"line":1270},[1241,1649,1650],{"class":1635},"  projectId",[1241,1652,1264],{"class":1247},[1241,1654,1641],{"class":1276},[1241,1656,1657],{"class":1644},"          \u002F\u002F Project UUID\n",[1241,1659,1660,1663,1665,1667],{"class":1243,"line":1295},[1241,1661,1662],{"class":1635},"  filename",[1241,1664,1264],{"class":1247},[1241,1666,1641],{"class":1276},[1241,1668,1669],{"class":1644},"          \u002F\u002F Generated filename (UUID + ext)\n",[1241,1671,1672,1675,1677,1679],{"class":1243,"line":1315},[1241,1673,1674],{"class":1635},"  originalFilename",[1241,1676,1264],{"class":1247},[1241,1678,1641],{"class":1276},[1241,1680,1681],{"class":1644},"  \u002F\u002F User's original filename\n",[1241,1683,1684,1687,1689,1691],{"class":1243,"line":1321},[1241,1685,1686],{"class":1635},"  mimeType",[1241,1688,1264],{"class":1247},[1241,1690,1641],{"class":1276},[1241,1692,1693],{"class":1644},"          \u002F\u002F MIME type (e.g., \"image\u002Fjpeg\")\n",[1241,1695,1697,1700,1702,1705],{"class":1243,"line":1696},7,[1241,1698,1699],{"class":1635},"  size",[1241,1701,1264],{"class":1247},[1241,1703,1704],{"class":1276}," number",[1241,1706,1707],{"class":1644},"              \u002F\u002F File size in bytes\n",[1241,1709,1711,1714,1716,1718],{"class":1243,"line":1710},8,[1241,1712,1713],{"class":1635},"  r2Key",[1241,1715,1264],{"class":1247},[1241,1717,1641],{"class":1276},[1241,1719,1720],{"class":1644},"             \u002F\u002F R2 storage key (tenant\u002Ffilename)\n",[1241,1722,1724,1727,1730,1732],{"class":1243,"line":1723},9,[1241,1725,1726],{"class":1635},"  altText",[1241,1728,1729],{"class":1247},"?:",[1241,1731,1641],{"class":1276},[1241,1733,1734],{"class":1644},"          \u002F\u002F Alt text for images (max 500 chars)\n",[1241,1736,1738,1741,1743,1745],{"class":1243,"line":1737},10,[1241,1739,1740],{"class":1635},"  folder",[1241,1742,1264],{"class":1247},[1241,1744,1641],{"class":1276},[1241,1746,1747],{"class":1644},"            \u002F\u002F Folder path (empty string = root)\n",[1241,1749,1751,1754,1756,1759],{"class":1243,"line":1750},11,[1241,1752,1753],{"class":1635},"  metadata",[1241,1755,1729],{"class":1247},[1241,1757,1758],{"class":1276}," MediaMetadata",[1241,1760,1761],{"class":1644},"  \u002F\u002F Additional metadata\n",[1241,1763,1765,1768,1770,1772],{"class":1243,"line":1764},12,[1241,1766,1767],{"class":1635},"  createdBy",[1241,1769,1264],{"class":1247},[1241,1771,1641],{"class":1276},[1241,1773,1774],{"class":1644},"         \u002F\u002F User UUID who uploaded\n",[1241,1776,1778,1781,1783,1785],{"class":1243,"line":1777},13,[1241,1779,1780],{"class":1635},"  createdAt",[1241,1782,1264],{"class":1247},[1241,1784,1641],{"class":1276},[1241,1786,1787],{"class":1644},"         \u002F\u002F ISO 8601 timestamp\n",[1241,1789,1791,1794,1796,1798],{"class":1243,"line":1790},14,[1241,1792,1793],{"class":1635},"  updatedAt",[1241,1795,1264],{"class":1247},[1241,1797,1641],{"class":1276},[1241,1799,1787],{"class":1644},[1241,1801,1803,1806,1808,1810,1813,1816],{"class":1243,"line":1802},15,[1241,1804,1805],{"class":1635},"  deletedAt",[1241,1807,1729],{"class":1247},[1241,1809,1641],{"class":1276},[1241,1811,1812],{"class":1247}," |",[1241,1814,1815],{"class":1276}," null",[1241,1817,1818],{"class":1644}," \u002F\u002F Soft delete timestamp\n",[1241,1820,1822],{"class":1243,"line":1821},16,[1241,1823,1324],{"class":1247},[730,1825,1827],{"id":1826},"mediametadata","MediaMetadata",[567,1829,1830],{},"Optional metadata stored as JSON in D1.",[1006,1832,1834],{"className":1616,"code":1833,"language":1618,"meta":1014,"style":1014},"interface MediaMetadata {\n  width?: number       \u002F\u002F Image width in pixels\n  height?: number      \u002F\u002F Image height in pixels\n  duration?: number    \u002F\u002F Video duration in seconds\n  [key: string]: unknown  \u002F\u002F Extensible for future metadata\n}\n",[579,1835,1836,1844,1856,1868,1880,1905],{"__ignoreMap":1014},[1241,1837,1838,1840,1842],{"class":1243,"line":1244},[1241,1839,1625],{"class":1257},[1241,1841,1758],{"class":1276},[1241,1843,1267],{"class":1247},[1241,1845,1846,1849,1851,1853],{"class":1243,"line":1251},[1241,1847,1848],{"class":1635},"  width",[1241,1850,1729],{"class":1247},[1241,1852,1704],{"class":1276},[1241,1854,1855],{"class":1644},"       \u002F\u002F Image width in pixels\n",[1241,1857,1858,1861,1863,1865],{"class":1243,"line":1270},[1241,1859,1860],{"class":1635},"  height",[1241,1862,1729],{"class":1247},[1241,1864,1704],{"class":1276},[1241,1866,1867],{"class":1644},"      \u002F\u002F Image height in pixels\n",[1241,1869,1870,1873,1875,1877],{"class":1243,"line":1295},[1241,1871,1872],{"class":1635},"  duration",[1241,1874,1729],{"class":1247},[1241,1876,1704],{"class":1276},[1241,1878,1879],{"class":1644},"    \u002F\u002F Video duration in seconds\n",[1241,1881,1882,1886,1890,1892,1894,1897,1899,1902],{"class":1243,"line":1315},[1241,1883,1885],{"class":1884},"sTEyZ","  [",[1241,1887,1889],{"class":1888},"sHdIc","key",[1241,1891,1264],{"class":1247},[1241,1893,1641],{"class":1276},[1241,1895,1896],{"class":1884},"]",[1241,1898,1264],{"class":1247},[1241,1900,1901],{"class":1276}," unknown",[1241,1903,1904],{"class":1644},"  \u002F\u002F Extensible for future metadata\n",[1241,1906,1907],{"class":1243,"line":1321},[1241,1908,1324],{"class":1247},[567,1910,1911,1913,1914,1917],{},[570,1912,1033],{},": Current implementation does not extract image dimensions. Future enhancement to use Image Resizing ",[579,1915,1916],{},"format=json"," endpoint.",[730,1919,1921],{"id":1920},"mediausage","MediaUsage",[567,1923,1924],{},"Usage tracking response.",[1006,1926,1928],{"className":1616,"code":1927,"language":1618,"meta":1014,"style":1014},"interface MediaUsage {\n  pages: PageRef[]\n}\n\ninterface PageRef {\n  id: string      \u002F\u002F Page UUID\n  name: string    \u002F\u002F Page name\n  slug: string    \u002F\u002F Page slug\n}\n",[579,1929,1930,1939,1952,1956,1962,1970,1981,1993,2005],{"__ignoreMap":1014},[1241,1931,1932,1934,1937],{"class":1243,"line":1244},[1241,1933,1625],{"class":1257},[1241,1935,1936],{"class":1276}," MediaUsage",[1241,1938,1267],{"class":1247},[1241,1940,1941,1944,1946,1949],{"class":1243,"line":1251},[1241,1942,1943],{"class":1635},"  pages",[1241,1945,1264],{"class":1247},[1241,1947,1948],{"class":1276}," PageRef",[1241,1950,1951],{"class":1884},"[]\n",[1241,1953,1954],{"class":1243,"line":1270},[1241,1955,1324],{"class":1247},[1241,1957,1958],{"class":1243,"line":1295},[1241,1959,1961],{"emptyLinePlaceholder":1960},true,"\n",[1241,1963,1964,1966,1968],{"class":1243,"line":1315},[1241,1965,1625],{"class":1257},[1241,1967,1948],{"class":1276},[1241,1969,1267],{"class":1247},[1241,1971,1972,1974,1976,1978],{"class":1243,"line":1321},[1241,1973,1636],{"class":1635},[1241,1975,1264],{"class":1247},[1241,1977,1641],{"class":1276},[1241,1979,1980],{"class":1644},"      \u002F\u002F Page UUID\n",[1241,1982,1983,1986,1988,1990],{"class":1243,"line":1696},[1241,1984,1985],{"class":1635},"  name",[1241,1987,1264],{"class":1247},[1241,1989,1641],{"class":1276},[1241,1991,1992],{"class":1644},"    \u002F\u002F Page name\n",[1241,1994,1995,1998,2000,2002],{"class":1243,"line":1710},[1241,1996,1997],{"class":1635},"  slug",[1241,1999,1264],{"class":1247},[1241,2001,1641],{"class":1276},[1241,2003,2004],{"class":1644},"    \u002F\u002F Page slug\n",[1241,2006,2007],{"class":1243,"line":1723},[1241,2008,1324],{"class":1247},[595,2010],{},[598,2012,678],{"id":2013},"error-handling",[730,2015,2017],{"id":2016},"error-response-format","Error Response Format",[567,2019,2020],{},"All error responses follow this structure:",[1006,2022,2024],{"className":1235,"code":2023,"language":1237,"meta":1014,"style":1014},"{\n  \"error\": {\n    \"code\": \"ERROR_CODE\",\n    \"message\": \"Human-readable error message\"\n  }\n}\n",[579,2025,2026,2030,2042,2061,2078,2082],{"__ignoreMap":1014},[1241,2027,2028],{"class":1243,"line":1244},[1241,2029,1248],{"class":1247},[1241,2031,2032,2034,2036,2038,2040],{"class":1243,"line":1251},[1241,2033,1254],{"class":1247},[1241,2035,1258],{"class":1257},[1241,2037,1261],{"class":1247},[1241,2039,1264],{"class":1247},[1241,2041,1267],{"class":1247},[1241,2043,2044,2046,2048,2050,2052,2054,2057,2059],{"class":1243,"line":1270},[1241,2045,1273],{"class":1247},[1241,2047,579],{"class":1276},[1241,2049,1261],{"class":1247},[1241,2051,1264],{"class":1247},[1241,2053,1283],{"class":1247},[1241,2055,2056],{"class":1286},"ERROR_CODE",[1241,2058,1261],{"class":1247},[1241,2060,1292],{"class":1247},[1241,2062,2063,2065,2067,2069,2071,2073,2076],{"class":1243,"line":1295},[1241,2064,1273],{"class":1247},[1241,2066,1300],{"class":1276},[1241,2068,1261],{"class":1247},[1241,2070,1264],{"class":1247},[1241,2072,1283],{"class":1247},[1241,2074,2075],{"class":1286},"Human-readable error message",[1241,2077,1312],{"class":1247},[1241,2079,2080],{"class":1243,"line":1315},[1241,2081,1318],{"class":1247},[1241,2083,2084],{"class":1243,"line":1321},[1241,2085,1324],{"class":1247},[730,2087,2089],{"id":2088},"error-codes","Error Codes",[763,2091,2092,2104],{},[766,2093,2094],{},[769,2095,2096,2099,2102],{},[772,2097,2098],{},"Code",[772,2100,2101],{},"HTTP Status",[772,2103,783],{},[785,2105,2106,2119,2132,2144,2160,2172,2185,2197,2210],{},[769,2107,2108,2113,2116],{},[790,2109,2110],{},[579,2111,2112],{},"UNAUTHORIZED",[790,2114,2115],{},"401",[790,2117,2118],{},"Missing or invalid credentials",[769,2120,2121,2126,2129],{},[790,2122,2123],{},[579,2124,2125],{},"FORBIDDEN",[790,2127,2128],{},"403",[790,2130,2131],{},"Insufficient permissions",[769,2133,2134,2138,2141],{},[790,2135,2136],{},[579,2137,1287],{},[790,2139,2140],{},"404",[790,2142,2143],{},"Resource not found or wrong tenant",[769,2145,2146,2151,2154],{},[790,2147,2148],{},[579,2149,2150],{},"HAS_REFERENCES",[790,2152,2153],{},"409",[790,2155,2156,2157,1372],{},"Cannot delete media — still referenced by pages\u002Fcollection items (bypass with ",[579,2158,2159],{},"?force=true",[769,2161,2162,2167,2169],{},[790,2163,2164],{},[579,2165,2166],{},"CONFLICT",[790,2168,2153],{},[790,2170,2171],{},"A folder with the target name already exists (folder rename only — unrelated to media deletion)",[769,2173,2174,2179,2182],{},[790,2175,2176],{},[579,2177,2178],{},"VALIDATION_ERROR",[790,2180,2181],{},"400",[790,2183,2184],{},"Invalid input (file type, size, params)",[769,2186,2187,2192,2194],{},[790,2188,2189],{},[579,2190,2191],{},"INVALID_REQUEST",[790,2193,2181],{},[790,2195,2196],{},"Malformed request (no file, invalid JSON)",[769,2198,2199,2204,2207],{},[790,2200,2201],{},[579,2202,2203],{},"RATE_LIMITED",[790,2205,2206],{},"429",[790,2208,2209],{},"Too many requests",[769,2211,2212,2217,2220],{},[790,2213,2214],{},[579,2215,2216],{},"INTERNAL_ERROR",[790,2218,2219],{},"500",[790,2221,2222],{},"Server error",[730,2224,2226],{"id":2225},"common-error-scenarios","Common Error Scenarios",[567,2228,2229],{},[570,2230,2231],{},"Public media serving:",[615,2233,2234,2239],{},[618,2235,2236,2237],{},"Unknown project ID or filename → 404 ",[579,2238,1287],{},[618,2240,2241],{},"Transform params on a non-image file → the file is served unchanged (transforms apply to images only)",[567,2243,2244,2245,2247],{},"Upload validation, permission, and delete-conflict scenarios belong to the session-authenticated admin endpoints — see the ",[589,2246,592],{"href":591}," for those flows and client-side error-handling examples.",[595,2249],{},[598,2251,684],{"id":2252},"rate-limiting",[567,2254,2255],{},"Rate limits differ by media endpoint:",[615,2257,2258,2274,2285],{},[618,2259,2260,1149,2263,874,2266,874,2268,2271,2272,593],{},[570,2261,2262],{},"Media metadata reads",[579,2264,2265],{},"GET \u002Fapi\u002Fv1\u002Fmedia",[579,2267,1500],{},[579,2269,2270],{},"\u002Ftransform",") — the standard public read limit, in-Worker per API key and counted per cache miss, in line with the other public read endpoints. Figures: ",[589,2273,751],{"href":750},[618,2275,2276,1149,2279,2282,2283,593],{},[570,2277,2278],{},"Admin media endpoints",[579,2280,2281],{},"\u002Fapi\u002Fv1\u002Fadmin\u002Fmedia\u002F*",") — the admin API per-IP limit, enforced in the Worker; figure in ",[589,2284,751],{"href":750},[618,2286,2287,1149,2290,2293,2294,2297,2298,2300],{},[570,2288,2289],{},"Raw media serving",[579,2291,2292],{},"GET \u002Fapi\u002Fv1\u002Fmedia\u002F:projectId\u002F:filename",", the file bytes) — ",[570,2295,2296],{},"no per-key in-worker limit",". It's covered only by the coarse per-IP Cloudflare WAF backstop, live since 2026-07-13; figures in ",[589,2299,751],{"href":750},". Cloudflare's CDN cache further reduces how often these requests reach the origin for repeat\u002Ftransformed URLs.",[567,2302,2303,2304,2306,2307,2311],{},"A 429 response uses the ",[579,2305,2203],{}," code. See ",[570,2308,2309],{},[589,2310,751],{"href":750}," for the full limit table, rate-limit headers, and 429 response shape.",[595,2313],{},[598,2315,10],{"id":2316},"best-practices",[730,2318,2320],{"id":2319},"image-transformation-best-practices","Image Transformation Best Practices",[567,2322,2323],{},[570,2324,2325],{},"1. Use Predefined Sizes",[567,2327,2328],{},"Define common image sizes in your app:",[1006,2330,2334],{"className":2331,"code":2332,"language":2333,"meta":1014,"style":1014},"language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const IMAGE_SIZES = {\n  thumbnail: { width: 200, height: 200, fit: 'cover' },\n  small: { width: 400, fit: 'scale-down' },\n  medium: { width: 800, fit: 'scale-down' },\n  large: { width: 1200, fit: 'scale-down' },\n  hero: { width: 1920, fit: 'scale-down' },\n}\n\nfunction getImageUrl(media, size = 'medium') {\n  const params = new URLSearchParams(IMAGE_SIZES[size])\n  return `\u002Fapi\u002Fv1\u002Fmedia\u002F${media.r2Key}?${params}`\n}\n","javascript",[579,2335,2336,2349,2396,2426,2456,2486,2516,2520,2524,2557,2586,2621],{"__ignoreMap":1014},[1241,2337,2338,2341,2344,2347],{"class":1243,"line":1244},[1241,2339,2340],{"class":1257},"const",[1241,2342,2343],{"class":1884}," IMAGE_SIZES ",[1241,2345,2346],{"class":1247},"=",[1241,2348,1267],{"class":1247},[1241,2350,2351,2354,2356,2359,2362,2364,2368,2371,2374,2376,2378,2380,2383,2385,2388,2390,2393],{"class":1243,"line":1251},[1241,2352,2353],{"class":1635},"  thumbnail",[1241,2355,1264],{"class":1247},[1241,2357,2358],{"class":1247}," {",[1241,2360,2361],{"class":1635}," width",[1241,2363,1264],{"class":1247},[1241,2365,2367],{"class":2366},"sbssI"," 200",[1241,2369,2370],{"class":1247},",",[1241,2372,2373],{"class":1635}," height",[1241,2375,1264],{"class":1247},[1241,2377,2367],{"class":2366},[1241,2379,2370],{"class":1247},[1241,2381,2382],{"class":1635}," fit",[1241,2384,1264],{"class":1247},[1241,2386,2387],{"class":1247}," '",[1241,2389,916],{"class":1286},[1241,2391,2392],{"class":1247},"'",[1241,2394,2395],{"class":1247}," },\n",[1241,2397,2398,2401,2403,2405,2407,2409,2412,2414,2416,2418,2420,2422,2424],{"class":1243,"line":1270},[1241,2399,2400],{"class":1635},"  small",[1241,2402,1264],{"class":1247},[1241,2404,2358],{"class":1247},[1241,2406,2361],{"class":1635},[1241,2408,1264],{"class":1247},[1241,2410,2411],{"class":2366}," 400",[1241,2413,2370],{"class":1247},[1241,2415,2382],{"class":1635},[1241,2417,1264],{"class":1247},[1241,2419,2387],{"class":1247},[1241,2421,922],{"class":1286},[1241,2423,2392],{"class":1247},[1241,2425,2395],{"class":1247},[1241,2427,2428,2431,2433,2435,2437,2439,2442,2444,2446,2448,2450,2452,2454],{"class":1243,"line":1295},[1241,2429,2430],{"class":1635},"  medium",[1241,2432,1264],{"class":1247},[1241,2434,2358],{"class":1247},[1241,2436,2361],{"class":1635},[1241,2438,1264],{"class":1247},[1241,2440,2441],{"class":2366}," 800",[1241,2443,2370],{"class":1247},[1241,2445,2382],{"class":1635},[1241,2447,1264],{"class":1247},[1241,2449,2387],{"class":1247},[1241,2451,922],{"class":1286},[1241,2453,2392],{"class":1247},[1241,2455,2395],{"class":1247},[1241,2457,2458,2461,2463,2465,2467,2469,2472,2474,2476,2478,2480,2482,2484],{"class":1243,"line":1315},[1241,2459,2460],{"class":1635},"  large",[1241,2462,1264],{"class":1247},[1241,2464,2358],{"class":1247},[1241,2466,2361],{"class":1635},[1241,2468,1264],{"class":1247},[1241,2470,2471],{"class":2366}," 1200",[1241,2473,2370],{"class":1247},[1241,2475,2382],{"class":1635},[1241,2477,1264],{"class":1247},[1241,2479,2387],{"class":1247},[1241,2481,922],{"class":1286},[1241,2483,2392],{"class":1247},[1241,2485,2395],{"class":1247},[1241,2487,2488,2491,2493,2495,2497,2499,2502,2504,2506,2508,2510,2512,2514],{"class":1243,"line":1321},[1241,2489,2490],{"class":1635},"  hero",[1241,2492,1264],{"class":1247},[1241,2494,2358],{"class":1247},[1241,2496,2361],{"class":1635},[1241,2498,1264],{"class":1247},[1241,2500,2501],{"class":2366}," 1920",[1241,2503,2370],{"class":1247},[1241,2505,2382],{"class":1635},[1241,2507,1264],{"class":1247},[1241,2509,2387],{"class":1247},[1241,2511,922],{"class":1286},[1241,2513,2392],{"class":1247},[1241,2515,2395],{"class":1247},[1241,2517,2518],{"class":1243,"line":1696},[1241,2519,1324],{"class":1247},[1241,2521,2522],{"class":1243,"line":1710},[1241,2523,1961],{"emptyLinePlaceholder":1960},[1241,2525,2526,2529,2533,2536,2538,2540,2543,2546,2548,2551,2553,2555],{"class":1243,"line":1723},[1241,2527,2528],{"class":1257},"function",[1241,2530,2532],{"class":2531},"s2Zo4"," getImageUrl",[1241,2534,2535],{"class":1247},"(",[1241,2537,1610],{"class":1888},[1241,2539,2370],{"class":1247},[1241,2541,2542],{"class":1888}," size",[1241,2544,2545],{"class":1247}," =",[1241,2547,2387],{"class":1247},[1241,2549,2550],{"class":1286},"medium",[1241,2552,2392],{"class":1247},[1241,2554,1372],{"class":1247},[1241,2556,1267],{"class":1247},[1241,2558,2559,2562,2565,2567,2570,2573,2575,2578,2581,2583],{"class":1243,"line":1737},[1241,2560,2561],{"class":1257},"  const",[1241,2563,2564],{"class":1884}," params",[1241,2566,2545],{"class":1247},[1241,2568,2569],{"class":1247}," new",[1241,2571,2572],{"class":2531}," URLSearchParams",[1241,2574,2535],{"class":1635},[1241,2576,2577],{"class":1884},"IMAGE_SIZES",[1241,2579,2580],{"class":1635},"[",[1241,2582,1524],{"class":1884},[1241,2584,2585],{"class":1635},"])\n",[1241,2587,2588,2592,2595,2598,2601,2603,2605,2608,2611,2613,2615,2618],{"class":1243,"line":1750},[1241,2589,2591],{"class":2590},"s7zQu","  return",[1241,2593,2594],{"class":1247}," `",[1241,2596,2597],{"class":1286},"\u002Fapi\u002Fv1\u002Fmedia\u002F",[1241,2599,2600],{"class":1247},"${",[1241,2602,1610],{"class":1884},[1241,2604,593],{"class":1247},[1241,2606,2607],{"class":1884},"r2Key",[1241,2609,2610],{"class":1247},"}",[1241,2612,1410],{"class":1286},[1241,2614,2600],{"class":1247},[1241,2616,2617],{"class":1884},"params",[1241,2619,2620],{"class":1247},"}`\n",[1241,2622,2623],{"class":1243,"line":1764},[1241,2624,1324],{"class":1247},[567,2626,2627],{},[570,2628,2629],{},"2. Responsive Images with srcset",[567,2631,2632],{},"Generate multiple sizes for responsive images:",[1006,2634,2638],{"className":2635,"code":2636,"language":2637,"meta":1014,"style":1014},"language-html shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cimg\n  src=\"\u002Fapi\u002Fv1\u002Fmedia\u002Ftenant\u002Fimage.jpg?width=800\"\n  srcset=\"\n    \u002Fapi\u002Fv1\u002Fmedia\u002Ftenant\u002Fimage.jpg?width=320 320w,\n    \u002Fapi\u002Fv1\u002Fmedia\u002Ftenant\u002Fimage.jpg?width=640 640w,\n    \u002Fapi\u002Fv1\u002Fmedia\u002Ftenant\u002Fimage.jpg?width=960 960w,\n    \u002Fapi\u002Fv1\u002Fmedia\u002Ftenant\u002Fimage.jpg?width=1280 1280w\n  \"\n  sizes=\"(max-width: 640px) 100vw, 640px\"\n  alt=\"Hero image\"\n\u002F>\n","html",[579,2639,2640,2648,2662,2671,2676,2681,2686,2691,2696,2710,2724],{"__ignoreMap":1014},[1241,2641,2642,2645],{"class":1243,"line":1244},[1241,2643,2644],{"class":1247},"\u003C",[1241,2646,2647],{"class":1635},"img\n",[1241,2649,2650,2653,2655,2657,2660],{"class":1243,"line":1251},[1241,2651,2652],{"class":1257},"  src",[1241,2654,2346],{"class":1247},[1241,2656,1261],{"class":1247},[1241,2658,2659],{"class":1286},"\u002Fapi\u002Fv1\u002Fmedia\u002Ftenant\u002Fimage.jpg?width=800",[1241,2661,1312],{"class":1247},[1241,2663,2664,2667,2669],{"class":1243,"line":1270},[1241,2665,2666],{"class":1257},"  srcset",[1241,2668,2346],{"class":1247},[1241,2670,1312],{"class":1247},[1241,2672,2673],{"class":1243,"line":1295},[1241,2674,2675],{"class":1286},"    \u002Fapi\u002Fv1\u002Fmedia\u002Ftenant\u002Fimage.jpg?width=320 320w,\n",[1241,2677,2678],{"class":1243,"line":1315},[1241,2679,2680],{"class":1286},"    \u002Fapi\u002Fv1\u002Fmedia\u002Ftenant\u002Fimage.jpg?width=640 640w,\n",[1241,2682,2683],{"class":1243,"line":1321},[1241,2684,2685],{"class":1286},"    \u002Fapi\u002Fv1\u002Fmedia\u002Ftenant\u002Fimage.jpg?width=960 960w,\n",[1241,2687,2688],{"class":1243,"line":1696},[1241,2689,2690],{"class":1286},"    \u002Fapi\u002Fv1\u002Fmedia\u002Ftenant\u002Fimage.jpg?width=1280 1280w\n",[1241,2692,2693],{"class":1243,"line":1710},[1241,2694,2695],{"class":1247},"  \"\n",[1241,2697,2698,2701,2703,2705,2708],{"class":1243,"line":1723},[1241,2699,2700],{"class":1257},"  sizes",[1241,2702,2346],{"class":1247},[1241,2704,1261],{"class":1247},[1241,2706,2707],{"class":1286},"(max-width: 640px) 100vw, 640px",[1241,2709,1312],{"class":1247},[1241,2711,2712,2715,2717,2719,2722],{"class":1243,"line":1737},[1241,2713,2714],{"class":1257},"  alt",[1241,2716,2346],{"class":1247},[1241,2718,1261],{"class":1247},[1241,2720,2721],{"class":1286},"Hero image",[1241,2723,1312],{"class":1247},[1241,2725,2726],{"class":1243,"line":1750},[1241,2727,2728],{"class":1247},"\u002F>\n",[567,2730,2731],{},[570,2732,2733],{},"3. Use WebP\u002FAVIF with Fallback",[567,2735,2736],{},"Prefer modern formats with fallback:",[1006,2738,2740],{"className":2635,"code":2739,"language":2637,"meta":1014,"style":1014},"\u003Cpicture>\n  \u003Csource\n    srcset=\"\u002Fapi\u002Fv1\u002Fmedia\u002Ftenant\u002Fimage.jpg?width=800&format=avif\"\n    type=\"image\u002Favif\"\n  \u002F>\n  \u003Csource\n    srcset=\"\u002Fapi\u002Fv1\u002Fmedia\u002Ftenant\u002Fimage.jpg?width=800&format=webp\"\n    type=\"image\u002Fwebp\"\n  \u002F>\n  \u003Cimg src=\"\u002Fapi\u002Fv1\u002Fmedia\u002Ftenant\u002Fimage.jpg?width=800\" alt=\"Hero\" \u002F>\n\u003C\u002Fpicture>\n",[579,2741,2742,2752,2760,2774,2788,2793,2799,2812,2825,2829,2862],{"__ignoreMap":1014},[1241,2743,2744,2746,2749],{"class":1243,"line":1244},[1241,2745,2644],{"class":1247},[1241,2747,2748],{"class":1635},"picture",[1241,2750,2751],{"class":1247},">\n",[1241,2753,2754,2757],{"class":1243,"line":1251},[1241,2755,2756],{"class":1247},"  \u003C",[1241,2758,2759],{"class":1635},"source\n",[1241,2761,2762,2765,2767,2769,2772],{"class":1243,"line":1270},[1241,2763,2764],{"class":1257},"    srcset",[1241,2766,2346],{"class":1247},[1241,2768,1261],{"class":1247},[1241,2770,2771],{"class":1286},"\u002Fapi\u002Fv1\u002Fmedia\u002Ftenant\u002Fimage.jpg?width=800&format=avif",[1241,2773,1312],{"class":1247},[1241,2775,2776,2779,2781,2783,2786],{"class":1243,"line":1295},[1241,2777,2778],{"class":1257},"    type",[1241,2780,2346],{"class":1247},[1241,2782,1261],{"class":1247},[1241,2784,2785],{"class":1286},"image\u002Favif",[1241,2787,1312],{"class":1247},[1241,2789,2790],{"class":1243,"line":1315},[1241,2791,2792],{"class":1247},"  \u002F>\n",[1241,2794,2795,2797],{"class":1243,"line":1321},[1241,2796,2756],{"class":1247},[1241,2798,2759],{"class":1635},[1241,2800,2801,2803,2805,2807,2810],{"class":1243,"line":1696},[1241,2802,2764],{"class":1257},[1241,2804,2346],{"class":1247},[1241,2806,1261],{"class":1247},[1241,2808,2809],{"class":1286},"\u002Fapi\u002Fv1\u002Fmedia\u002Ftenant\u002Fimage.jpg?width=800&format=webp",[1241,2811,1312],{"class":1247},[1241,2813,2814,2816,2818,2820,2823],{"class":1243,"line":1710},[1241,2815,2778],{"class":1257},[1241,2817,2346],{"class":1247},[1241,2819,1261],{"class":1247},[1241,2821,2822],{"class":1286},"image\u002Fwebp",[1241,2824,1312],{"class":1247},[1241,2826,2827],{"class":1243,"line":1723},[1241,2828,2792],{"class":1247},[1241,2830,2831,2833,2836,2839,2841,2843,2845,2847,2850,2852,2854,2857,2859],{"class":1243,"line":1737},[1241,2832,2756],{"class":1247},[1241,2834,2835],{"class":1635},"img",[1241,2837,2838],{"class":1257}," src",[1241,2840,2346],{"class":1247},[1241,2842,1261],{"class":1247},[1241,2844,2659],{"class":1286},[1241,2846,1261],{"class":1247},[1241,2848,2849],{"class":1257}," alt",[1241,2851,2346],{"class":1247},[1241,2853,1261],{"class":1247},[1241,2855,2856],{"class":1286},"Hero",[1241,2858,1261],{"class":1247},[1241,2860,2861],{"class":1247}," \u002F>\n",[1241,2863,2864,2867,2869],{"class":1243,"line":1750},[1241,2865,2866],{"class":1247},"\u003C\u002F",[1241,2868,2748],{"class":1635},[1241,2870,2751],{"class":1247},[730,2872,2874],{"id":2873},"performance-best-practices","Performance Best Practices",[567,2876,2877],{},[570,2878,2879],{},"Lazy Load Thumbnails",[567,2881,2882],{},"Use native lazy loading for media grids:",[1006,2884,2886],{"className":2635,"code":2885,"language":2637,"meta":1014,"style":1014},"\u003Cimg\n  src=\"\u002Fapi\u002Fv1\u002Fmedia\u002Ftenant\u002Fimage.jpg?width=200&height=200&fit=cover\"\n  loading=\"lazy\"\n  alt=\"Thumbnail\"\n\u002F>\n",[579,2887,2888,2894,2907,2921,2934],{"__ignoreMap":1014},[1241,2889,2890,2892],{"class":1243,"line":1244},[1241,2891,2644],{"class":1247},[1241,2893,2647],{"class":1635},[1241,2895,2896,2898,2900,2902,2905],{"class":1243,"line":1251},[1241,2897,2652],{"class":1257},[1241,2899,2346],{"class":1247},[1241,2901,1261],{"class":1247},[1241,2903,2904],{"class":1286},"\u002Fapi\u002Fv1\u002Fmedia\u002Ftenant\u002Fimage.jpg?width=200&height=200&fit=cover",[1241,2906,1312],{"class":1247},[1241,2908,2909,2912,2914,2916,2919],{"class":1243,"line":1270},[1241,2910,2911],{"class":1257},"  loading",[1241,2913,2346],{"class":1247},[1241,2915,1261],{"class":1247},[1241,2917,2918],{"class":1286},"lazy",[1241,2920,1312],{"class":1247},[1241,2922,2923,2925,2927,2929,2932],{"class":1243,"line":1295},[1241,2924,2714],{"class":1257},[1241,2926,2346],{"class":1247},[1241,2928,1261],{"class":1247},[1241,2930,2931],{"class":1286},"Thumbnail",[1241,2933,1312],{"class":1247},[1241,2935,2936],{"class":1243,"line":1315},[1241,2937,2728],{"class":1247},[567,2939,2940,2941,593],{},"List\u002Fsearch, folder-caching, and pagination tips for the admin media endpoints live in the ",[589,2942,592],{"href":591},[595,2944],{},[598,2946,2948],{"id":2947},"summary","Summary",[567,2950,2951],{},"The Media API provides a comprehensive set of endpoints for managing media assets in a multi-tenant CMS:",[615,2953,2954,2962,2968,2974,2980,2986,2992],{},[618,2955,2956,2959,2960,1372],{},[570,2957,2958],{},"Full media lifecycle"," covering upload, organise, serve, and delete (upload\u002Fmanage endpoints are documented in the ",[589,2961,592],{"href":591},[618,2963,2964,2967],{},[570,2965,2966],{},"Strong tenant isolation"," enforced at storage (R2) and data (D1) layers",[618,2969,2970,2973],{},[570,2971,2972],{},"Usage tracking"," prevents accidental deletion of referenced media",[618,2975,2976,2979],{},[570,2977,2978],{},"Image transformations"," via Cloudflare Image Resizing for dynamic resizing",[618,2981,2982,2985],{},[570,2983,2984],{},"Soft delete"," pattern for recovery",[618,2987,2988,2991],{},[570,2989,2990],{},"Bulk operations"," with partial success handling",[618,2993,2994,2997],{},[570,2995,2996],{},"Public serving"," with 1-year cache for optimal performance",[567,2999,3000],{},[570,3001,3002],{},"Key Considerations:",[615,3004,3005,3008,3014,3017,3020,3023],{},[618,3006,3007],{},"Validate files client-side and server-side (defense in depth)",[618,3009,3010,3011,3013],{},"Check usage before deletion (409 ",[579,3012,2150],{}," if still referenced by content)",[618,3015,3016],{},"Use image transforms for responsive, optimized images",[618,3018,3019],{},"Organize media with folders (2-3 levels max)",[618,3021,3022],{},"Respect rate limits (especially bulk upload)",[618,3024,3025],{},"SVG uploads are sanitized server-side to prevent XSS",[567,3027,3028],{},"For related guidance, see:",[615,3030,3031,3037],{},[618,3032,3033],{},[589,3034,3036],{"href":3035},"..\u002Fguides\u002Fadmin-interface","Admin Interface Guide",[618,3038,3039],{},[589,3040,592],{"href":591},[3042,3043,3044],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}",{"title":1014,"searchDepth":1251,"depth":1251,"links":3046},[3047,3048,3049,3050,3053,3059,3064,3065,3069],{"id":600,"depth":1251,"text":38},{"id":643,"depth":1251,"text":644},{"id":694,"depth":1251,"text":72},{"id":728,"depth":1251,"text":658,"children":3051},[3052],{"id":732,"depth":1270,"text":700},{"id":1377,"depth":1251,"text":672,"children":3054},[3055,3056,3057,3058],{"id":1380,"depth":1270,"text":1381},{"id":1610,"depth":1270,"text":34},{"id":1826,"depth":1270,"text":1827},{"id":1920,"depth":1270,"text":1921},{"id":2013,"depth":1251,"text":678,"children":3060},[3061,3062,3063],{"id":2016,"depth":1270,"text":2017},{"id":2088,"depth":1270,"text":2089},{"id":2225,"depth":1270,"text":2226},{"id":2252,"depth":1251,"text":684},{"id":2316,"depth":1251,"text":10,"children":3066},[3067,3068],{"id":2319,"depth":1270,"text":2320},{"id":2873,"depth":1270,"text":2874},{"id":2947,"depth":1251,"text":2948},"Serving media files and the image transformation parameters.","md",{},{"title":34,"description":3070},"ZzYZnDTICnu0u4uz1w6Auaq-a1bhzf0MM9x-ybkc1xA",[3076,3078],{"title":30,"path":31,"stem":32,"description":3077,"children":-1},"The single source of truth for rate limits, payload limits, idempotency and error codes.",{"title":38,"path":39,"stem":40,"description":3079,"children":-1},"Base URL, versioning and preview mode, plus an index of the public API reference.",1787919219208]