[{"data":1,"prerenderedAt":3821},["ShallowReactive",2],{"navigation":3,"\u002Fbooki-documentation\u002Fguides\u002Fguides-errors":303,"\u002Fbooki-documentation\u002Fguides\u002Fguides-errors-surround":3816},[4,55,105],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":54},"Nuxt Guide","i-lucide-layout","\u002Fnuxt-guide","1.nuxt-guide",[10,14,19,24,29,34,39,44,49],{"title":11,"path":12,"stem":13,"icon":6},"Overview","\u002Fnuxt-guide\u002Foverview","1.nuxt-guide\u002F1.overview",{"title":15,"path":16,"stem":17,"icon":18},"Folder Structure","\u002Fnuxt-guide\u002Ffolder-structure","1.nuxt-guide\u002F2.folder-structure","i-lucide-folder-tree",{"title":20,"path":21,"stem":22,"icon":23},"Components","\u002Fnuxt-guide\u002Fcomponents","1.nuxt-guide\u002F3.components","i-lucide-component",{"title":25,"path":26,"stem":27,"icon":28},"Composables","\u002Fnuxt-guide\u002Fcomposables","1.nuxt-guide\u002F4.composables","i-lucide-puzzle",{"title":30,"path":31,"stem":32,"icon":33},"Pages & Routing","\u002Fnuxt-guide\u002Fpages-routing","1.nuxt-guide\u002F5.pages-routing","i-lucide-file-text",{"title":35,"path":36,"stem":37,"icon":38},"Middleware","\u002Fnuxt-guide\u002Fmiddleware","1.nuxt-guide\u002F6.middleware","i-lucide-shield-check",{"title":40,"path":41,"stem":42,"icon":43},"Plugins","\u002Fnuxt-guide\u002Fplugins","1.nuxt-guide\u002F7.plugins","i-lucide-plug",{"title":45,"path":46,"stem":47,"icon":48},"State Management","\u002Fnuxt-guide\u002Fstate-management","1.nuxt-guide\u002F8.state-management","i-lucide-database",{"title":50,"path":51,"stem":52,"icon":53},"TypeScript","\u002Fnuxt-guide\u002Ftypescript","1.nuxt-guide\u002F9.typescript","i-lucide-braces",false,{"title":56,"icon":57,"path":58,"stem":59,"children":60,"page":54},"Node \u002F Express Guide","i-lucide-server","\u002Fnode-express-guide","2.node-express-guide",[61,64,69,72,77,82,86,91,96,100],{"title":11,"path":62,"stem":63,"icon":57},"\u002Fnode-express-guide\u002Foverview","2.node-express-guide\u002F1.overview",{"title":65,"path":66,"stem":67,"icon":68},"Error Handling","\u002Fnode-express-guide\u002Ferror-handling","2.node-express-guide\u002F10.error-handling","i-lucide-alert-triangle",{"title":15,"path":70,"stem":71,"icon":18},"\u002Fnode-express-guide\u002Ffolder-structure","2.node-express-guide\u002F2.folder-structure",{"title":73,"path":74,"stem":75,"icon":76},"Controllers","\u002Fnode-express-guide\u002Fcontrollers","2.node-express-guide\u002F3.controllers","i-lucide-cpu",{"title":78,"path":79,"stem":80,"icon":81},"Services","\u002Fnode-express-guide\u002Fservices","2.node-express-guide\u002F4.services","i-lucide-workflow",{"title":83,"path":84,"stem":85,"icon":48},"Repositories","\u002Fnode-express-guide\u002Frepositories","2.node-express-guide\u002F5.repositories",{"title":87,"path":88,"stem":89,"icon":90},"Models","\u002Fnode-express-guide\u002Fmodels","2.node-express-guide\u002F6.models","i-lucide-boxes",{"title":92,"path":93,"stem":94,"icon":95},"Routes","\u002Fnode-express-guide\u002Froutes","2.node-express-guide\u002F7.routes","i-lucide-route",{"title":35,"path":97,"stem":98,"icon":99},"\u002Fnode-express-guide\u002Fmiddleware","2.node-express-guide\u002F8.middleware","i-lucide-shield",{"title":101,"path":102,"stem":103,"icon":104},"Validation","\u002Fnode-express-guide\u002Fvalidation","2.node-express-guide\u002F9.validation","i-lucide-check-circle",{"title":106,"icon":107,"path":108,"stem":109,"children":110,"page":54},"Booki Documentation","i-lucide-book-open","\u002Fbooki-documentation","3.booki-documentation",[111,115,120,125,130,229,244,257],{"title":112,"path":113,"stem":114,"icon":107},"Project Overview","\u002Fbooki-documentation\u002Foverview","3.booki-documentation\u002F1.overview",{"title":116,"path":117,"stem":118,"icon":119},"Installation","\u002Fbooki-documentation\u002F1.installation","3.booki-documentation\u002F2.1.installation","i-lucide-download",{"title":121,"path":122,"stem":123,"icon":124},"Development Overview","\u002Fbooki-documentation\u002F2.architecture","3.booki-documentation\u002F2.2.architecture","i-lucide-layers",{"title":126,"path":127,"stem":128,"icon":129},"Local Development","\u002Fbooki-documentation\u002F3.local-development","3.booki-documentation\u002F2.3.local-development","i-lucide-monitor",{"title":131,"icon":57,"path":132,"stem":133,"children":134,"page":54},"API","\u002Fbooki-documentation\u002Fapi","3.booki-documentation\u002F3.api",[135,139,144,149,154,159,163,168,173,178,183,188,192,197,202,206,211,216,220,224],{"title":136,"path":137,"stem":138,"icon":57},"Booki API Reference","\u002Fbooki-documentation\u002Fapi\u002Fbooki-api","3.booki-documentation\u002F3.api\u002F1.booki-api",{"title":140,"path":141,"stem":142,"icon":143},"Auth - Login & Refresh","\u002Fbooki-documentation\u002Fapi\u002Fauth","3.booki-documentation\u002F3.api\u002F2.auth","i-lucide-key",{"title":145,"path":146,"stem":147,"icon":148},"Auth - Customer Registration","\u002Fbooki-documentation\u002Fapi\u002Fauth-customer-register","3.booki-documentation\u002F3.api\u002F2.auth-customer-register","i-lucide-user-check",{"title":150,"path":151,"stem":152,"icon":153},"Auth - Owner Registration","\u002Fbooki-documentation\u002Fapi\u002Fauth-owner-register","3.booki-documentation\u002F3.api\u002F2.auth-owner-register","i-lucide-user-plus",{"title":155,"path":156,"stem":157,"icon":158},"Bookings","\u002Fbooki-documentation\u002Fapi\u002Fbookings","3.booki-documentation\u002F3.api\u002F3.bookings","i-lucide-calendar-check",{"title":160,"path":161,"stem":162,"icon":158},"Bookings - Authenticated","\u002Fbooki-documentation\u002Fapi\u002Fbookings-auth","3.booki-documentation\u002F3.api\u002F3.bookings-auth",{"title":164,"path":165,"stem":166,"icon":167},"Bookings - Public & Guest","\u002Fbooki-documentation\u002Fapi\u002Fbookings-public","3.booki-documentation\u002F3.api\u002F3.bookings-public","i-lucide-calendar-plus",{"title":169,"path":170,"stem":171,"icon":172},"Booking Services","\u002Fbooki-documentation\u002Fapi\u002Fbooking-services","3.booki-documentation\u002F3.api\u002F4.booking-services","i-lucide-box",{"title":174,"path":175,"stem":176,"icon":177},"Organizations - Branches","\u002Fbooki-documentation\u002Fapi\u002Fbranches","3.booki-documentation\u002F3.api\u002F5.branches","i-lucide-git-branch",{"title":179,"path":180,"stem":181,"icon":182},"Organizations - Business Hours","\u002Fbooki-documentation\u002Fapi\u002Fbusiness-hours","3.booki-documentation\u002F3.api\u002F5.business-hours","i-lucide-clock",{"title":184,"path":185,"stem":186,"icon":187},"Organizations - Base","\u002Fbooki-documentation\u002Fapi\u002Forganizations","3.booki-documentation\u002F3.api\u002F5.organizations","i-lucide-building-2",{"title":189,"path":190,"stem":191,"icon":172},"Organizations - Packages","\u002Fbooki-documentation\u002Fapi\u002Fpackages","3.booki-documentation\u002F3.api\u002F5.packages",{"title":193,"path":194,"stem":195,"icon":196},"Organizations - Payments & Integrations","\u002Fbooki-documentation\u002Fapi\u002Fpayments","3.booki-documentation\u002F3.api\u002F5.payments","i-lucide-credit-card",{"title":198,"path":199,"stem":200,"icon":201},"Users - Profile & Settings","\u002Fbooki-documentation\u002Fapi\u002Fusers","3.booki-documentation\u002F3.api\u002F6.users","i-lucide-user",{"title":203,"path":204,"stem":205,"icon":196},"Maya Payments","\u002Fbooki-documentation\u002Fapi\u002Fmaya","3.booki-documentation\u002F3.api\u002F7.maya",{"title":207,"path":208,"stem":209,"icon":210},"Owner - Booking Management","\u002Fbooki-documentation\u002Fapi\u002Fowner-bookings","3.booki-documentation\u002F3.api\u002F7.owner-bookings","i-lucide-calendar",{"title":212,"path":213,"stem":214,"icon":215},"Owner - Customer Management","\u002Fbooki-documentation\u002Fapi\u002Fowner-customers","3.booki-documentation\u002F3.api\u002F7.owner-customers","i-lucide-users",{"title":217,"path":218,"stem":219,"icon":196},"Admin - Billing & Subscriptions","\u002Fbooki-documentation\u002Fapi\u002Fadmin-billing","3.booki-documentation\u002F3.api\u002F8.admin-billing",{"title":221,"path":222,"stem":223,"icon":187},"Admin - Organizations Management","\u002Fbooki-documentation\u002Fapi\u002Fadmin-organizations","3.booki-documentation\u002F3.api\u002F8.admin-organizations",{"title":225,"path":226,"stem":227,"icon":228},"Admin - User Management","\u002Fbooki-documentation\u002Fapi\u002Fadmin-users","3.booki-documentation\u002F3.api\u002F8.admin-users","i-lucide-shield-admin",{"title":230,"icon":231,"path":232,"stem":233,"children":234,"page":54},"Shared","i-lucide-package","\u002Fbooki-documentation\u002Fshared","3.booki-documentation\u002F4.shared",[235,240],{"title":236,"path":237,"stem":238,"icon":239},"codi-node-utils","\u002Fbooki-documentation\u002Fshared\u002Fcodi-node-utils","3.booki-documentation\u002F4.shared\u002F1.codi-node-utils","i-lucide-wrench",{"title":241,"path":242,"stem":243,"icon":124},"codi-layer","\u002Fbooki-documentation\u002Fshared\u002Fcodi-layer","3.booki-documentation\u002F4.shared\u002F2.codi-layer",{"title":245,"path":246,"stem":247,"children":248,"page":54},"Flowcharts","\u002Fbooki-documentation\u002Fflowcharts","3.booki-documentation\u002F5.flowcharts",[249,253],{"title":250,"path":251,"stem":252,"icon":158},"Owner Booking Management Flow","\u002Fbooki-documentation\u002Fflowcharts\u002Fowner-booking-management","3.booki-documentation\u002F5.flowcharts\u002F1.owner-booking-management",{"title":254,"path":255,"stem":256,"icon":167},"Customer Booking Flow","\u002Fbooki-documentation\u002Fflowcharts\u002Fcustomer-booking-flow","3.booki-documentation\u002F5.flowcharts\u002F2.customer-booking-flow",{"title":258,"path":259,"stem":260,"children":261,"page":54},"Guides","\u002Fbooki-documentation\u002Fguides","3.booki-documentation\u002Fguides",[262,267,271,275,280,285,290,294,298],{"title":263,"path":264,"stem":265,"icon":266},"Guide - Authentication Flow & Sessions","\u002Fbooki-documentation\u002Fguides\u002Fguides-auth-flow","3.booki-documentation\u002Fguides\u002Fguides-auth-flow","i-lucide-lock",{"title":268,"path":269,"stem":270,"icon":177},"Guide - Branch Management","\u002Fbooki-documentation\u002Fguides\u002Fguides-branch-management","3.booki-documentation\u002Fguides\u002Fguides-branch-management",{"title":272,"path":273,"stem":274,"icon":196},"Guide - Customer Payment Methods","\u002Fbooki-documentation\u002Fguides\u002Fguides-customer-payments","3.booki-documentation\u002Fguides\u002Fguides-customer-payments",{"title":276,"path":277,"stem":278,"icon":279},"Guide - Environment Setup","\u002Fbooki-documentation\u002Fguides\u002Fguides-environment-setup","3.booki-documentation\u002Fguides\u002Fguides-environment-setup","i-lucide-settings",{"title":281,"path":282,"stem":283,"icon":284},"Guide - Common Error Responses","\u002Fbooki-documentation\u002Fguides\u002Fguides-errors","3.booki-documentation\u002Fguides\u002Fguides-errors","i-lucide-alert-circle",{"title":286,"path":287,"stem":288,"icon":289},"Guide - Gmail SMTP Setup","\u002Fbooki-documentation\u002Fguides\u002Fguides-gmail-setup","3.booki-documentation\u002Fguides\u002Fguides-gmail-setup","i-lucide-mail",{"title":291,"path":292,"stem":293,"icon":124},"Guide - Multi-Tenancy & Tenant Slug Resolution","\u002Fbooki-documentation\u002Fguides\u002Fguides-multi-tenancy","3.booki-documentation\u002Fguides\u002Fguides-multi-tenancy",{"title":295,"path":296,"stem":297,"icon":48},"Guide - Redis Caching","\u002Fbooki-documentation\u002Fguides\u002Fguides-redis","3.booki-documentation\u002Fguides\u002Fguides-redis",{"title":299,"path":300,"stem":301,"icon":302},"Guide - Subscription Billing","\u002Fbooki-documentation\u002Fguides\u002Fguides-subscription-billing","3.booki-documentation\u002Fguides\u002Fguides-subscription-billing","i-lucide-receipt",{"id":304,"title":281,"body":305,"description":3809,"extension":3810,"links":3811,"meta":3812,"navigation":3813,"path":282,"seo":3814,"stem":283,"__hash__":3815},"docs\u002F3.booki-documentation\u002Fguides\u002Fguides-errors.md",{"type":306,"value":307,"toc":3769},"minimark",[308,312,315,320,323,490,496,520,522,526,531,534,566,570,573,637,641,644,646,650,654,657,662,678,683,787,792,897,902,946,951,1014,1018,1021,1025,1043,1048,1093,1098,1160,1165,1204,1208,1211,1215,1229,1234,1319,1324,1368,1373,1417,1421,1424,1428,1442,1447,1512,1517,1581,1585,1588,1592,1606,1611,1673,1678,1767,1771,1774,1778,1792,1797,1882,1887,2027,2029,2033,2037,2040,2044,2058,2063,2147,2152,2166,2170,2173,2234,2238,2252,2254,2258,2262,2267,2311,2316,2333,2335,2339,2343,2386,2390,2408,2410,2414,2418,2461,2465,2479,2481,2485,2489,2532,2537,2808,2810,2814,2818,2880,2884,2901,2903,2907,2911,2971,2975,2986,2988,2992,2996,3001,3081,3086,3099,3103,3108,3152,3157,3174,3178,3182,3263,3268,3286,3290,3294,3374,3378,3391,3393,3397,3401,3430,3434,3456,3458,3462,3598,3600,3604,3609,3730,3735,3765],[309,310,311],"p",{},"The Booki API uses standard HTTP status codes and consistent error response formats. This guide helps you understand and handle errors.",[313,314],"hr",{},[316,317,319],"h2",{"id":318},"error-response-format","Error Response Format",[309,321,322],{},"All errors follow this standard structure:",[324,325,330],"pre",{"className":326,"code":327,"language":328,"meta":329,"style":329},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"statusCode\": 400,\n  \"message\": \"Validation failed\",\n  \"error\": \"ValidationError\",\n  \"details\": [\n    {\n      \"field\": \"email\",\n      \"message\": \"Invalid email format\"\n    }\n  ]\n}\n","json","",[331,332,333,342,365,388,409,424,430,453,472,478,484],"code",{"__ignoreMap":329},[334,335,338],"span",{"class":336,"line":337},"line",1,[334,339,341],{"class":340},"sMK4o","{\n",[334,343,345,348,352,355,358,362],{"class":336,"line":344},2,[334,346,347],{"class":340},"  \"",[334,349,351],{"class":350},"spNyl","statusCode",[334,353,354],{"class":340},"\"",[334,356,357],{"class":340},":",[334,359,361],{"class":360},"sbssI"," 400",[334,363,364],{"class":340},",\n",[334,366,368,370,373,375,377,380,384,386],{"class":336,"line":367},3,[334,369,347],{"class":340},[334,371,372],{"class":350},"message",[334,374,354],{"class":340},[334,376,357],{"class":340},[334,378,379],{"class":340}," \"",[334,381,383],{"class":382},"sfazB","Validation failed",[334,385,354],{"class":340},[334,387,364],{"class":340},[334,389,391,393,396,398,400,402,405,407],{"class":336,"line":390},4,[334,392,347],{"class":340},[334,394,395],{"class":350},"error",[334,397,354],{"class":340},[334,399,357],{"class":340},[334,401,379],{"class":340},[334,403,404],{"class":382},"ValidationError",[334,406,354],{"class":340},[334,408,364],{"class":340},[334,410,412,414,417,419,421],{"class":336,"line":411},5,[334,413,347],{"class":340},[334,415,416],{"class":350},"details",[334,418,354],{"class":340},[334,420,357],{"class":340},[334,422,423],{"class":340}," [\n",[334,425,427],{"class":336,"line":426},6,[334,428,429],{"class":340},"    {\n",[334,431,433,436,440,442,444,446,449,451],{"class":336,"line":432},7,[334,434,435],{"class":340},"      \"",[334,437,439],{"class":438},"sBMFI","field",[334,441,354],{"class":340},[334,443,357],{"class":340},[334,445,379],{"class":340},[334,447,448],{"class":382},"email",[334,450,354],{"class":340},[334,452,364],{"class":340},[334,454,456,458,460,462,464,466,469],{"class":336,"line":455},8,[334,457,435],{"class":340},[334,459,372],{"class":438},[334,461,354],{"class":340},[334,463,357],{"class":340},[334,465,379],{"class":340},[334,467,468],{"class":382},"Invalid email format",[334,470,471],{"class":340},"\"\n",[334,473,475],{"class":336,"line":474},9,[334,476,477],{"class":340},"    }\n",[334,479,481],{"class":336,"line":480},10,[334,482,483],{"class":340},"  ]\n",[334,485,487],{"class":336,"line":486},11,[334,488,489],{"class":340},"}\n",[309,491,492],{},[493,494,495],"strong",{},"Fields:",[497,498,499,505,510,515],"ul",{},[500,501,502,504],"li",{},[331,503,351],{}," (number): HTTP status code",[500,506,507,509],{},[331,508,372],{}," (string): Human-readable error description",[500,511,512,514],{},[331,513,395],{}," (string): Error type\u002Fcategory",[500,516,517,519],{},[331,518,416],{}," (array, optional): Field-level validation errors",[313,521],{},[316,523,525],{"id":524},"http-status-codes","HTTP Status Codes",[527,528,530],"h3",{"id":529},"_200-ok","200 OK",[309,532,533],{},"Request succeeded. Response contains data.",[324,535,537],{"className":326,"code":536,"language":328,"meta":329,"style":329},"{ \"user\": {...} }\n",[331,538,539],{"__ignoreMap":329},[334,540,541,544,546,549,551,553,556,560,563],{"class":336,"line":337},[334,542,543],{"class":340},"{",[334,545,379],{"class":340},[334,547,548],{"class":350},"user",[334,550,354],{"class":340},[334,552,357],{"class":340},[334,554,555],{"class":340}," {",[334,557,559],{"class":558},"sTEyZ","...",[334,561,562],{"class":340},"}",[334,564,565],{"class":340}," }\n",[527,567,569],{"id":568},"_201-created","201 Created",[309,571,572],{},"Resource successfully created.",[324,574,576],{"className":326,"code":575,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 201,\n  \"message\": \"Booking created successfully\",\n  \"booking\": {...}\n}\n",[331,577,578,582,597,616,633],{"__ignoreMap":329},[334,579,580],{"class":336,"line":337},[334,581,341],{"class":340},[334,583,584,586,588,590,592,595],{"class":336,"line":344},[334,585,347],{"class":340},[334,587,351],{"class":350},[334,589,354],{"class":340},[334,591,357],{"class":340},[334,593,594],{"class":360}," 201",[334,596,364],{"class":340},[334,598,599,601,603,605,607,609,612,614],{"class":336,"line":367},[334,600,347],{"class":340},[334,602,372],{"class":350},[334,604,354],{"class":340},[334,606,357],{"class":340},[334,608,379],{"class":340},[334,610,611],{"class":382},"Booking created successfully",[334,613,354],{"class":340},[334,615,364],{"class":340},[334,617,618,620,623,625,627,629,631],{"class":336,"line":390},[334,619,347],{"class":340},[334,621,622],{"class":350},"booking",[334,624,354],{"class":340},[334,626,357],{"class":340},[334,628,555],{"class":340},[334,630,559],{"class":558},[334,632,489],{"class":340},[334,634,635],{"class":336,"line":411},[334,636,489],{"class":340},[527,638,640],{"id":639},"_204-no-content","204 No Content",[309,642,643],{},"Request succeeded but no data to return (e.g., successful deletion).",[313,645],{},[316,647,649],{"id":648},"_4xx-client-errors","4xx Client Errors",[527,651,653],{"id":652},"_400-bad-request","400 Bad Request",[309,655,656],{},"Client sent invalid data (malformed JSON, validation failure, etc.).",[309,658,659],{},[493,660,661],{},"Causes:",[497,663,664,667,670,673,675],{},[500,665,666],{},"Missing required field",[500,668,669],{},"Invalid data type",[500,671,672],{},"Field length exceeded",[500,674,468],{},[500,676,677],{},"Weak password",[309,679,680],{},[493,681,682],{},"Example: Missing email",[324,684,686],{"className":326,"code":685,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 400,\n  \"message\": \"Validation failed\",\n  \"details\": [\n    {\n      \"field\": \"email\",\n      \"message\": \"Email is required\"\n    }\n  ]\n}\n",[331,687,688,692,706,724,736,740,758,775,779,783],{"__ignoreMap":329},[334,689,690],{"class":336,"line":337},[334,691,341],{"class":340},[334,693,694,696,698,700,702,704],{"class":336,"line":344},[334,695,347],{"class":340},[334,697,351],{"class":350},[334,699,354],{"class":340},[334,701,357],{"class":340},[334,703,361],{"class":360},[334,705,364],{"class":340},[334,707,708,710,712,714,716,718,720,722],{"class":336,"line":367},[334,709,347],{"class":340},[334,711,372],{"class":350},[334,713,354],{"class":340},[334,715,357],{"class":340},[334,717,379],{"class":340},[334,719,383],{"class":382},[334,721,354],{"class":340},[334,723,364],{"class":340},[334,725,726,728,730,732,734],{"class":336,"line":390},[334,727,347],{"class":340},[334,729,416],{"class":350},[334,731,354],{"class":340},[334,733,357],{"class":340},[334,735,423],{"class":340},[334,737,738],{"class":336,"line":411},[334,739,429],{"class":340},[334,741,742,744,746,748,750,752,754,756],{"class":336,"line":426},[334,743,435],{"class":340},[334,745,439],{"class":438},[334,747,354],{"class":340},[334,749,357],{"class":340},[334,751,379],{"class":340},[334,753,448],{"class":382},[334,755,354],{"class":340},[334,757,364],{"class":340},[334,759,760,762,764,766,768,770,773],{"class":336,"line":432},[334,761,435],{"class":340},[334,763,372],{"class":438},[334,765,354],{"class":340},[334,767,357],{"class":340},[334,769,379],{"class":340},[334,771,772],{"class":382},"Email is required",[334,774,471],{"class":340},[334,776,777],{"class":336,"line":455},[334,778,477],{"class":340},[334,780,781],{"class":336,"line":474},[334,782,483],{"class":340},[334,784,785],{"class":336,"line":480},[334,786,489],{"class":340},[309,788,789],{},[493,790,791],{},"Example: Invalid date format",[324,793,795],{"className":326,"code":794,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 400,\n  \"message\": \"Validation failed\",\n  \"details\": [\n    {\n      \"field\": \"bookingDate\",\n      \"message\": \"Must be YYYY-MM-DD format\"\n    }\n  ]\n}\n",[331,796,797,801,815,833,845,849,868,885,889,893],{"__ignoreMap":329},[334,798,799],{"class":336,"line":337},[334,800,341],{"class":340},[334,802,803,805,807,809,811,813],{"class":336,"line":344},[334,804,347],{"class":340},[334,806,351],{"class":350},[334,808,354],{"class":340},[334,810,357],{"class":340},[334,812,361],{"class":360},[334,814,364],{"class":340},[334,816,817,819,821,823,825,827,829,831],{"class":336,"line":367},[334,818,347],{"class":340},[334,820,372],{"class":350},[334,822,354],{"class":340},[334,824,357],{"class":340},[334,826,379],{"class":340},[334,828,383],{"class":382},[334,830,354],{"class":340},[334,832,364],{"class":340},[334,834,835,837,839,841,843],{"class":336,"line":390},[334,836,347],{"class":340},[334,838,416],{"class":350},[334,840,354],{"class":340},[334,842,357],{"class":340},[334,844,423],{"class":340},[334,846,847],{"class":336,"line":411},[334,848,429],{"class":340},[334,850,851,853,855,857,859,861,864,866],{"class":336,"line":426},[334,852,435],{"class":340},[334,854,439],{"class":438},[334,856,354],{"class":340},[334,858,357],{"class":340},[334,860,379],{"class":340},[334,862,863],{"class":382},"bookingDate",[334,865,354],{"class":340},[334,867,364],{"class":340},[334,869,870,872,874,876,878,880,883],{"class":336,"line":432},[334,871,435],{"class":340},[334,873,372],{"class":438},[334,875,354],{"class":340},[334,877,357],{"class":340},[334,879,379],{"class":340},[334,881,882],{"class":382},"Must be YYYY-MM-DD format",[334,884,471],{"class":340},[334,886,887],{"class":336,"line":455},[334,888,477],{"class":340},[334,890,891],{"class":336,"line":474},[334,892,483],{"class":340},[334,894,895],{"class":336,"line":480},[334,896,489],{"class":340},[309,898,899],{},[493,900,901],{},"Example: Weak password",[324,903,905],{"className":326,"code":904,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 400,\n  \"message\": \"Password must contain uppercase, lowercase, number, and special character\"\n}\n",[331,906,907,911,925,942],{"__ignoreMap":329},[334,908,909],{"class":336,"line":337},[334,910,341],{"class":340},[334,912,913,915,917,919,921,923],{"class":336,"line":344},[334,914,347],{"class":340},[334,916,351],{"class":350},[334,918,354],{"class":340},[334,920,357],{"class":340},[334,922,361],{"class":360},[334,924,364],{"class":340},[334,926,927,929,931,933,935,937,940],{"class":336,"line":367},[334,928,347],{"class":340},[334,930,372],{"class":350},[334,932,354],{"class":340},[334,934,357],{"class":340},[334,936,379],{"class":340},[334,938,939],{"class":382},"Password must contain uppercase, lowercase, number, and special character",[334,941,471],{"class":340},[334,943,944],{"class":336,"line":390},[334,945,489],{"class":340},[309,947,948],{},[493,949,950],{},"Example: Invalid JSON body",[324,952,954],{"className":326,"code":953,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 400,\n  \"message\": \"Invalid JSON format\",\n  \"error\": \"ParseError\"\n}\n",[331,955,956,960,974,993,1010],{"__ignoreMap":329},[334,957,958],{"class":336,"line":337},[334,959,341],{"class":340},[334,961,962,964,966,968,970,972],{"class":336,"line":344},[334,963,347],{"class":340},[334,965,351],{"class":350},[334,967,354],{"class":340},[334,969,357],{"class":340},[334,971,361],{"class":360},[334,973,364],{"class":340},[334,975,976,978,980,982,984,986,989,991],{"class":336,"line":367},[334,977,347],{"class":340},[334,979,372],{"class":350},[334,981,354],{"class":340},[334,983,357],{"class":340},[334,985,379],{"class":340},[334,987,988],{"class":382},"Invalid JSON format",[334,990,354],{"class":340},[334,992,364],{"class":340},[334,994,995,997,999,1001,1003,1005,1008],{"class":336,"line":390},[334,996,347],{"class":340},[334,998,395],{"class":350},[334,1000,354],{"class":340},[334,1002,357],{"class":340},[334,1004,379],{"class":340},[334,1006,1007],{"class":382},"ParseError",[334,1009,471],{"class":340},[334,1011,1012],{"class":336,"line":411},[334,1013,489],{"class":340},[527,1015,1017],{"id":1016},"_401-unauthorized","401 Unauthorized",[309,1019,1020],{},"Request lacks valid authentication. Token expired, invalid, or missing.",[309,1022,1023],{},[493,1024,661],{},[497,1026,1027,1034,1037,1040],{},[500,1028,1029,1030,1033],{},"No ",[331,1031,1032],{},"access_token"," cookie",[500,1035,1036],{},"Token expired",[500,1038,1039],{},"Invalid JWT signature",[500,1041,1042],{},"Corrupted token",[309,1044,1045],{},[493,1046,1047],{},"Example: Missing token",[324,1049,1051],{"className":326,"code":1050,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 401,\n  \"message\": \"Unauthorized - no valid token\"\n}\n",[331,1052,1053,1057,1072,1089],{"__ignoreMap":329},[334,1054,1055],{"class":336,"line":337},[334,1056,341],{"class":340},[334,1058,1059,1061,1063,1065,1067,1070],{"class":336,"line":344},[334,1060,347],{"class":340},[334,1062,351],{"class":350},[334,1064,354],{"class":340},[334,1066,357],{"class":340},[334,1068,1069],{"class":360}," 401",[334,1071,364],{"class":340},[334,1073,1074,1076,1078,1080,1082,1084,1087],{"class":336,"line":367},[334,1075,347],{"class":340},[334,1077,372],{"class":350},[334,1079,354],{"class":340},[334,1081,357],{"class":340},[334,1083,379],{"class":340},[334,1085,1086],{"class":382},"Unauthorized - no valid token",[334,1088,471],{"class":340},[334,1090,1091],{"class":336,"line":390},[334,1092,489],{"class":340},[309,1094,1095],{},[493,1096,1097],{},"Example: Expired token",[324,1099,1101],{"className":326,"code":1100,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 401,\n  \"message\": \"Token expired\",\n  \"error\": \"TokenExpiredError\"\n}\n",[331,1102,1103,1107,1121,1139,1156],{"__ignoreMap":329},[334,1104,1105],{"class":336,"line":337},[334,1106,341],{"class":340},[334,1108,1109,1111,1113,1115,1117,1119],{"class":336,"line":344},[334,1110,347],{"class":340},[334,1112,351],{"class":350},[334,1114,354],{"class":340},[334,1116,357],{"class":340},[334,1118,1069],{"class":360},[334,1120,364],{"class":340},[334,1122,1123,1125,1127,1129,1131,1133,1135,1137],{"class":336,"line":367},[334,1124,347],{"class":340},[334,1126,372],{"class":350},[334,1128,354],{"class":340},[334,1130,357],{"class":340},[334,1132,379],{"class":340},[334,1134,1036],{"class":382},[334,1136,354],{"class":340},[334,1138,364],{"class":340},[334,1140,1141,1143,1145,1147,1149,1151,1154],{"class":336,"line":390},[334,1142,347],{"class":340},[334,1144,395],{"class":350},[334,1146,354],{"class":340},[334,1148,357],{"class":340},[334,1150,379],{"class":340},[334,1152,1153],{"class":382},"TokenExpiredError",[334,1155,471],{"class":340},[334,1157,1158],{"class":336,"line":411},[334,1159,489],{"class":340},[309,1161,1162],{},[493,1163,1164],{},"Recovery:",[324,1166,1170],{"className":1167,"code":1168,"language":1169,"meta":329,"style":329},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Try refreshing token\nPOST \u002Fapi\u002Fauth\u002Frefresh\n\n# If refresh fails, user must re-login\nPOST \u002Fapi\u002Fauth\u002Flogin\n","bash",[331,1171,1172,1178,1186,1192,1197],{"__ignoreMap":329},[334,1173,1174],{"class":336,"line":337},[334,1175,1177],{"class":1176},"sHwdD","# Try refreshing token\n",[334,1179,1180,1183],{"class":336,"line":344},[334,1181,1182],{"class":438},"POST",[334,1184,1185],{"class":382}," \u002Fapi\u002Fauth\u002Frefresh\n",[334,1187,1188],{"class":336,"line":367},[334,1189,1191],{"emptyLinePlaceholder":1190},true,"\n",[334,1193,1194],{"class":336,"line":390},[334,1195,1196],{"class":1176},"# If refresh fails, user must re-login\n",[334,1198,1199,1201],{"class":336,"line":411},[334,1200,1182],{"class":438},[334,1202,1203],{"class":382}," \u002Fapi\u002Fauth\u002Flogin\n",[527,1205,1207],{"id":1206},"_403-forbidden","403 Forbidden",[309,1209,1210],{},"User authenticated but lacks permission for this resource.",[309,1212,1213],{},[493,1214,661],{},[497,1216,1217,1220,1223,1226],{},[500,1218,1219],{},"User role doesn't match required role",[500,1221,1222],{},"Wrong tenant access",[500,1224,1225],{},"User is suspended",[500,1227,1228],{},"Insufficient permissions",[309,1230,1231],{},[493,1232,1233],{},"Example: Wrong role",[324,1235,1237],{"className":326,"code":1236,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 403,\n  \"message\": \"Forbidden - admin role required\",\n  \"requiredRole\": \"ADMIN\",\n  \"userRole\": \"CUSTOMER\"\n}\n",[331,1238,1239,1243,1258,1277,1297,1315],{"__ignoreMap":329},[334,1240,1241],{"class":336,"line":337},[334,1242,341],{"class":340},[334,1244,1245,1247,1249,1251,1253,1256],{"class":336,"line":344},[334,1246,347],{"class":340},[334,1248,351],{"class":350},[334,1250,354],{"class":340},[334,1252,357],{"class":340},[334,1254,1255],{"class":360}," 403",[334,1257,364],{"class":340},[334,1259,1260,1262,1264,1266,1268,1270,1273,1275],{"class":336,"line":367},[334,1261,347],{"class":340},[334,1263,372],{"class":350},[334,1265,354],{"class":340},[334,1267,357],{"class":340},[334,1269,379],{"class":340},[334,1271,1272],{"class":382},"Forbidden - admin role required",[334,1274,354],{"class":340},[334,1276,364],{"class":340},[334,1278,1279,1281,1284,1286,1288,1290,1293,1295],{"class":336,"line":390},[334,1280,347],{"class":340},[334,1282,1283],{"class":350},"requiredRole",[334,1285,354],{"class":340},[334,1287,357],{"class":340},[334,1289,379],{"class":340},[334,1291,1292],{"class":382},"ADMIN",[334,1294,354],{"class":340},[334,1296,364],{"class":340},[334,1298,1299,1301,1304,1306,1308,1310,1313],{"class":336,"line":411},[334,1300,347],{"class":340},[334,1302,1303],{"class":350},"userRole",[334,1305,354],{"class":340},[334,1307,357],{"class":340},[334,1309,379],{"class":340},[334,1311,1312],{"class":382},"CUSTOMER",[334,1314,471],{"class":340},[334,1316,1317],{"class":336,"line":426},[334,1318,489],{"class":340},[309,1320,1321],{},[493,1322,1323],{},"Example: Tenant mismatch",[324,1325,1327],{"className":326,"code":1326,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 403,\n  \"message\": \"Access denied - tenant mismatch\"\n}\n",[331,1328,1329,1333,1347,1364],{"__ignoreMap":329},[334,1330,1331],{"class":336,"line":337},[334,1332,341],{"class":340},[334,1334,1335,1337,1339,1341,1343,1345],{"class":336,"line":344},[334,1336,347],{"class":340},[334,1338,351],{"class":350},[334,1340,354],{"class":340},[334,1342,357],{"class":340},[334,1344,1255],{"class":360},[334,1346,364],{"class":340},[334,1348,1349,1351,1353,1355,1357,1359,1362],{"class":336,"line":367},[334,1350,347],{"class":340},[334,1352,372],{"class":350},[334,1354,354],{"class":340},[334,1356,357],{"class":340},[334,1358,379],{"class":340},[334,1360,1361],{"class":382},"Access denied - tenant mismatch",[334,1363,471],{"class":340},[334,1365,1366],{"class":336,"line":390},[334,1367,489],{"class":340},[309,1369,1370],{},[493,1371,1372],{},"Example: User suspended",[324,1374,1376],{"className":326,"code":1375,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 403,\n  \"message\": \"User account is suspended\"\n}\n",[331,1377,1378,1382,1396,1413],{"__ignoreMap":329},[334,1379,1380],{"class":336,"line":337},[334,1381,341],{"class":340},[334,1383,1384,1386,1388,1390,1392,1394],{"class":336,"line":344},[334,1385,347],{"class":340},[334,1387,351],{"class":350},[334,1389,354],{"class":340},[334,1391,357],{"class":340},[334,1393,1255],{"class":360},[334,1395,364],{"class":340},[334,1397,1398,1400,1402,1404,1406,1408,1411],{"class":336,"line":367},[334,1399,347],{"class":340},[334,1401,372],{"class":350},[334,1403,354],{"class":340},[334,1405,357],{"class":340},[334,1407,379],{"class":340},[334,1409,1410],{"class":382},"User account is suspended",[334,1412,471],{"class":340},[334,1414,1415],{"class":336,"line":390},[334,1416,489],{"class":340},[527,1418,1420],{"id":1419},"_404-not-found","404 Not Found",[309,1422,1423],{},"Resource doesn't exist or user doesn't have access to it.",[309,1425,1426],{},[493,1427,661],{},[497,1429,1430,1433,1436,1439],{},[500,1431,1432],{},"Invalid ID format",[500,1434,1435],{},"Resource deleted",[500,1437,1438],{},"Wrong organization scope",[500,1440,1441],{},"Resource never existed",[309,1443,1444],{},[493,1445,1446],{},"Example: Booking not found",[324,1448,1450],{"className":326,"code":1449,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 404,\n  \"message\": \"Booking not found\",\n  \"resourceId\": \"507f191e810c19729de860ea\"\n}\n",[331,1451,1452,1456,1471,1490,1508],{"__ignoreMap":329},[334,1453,1454],{"class":336,"line":337},[334,1455,341],{"class":340},[334,1457,1458,1460,1462,1464,1466,1469],{"class":336,"line":344},[334,1459,347],{"class":340},[334,1461,351],{"class":350},[334,1463,354],{"class":340},[334,1465,357],{"class":340},[334,1467,1468],{"class":360}," 404",[334,1470,364],{"class":340},[334,1472,1473,1475,1477,1479,1481,1483,1486,1488],{"class":336,"line":367},[334,1474,347],{"class":340},[334,1476,372],{"class":350},[334,1478,354],{"class":340},[334,1480,357],{"class":340},[334,1482,379],{"class":340},[334,1484,1485],{"class":382},"Booking not found",[334,1487,354],{"class":340},[334,1489,364],{"class":340},[334,1491,1492,1494,1497,1499,1501,1503,1506],{"class":336,"line":390},[334,1493,347],{"class":340},[334,1495,1496],{"class":350},"resourceId",[334,1498,354],{"class":340},[334,1500,357],{"class":340},[334,1502,379],{"class":340},[334,1504,1505],{"class":382},"507f191e810c19729de860ea",[334,1507,471],{"class":340},[334,1509,1510],{"class":336,"line":411},[334,1511,489],{"class":340},[309,1513,1514],{},[493,1515,1516],{},"Example: Organization not found",[324,1518,1520],{"className":326,"code":1519,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 404,\n  \"message\": \"Organization not found\",\n  \"slug\": \"booki-salon\"\n}\n",[331,1521,1522,1526,1540,1559,1577],{"__ignoreMap":329},[334,1523,1524],{"class":336,"line":337},[334,1525,341],{"class":340},[334,1527,1528,1530,1532,1534,1536,1538],{"class":336,"line":344},[334,1529,347],{"class":340},[334,1531,351],{"class":350},[334,1533,354],{"class":340},[334,1535,357],{"class":340},[334,1537,1468],{"class":360},[334,1539,364],{"class":340},[334,1541,1542,1544,1546,1548,1550,1552,1555,1557],{"class":336,"line":367},[334,1543,347],{"class":340},[334,1545,372],{"class":350},[334,1547,354],{"class":340},[334,1549,357],{"class":340},[334,1551,379],{"class":340},[334,1553,1554],{"class":382},"Organization not found",[334,1556,354],{"class":340},[334,1558,364],{"class":340},[334,1560,1561,1563,1566,1568,1570,1572,1575],{"class":336,"line":390},[334,1562,347],{"class":340},[334,1564,1565],{"class":350},"slug",[334,1567,354],{"class":340},[334,1569,357],{"class":340},[334,1571,379],{"class":340},[334,1573,1574],{"class":382},"booki-salon",[334,1576,471],{"class":340},[334,1578,1579],{"class":336,"line":411},[334,1580,489],{"class":340},[527,1582,1584],{"id":1583},"_409-conflict","409 Conflict",[309,1586,1587],{},"Request conflicts with current state (duplicate entry, already exists, etc.).",[309,1589,1590],{},[493,1591,661],{},[497,1593,1594,1597,1600,1603],{},[500,1595,1596],{},"Email already registered",[500,1598,1599],{},"Organization slug taken",[500,1601,1602],{},"Double-booking conflict",[500,1604,1605],{},"Invalid state transition",[309,1607,1608],{},[493,1609,1610],{},"Example: Duplicate email",[324,1612,1614],{"className":326,"code":1613,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 409,\n  \"message\": \"Email already registered\",\n  \"field\": \"email\"\n}\n",[331,1615,1616,1620,1635,1653,1669],{"__ignoreMap":329},[334,1617,1618],{"class":336,"line":337},[334,1619,341],{"class":340},[334,1621,1622,1624,1626,1628,1630,1633],{"class":336,"line":344},[334,1623,347],{"class":340},[334,1625,351],{"class":350},[334,1627,354],{"class":340},[334,1629,357],{"class":340},[334,1631,1632],{"class":360}," 409",[334,1634,364],{"class":340},[334,1636,1637,1639,1641,1643,1645,1647,1649,1651],{"class":336,"line":367},[334,1638,347],{"class":340},[334,1640,372],{"class":350},[334,1642,354],{"class":340},[334,1644,357],{"class":340},[334,1646,379],{"class":340},[334,1648,1596],{"class":382},[334,1650,354],{"class":340},[334,1652,364],{"class":340},[334,1654,1655,1657,1659,1661,1663,1665,1667],{"class":336,"line":390},[334,1656,347],{"class":340},[334,1658,439],{"class":350},[334,1660,354],{"class":340},[334,1662,357],{"class":340},[334,1664,379],{"class":340},[334,1666,448],{"class":382},[334,1668,471],{"class":340},[334,1670,1671],{"class":336,"line":411},[334,1672,489],{"class":340},[309,1674,1675],{},[493,1676,1677],{},"Example: Double booking",[324,1679,1681],{"className":326,"code":1680,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 409,\n  \"message\": \"This time slot is no longer available\",\n  \"suggestedTimes\": [\"14:00\", \"14:30\", \"15:00\"]\n}\n",[331,1682,1683,1687,1701,1720,1763],{"__ignoreMap":329},[334,1684,1685],{"class":336,"line":337},[334,1686,341],{"class":340},[334,1688,1689,1691,1693,1695,1697,1699],{"class":336,"line":344},[334,1690,347],{"class":340},[334,1692,351],{"class":350},[334,1694,354],{"class":340},[334,1696,357],{"class":340},[334,1698,1632],{"class":360},[334,1700,364],{"class":340},[334,1702,1703,1705,1707,1709,1711,1713,1716,1718],{"class":336,"line":367},[334,1704,347],{"class":340},[334,1706,372],{"class":350},[334,1708,354],{"class":340},[334,1710,357],{"class":340},[334,1712,379],{"class":340},[334,1714,1715],{"class":382},"This time slot is no longer available",[334,1717,354],{"class":340},[334,1719,364],{"class":340},[334,1721,1722,1724,1727,1729,1731,1734,1736,1739,1741,1744,1746,1749,1751,1753,1755,1758,1760],{"class":336,"line":390},[334,1723,347],{"class":340},[334,1725,1726],{"class":350},"suggestedTimes",[334,1728,354],{"class":340},[334,1730,357],{"class":340},[334,1732,1733],{"class":340}," [",[334,1735,354],{"class":340},[334,1737,1738],{"class":382},"14:00",[334,1740,354],{"class":340},[334,1742,1743],{"class":340},",",[334,1745,379],{"class":340},[334,1747,1748],{"class":382},"14:30",[334,1750,354],{"class":340},[334,1752,1743],{"class":340},[334,1754,379],{"class":340},[334,1756,1757],{"class":382},"15:00",[334,1759,354],{"class":340},[334,1761,1762],{"class":340},"]\n",[334,1764,1765],{"class":336,"line":411},[334,1766,489],{"class":340},[527,1768,1770],{"id":1769},"_422-unprocessable-entity","422 Unprocessable Entity",[309,1772,1773],{},"Request is well-formed but cannot be processed due to business logic.",[309,1775,1776],{},[493,1777,661],{},[497,1779,1780,1783,1786,1789],{},[500,1781,1782],{},"Invalid booking date (past date)",[500,1784,1785],{},"Insufficient funds",[500,1787,1788],{},"Resource limit exceeded",[500,1790,1791],{},"Invalid state transition (e.g., confirm already-declined booking)",[309,1793,1794],{},[493,1795,1796],{},"Example: Booking in past",[324,1798,1800],{"className":326,"code":1799,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 422,\n  \"message\": \"Cannot book in the past\",\n  \"providedDate\": \"2026-02-01\",\n  \"currentDate\": \"2026-04-01\"\n}\n",[331,1801,1802,1806,1821,1840,1860,1878],{"__ignoreMap":329},[334,1803,1804],{"class":336,"line":337},[334,1805,341],{"class":340},[334,1807,1808,1810,1812,1814,1816,1819],{"class":336,"line":344},[334,1809,347],{"class":340},[334,1811,351],{"class":350},[334,1813,354],{"class":340},[334,1815,357],{"class":340},[334,1817,1818],{"class":360}," 422",[334,1820,364],{"class":340},[334,1822,1823,1825,1827,1829,1831,1833,1836,1838],{"class":336,"line":367},[334,1824,347],{"class":340},[334,1826,372],{"class":350},[334,1828,354],{"class":340},[334,1830,357],{"class":340},[334,1832,379],{"class":340},[334,1834,1835],{"class":382},"Cannot book in the past",[334,1837,354],{"class":340},[334,1839,364],{"class":340},[334,1841,1842,1844,1847,1849,1851,1853,1856,1858],{"class":336,"line":390},[334,1843,347],{"class":340},[334,1845,1846],{"class":350},"providedDate",[334,1848,354],{"class":340},[334,1850,357],{"class":340},[334,1852,379],{"class":340},[334,1854,1855],{"class":382},"2026-02-01",[334,1857,354],{"class":340},[334,1859,364],{"class":340},[334,1861,1862,1864,1867,1869,1871,1873,1876],{"class":336,"line":411},[334,1863,347],{"class":340},[334,1865,1866],{"class":350},"currentDate",[334,1868,354],{"class":340},[334,1870,357],{"class":340},[334,1872,379],{"class":340},[334,1874,1875],{"class":382},"2026-04-01",[334,1877,471],{"class":340},[334,1879,1880],{"class":336,"line":426},[334,1881,489],{"class":340},[309,1883,1884],{},[493,1885,1886],{},"Example: Time slot fully booked",[324,1888,1890],{"className":326,"code":1889,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 422,\n  \"message\": \"This time slot is fully booked\",\n  \"availableSlots\": [\n    { \"date\": \"2026-04-11\", \"time\": \"14:00\" },\n    { \"date\": \"2026-04-11\", \"time\": \"14:30\" }\n  ]\n}\n",[331,1891,1892,1896,1910,1929,1942,1983,2019,2023],{"__ignoreMap":329},[334,1893,1894],{"class":336,"line":337},[334,1895,341],{"class":340},[334,1897,1898,1900,1902,1904,1906,1908],{"class":336,"line":344},[334,1899,347],{"class":340},[334,1901,351],{"class":350},[334,1903,354],{"class":340},[334,1905,357],{"class":340},[334,1907,1818],{"class":360},[334,1909,364],{"class":340},[334,1911,1912,1914,1916,1918,1920,1922,1925,1927],{"class":336,"line":367},[334,1913,347],{"class":340},[334,1915,372],{"class":350},[334,1917,354],{"class":340},[334,1919,357],{"class":340},[334,1921,379],{"class":340},[334,1923,1924],{"class":382},"This time slot is fully booked",[334,1926,354],{"class":340},[334,1928,364],{"class":340},[334,1930,1931,1933,1936,1938,1940],{"class":336,"line":390},[334,1932,347],{"class":340},[334,1934,1935],{"class":350},"availableSlots",[334,1937,354],{"class":340},[334,1939,357],{"class":340},[334,1941,423],{"class":340},[334,1943,1944,1947,1949,1952,1954,1956,1958,1961,1963,1965,1967,1970,1972,1974,1976,1978,1980],{"class":336,"line":411},[334,1945,1946],{"class":340},"    {",[334,1948,379],{"class":340},[334,1950,1951],{"class":438},"date",[334,1953,354],{"class":340},[334,1955,357],{"class":340},[334,1957,379],{"class":340},[334,1959,1960],{"class":382},"2026-04-11",[334,1962,354],{"class":340},[334,1964,1743],{"class":340},[334,1966,379],{"class":340},[334,1968,1969],{"class":438},"time",[334,1971,354],{"class":340},[334,1973,357],{"class":340},[334,1975,379],{"class":340},[334,1977,1738],{"class":382},[334,1979,354],{"class":340},[334,1981,1982],{"class":340}," },\n",[334,1984,1985,1987,1989,1991,1993,1995,1997,1999,2001,2003,2005,2007,2009,2011,2013,2015,2017],{"class":336,"line":426},[334,1986,1946],{"class":340},[334,1988,379],{"class":340},[334,1990,1951],{"class":438},[334,1992,354],{"class":340},[334,1994,357],{"class":340},[334,1996,379],{"class":340},[334,1998,1960],{"class":382},[334,2000,354],{"class":340},[334,2002,1743],{"class":340},[334,2004,379],{"class":340},[334,2006,1969],{"class":438},[334,2008,354],{"class":340},[334,2010,357],{"class":340},[334,2012,379],{"class":340},[334,2014,1748],{"class":382},[334,2016,354],{"class":340},[334,2018,565],{"class":340},[334,2020,2021],{"class":336,"line":432},[334,2022,483],{"class":340},[334,2024,2025],{"class":336,"line":455},[334,2026,489],{"class":340},[313,2028],{},[316,2030,2032],{"id":2031},"_5xx-server-errors","5xx Server Errors",[527,2034,2036],{"id":2035},"_500-internal-server-error","500 Internal Server Error",[309,2038,2039],{},"Server encountered unexpected error. Not client's fault.",[309,2041,2042],{},[493,2043,661],{},[497,2045,2046,2049,2052,2055],{},[500,2047,2048],{},"Database connection error",[500,2050,2051],{},"Unhandled exception",[500,2053,2054],{},"Deployment issue",[500,2056,2057],{},"Third-party service (payment gateway) failure",[309,2059,2060],{},[493,2061,2062],{},"Example:",[324,2064,2066],{"className":326,"code":2065,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 500,\n  \"message\": \"Internal server error\",\n  \"error\": \"DatabaseError\",\n  \"requestId\": \"req-abc123xyz\"\n}\n",[331,2067,2068,2072,2087,2106,2125,2143],{"__ignoreMap":329},[334,2069,2070],{"class":336,"line":337},[334,2071,341],{"class":340},[334,2073,2074,2076,2078,2080,2082,2085],{"class":336,"line":344},[334,2075,347],{"class":340},[334,2077,351],{"class":350},[334,2079,354],{"class":340},[334,2081,357],{"class":340},[334,2083,2084],{"class":360}," 500",[334,2086,364],{"class":340},[334,2088,2089,2091,2093,2095,2097,2099,2102,2104],{"class":336,"line":367},[334,2090,347],{"class":340},[334,2092,372],{"class":350},[334,2094,354],{"class":340},[334,2096,357],{"class":340},[334,2098,379],{"class":340},[334,2100,2101],{"class":382},"Internal server error",[334,2103,354],{"class":340},[334,2105,364],{"class":340},[334,2107,2108,2110,2112,2114,2116,2118,2121,2123],{"class":336,"line":390},[334,2109,347],{"class":340},[334,2111,395],{"class":350},[334,2113,354],{"class":340},[334,2115,357],{"class":340},[334,2117,379],{"class":340},[334,2119,2120],{"class":382},"DatabaseError",[334,2122,354],{"class":340},[334,2124,364],{"class":340},[334,2126,2127,2129,2132,2134,2136,2138,2141],{"class":336,"line":411},[334,2128,347],{"class":340},[334,2130,2131],{"class":350},"requestId",[334,2133,354],{"class":340},[334,2135,357],{"class":340},[334,2137,379],{"class":340},[334,2139,2140],{"class":382},"req-abc123xyz",[334,2142,471],{"class":340},[334,2144,2145],{"class":336,"line":426},[334,2146,489],{"class":340},[309,2148,2149],{},[493,2150,2151],{},"What to do:",[497,2153,2154,2160,2163],{},[500,2155,2156,2157,2159],{},"Check ",[331,2158,2131],{}," to report to support",[500,2161,2162],{},"Retry after a few seconds",[500,2164,2165],{},"Avoid making repeated rapid requests",[527,2167,2169],{"id":2168},"_503-service-unavailable","503 Service Unavailable",[309,2171,2172],{},"Server temporarily unavailable (maintenance, overload).",[324,2174,2176],{"className":326,"code":2175,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 503,\n  \"message\": \"Service temporarily unavailable\",\n  \"retryAfter\": 300\n}\n",[331,2177,2178,2182,2197,2216,2230],{"__ignoreMap":329},[334,2179,2180],{"class":336,"line":337},[334,2181,341],{"class":340},[334,2183,2184,2186,2188,2190,2192,2195],{"class":336,"line":344},[334,2185,347],{"class":340},[334,2187,351],{"class":350},[334,2189,354],{"class":340},[334,2191,357],{"class":340},[334,2193,2194],{"class":360}," 503",[334,2196,364],{"class":340},[334,2198,2199,2201,2203,2205,2207,2209,2212,2214],{"class":336,"line":367},[334,2200,347],{"class":340},[334,2202,372],{"class":350},[334,2204,354],{"class":340},[334,2206,357],{"class":340},[334,2208,379],{"class":340},[334,2210,2211],{"class":382},"Service temporarily unavailable",[334,2213,354],{"class":340},[334,2215,364],{"class":340},[334,2217,2218,2220,2223,2225,2227],{"class":336,"line":390},[334,2219,347],{"class":340},[334,2221,2222],{"class":350},"retryAfter",[334,2224,354],{"class":340},[334,2226,357],{"class":340},[334,2228,2229],{"class":360}," 300\n",[334,2231,2232],{"class":336,"line":411},[334,2233,489],{"class":340},[309,2235,2236],{},[493,2237,2151],{},[497,2239,2240,2246,2249],{},[500,2241,2242,2243,2245],{},"Wait ",[331,2244,2222],{}," seconds",[500,2247,2248],{},"Retry request",[500,2250,2251],{},"Check status page",[313,2253],{},[316,2255,2257],{"id":2256},"common-error-scenarios-solutions","Common Error Scenarios & Solutions",[527,2259,2261],{"id":2260},"scenario-1-login-fails","Scenario 1: Login Fails",[309,2263,2264],{},[493,2265,2266],{},"Error:",[324,2268,2270],{"className":326,"code":2269,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 400,\n  \"message\": \"Invalid email or password\"\n}\n",[331,2271,2272,2276,2290,2307],{"__ignoreMap":329},[334,2273,2274],{"class":336,"line":337},[334,2275,341],{"class":340},[334,2277,2278,2280,2282,2284,2286,2288],{"class":336,"line":344},[334,2279,347],{"class":340},[334,2281,351],{"class":350},[334,2283,354],{"class":340},[334,2285,357],{"class":340},[334,2287,361],{"class":360},[334,2289,364],{"class":340},[334,2291,2292,2294,2296,2298,2300,2302,2305],{"class":336,"line":367},[334,2293,347],{"class":340},[334,2295,372],{"class":350},[334,2297,354],{"class":340},[334,2299,357],{"class":340},[334,2301,379],{"class":340},[334,2303,2304],{"class":382},"Invalid email or password",[334,2306,471],{"class":340},[334,2308,2309],{"class":336,"line":390},[334,2310,489],{"class":340},[309,2312,2313],{},[493,2314,2315],{},"Troubleshoot:",[497,2317,2318,2321,2324,2327,2330],{},[500,2319,2320],{},"✅ Verify email is correct",[500,2322,2323],{},"✅ Check caps lock",[500,2325,2326],{},"✅ Verify password (case-sensitive)",[500,2328,2329],{},"✅ If forgot password, use password reset",[500,2331,2332],{},"✅ Contact support if locked out",[313,2334],{},[527,2336,2338],{"id":2337},"scenario-2-booking-creation-fails","Scenario 2: Booking Creation Fails",[309,2340,2341],{},[493,2342,2266],{},[324,2344,2346],{"className":326,"code":2345,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 422,\n  \"message\": \"This time slot is no longer available\"\n}\n",[331,2347,2348,2352,2366,2382],{"__ignoreMap":329},[334,2349,2350],{"class":336,"line":337},[334,2351,341],{"class":340},[334,2353,2354,2356,2358,2360,2362,2364],{"class":336,"line":344},[334,2355,347],{"class":340},[334,2357,351],{"class":350},[334,2359,354],{"class":340},[334,2361,357],{"class":340},[334,2363,1818],{"class":360},[334,2365,364],{"class":340},[334,2367,2368,2370,2372,2374,2376,2378,2380],{"class":336,"line":367},[334,2369,347],{"class":340},[334,2371,372],{"class":350},[334,2373,354],{"class":340},[334,2375,357],{"class":340},[334,2377,379],{"class":340},[334,2379,1715],{"class":382},[334,2381,471],{"class":340},[334,2383,2384],{"class":336,"line":390},[334,2385,489],{"class":340},[309,2387,2388],{},[493,2389,2315],{},[497,2391,2392,2395,2402,2405],{},[500,2393,2394],{},"✅ Check another time",[500,2396,2397,2398,2401],{},"✅ Use ",[331,2399,2400],{},"GET \u002Fapi\u002Fbookings\u002Ffully-booked-slots"," to see availability",[500,2403,2404],{},"✅ Try different date",[500,2406,2407],{},"✅ Call organization directly for walk-in availability",[313,2409],{},[527,2411,2413],{"id":2412},"scenario-3-permission-denied","Scenario 3: Permission Denied",[309,2415,2416],{},[493,2417,2266],{},[324,2419,2421],{"className":326,"code":2420,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 403,\n  \"message\": \"Forbidden - admin role required\"\n}\n",[331,2422,2423,2427,2441,2457],{"__ignoreMap":329},[334,2424,2425],{"class":336,"line":337},[334,2426,341],{"class":340},[334,2428,2429,2431,2433,2435,2437,2439],{"class":336,"line":344},[334,2430,347],{"class":340},[334,2432,351],{"class":350},[334,2434,354],{"class":340},[334,2436,357],{"class":340},[334,2438,1255],{"class":360},[334,2440,364],{"class":340},[334,2442,2443,2445,2447,2449,2451,2453,2455],{"class":336,"line":367},[334,2444,347],{"class":340},[334,2446,372],{"class":350},[334,2448,354],{"class":340},[334,2450,357],{"class":340},[334,2452,379],{"class":340},[334,2454,1272],{"class":382},[334,2456,471],{"class":340},[334,2458,2459],{"class":336,"line":390},[334,2460,489],{"class":340},[309,2462,2463],{},[493,2464,2315],{},[497,2466,2467,2470,2473,2476],{},[500,2468,2469],{},"✅ Verify you're logged in as correct user",[500,2471,2472],{},"✅ Check your role matches endpoint requirements",[500,2474,2475],{},"✅ For owner operations, ensure you're viewing your own organization",[500,2477,2478],{},"✅ Contact organization owner if you need role upgrade",[313,2480],{},[527,2482,2484],{"id":2483},"scenario-4-token-expired-mid-request","Scenario 4: Token Expired Mid-Request",[309,2486,2487],{},[493,2488,2266],{},[324,2490,2492],{"className":326,"code":2491,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 401,\n  \"message\": \"Token expired\"\n}\n",[331,2493,2494,2498,2512,2528],{"__ignoreMap":329},[334,2495,2496],{"class":336,"line":337},[334,2497,341],{"class":340},[334,2499,2500,2502,2504,2506,2508,2510],{"class":336,"line":344},[334,2501,347],{"class":340},[334,2503,351],{"class":350},[334,2505,354],{"class":340},[334,2507,357],{"class":340},[334,2509,1069],{"class":360},[334,2511,364],{"class":340},[334,2513,2514,2516,2518,2520,2522,2524,2526],{"class":336,"line":367},[334,2515,347],{"class":340},[334,2517,372],{"class":350},[334,2519,354],{"class":340},[334,2521,357],{"class":340},[334,2523,379],{"class":340},[334,2525,1036],{"class":382},[334,2527,471],{"class":340},[334,2529,2530],{"class":336,"line":390},[334,2531,489],{"class":340},[309,2533,2534],{},[493,2535,2536],{},"Troubleshoot (Frontend):",[324,2538,2542],{"className":2539,"code":2540,"language":2541,"meta":329,"style":329},"language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F Detect the 401\nconst response = await fetch('\u002Fapi\u002Fbookings');\n\nif (response.status === 401) {\n  \u002F\u002F Try to refresh\n  const refreshed = await fetch('\u002Fapi\u002Fauth\u002Frefresh', {\n    method: 'POST',\n    credentials: 'include'  \u002F\u002F Include cookies\n  });\n  \n  if (refreshed.ok) {\n    \u002F\u002F Retry original request with new token\n    const retry = await fetch('\u002Fapi\u002Fbookings');\n    \u002F\u002F Continue...\n  } else {\n    \u002F\u002F Redirect to login\n    window.location.href = '\u002Flogin';\n  }\n}\n","javascript",[331,2543,2544,2549,2585,2589,2613,2618,2648,2664,2681,2690,2695,2715,2721,2748,2754,2764,2770,2797,2803],{"__ignoreMap":329},[334,2545,2546],{"class":336,"line":337},[334,2547,2548],{"class":1176},"\u002F\u002F Detect the 401\n",[334,2550,2551,2554,2557,2560,2564,2568,2571,2574,2577,2579,2582],{"class":336,"line":344},[334,2552,2553],{"class":350},"const",[334,2555,2556],{"class":558}," response ",[334,2558,2559],{"class":340},"=",[334,2561,2563],{"class":2562},"s7zQu"," await",[334,2565,2567],{"class":2566},"s2Zo4"," fetch",[334,2569,2570],{"class":558},"(",[334,2572,2573],{"class":340},"'",[334,2575,2576],{"class":382},"\u002Fapi\u002Fbookings",[334,2578,2573],{"class":340},[334,2580,2581],{"class":558},")",[334,2583,2584],{"class":340},";\n",[334,2586,2587],{"class":336,"line":367},[334,2588,1191],{"emptyLinePlaceholder":1190},[334,2590,2591,2594,2597,2600,2603,2606,2608,2611],{"class":336,"line":390},[334,2592,2593],{"class":2562},"if",[334,2595,2596],{"class":558}," (response",[334,2598,2599],{"class":340},".",[334,2601,2602],{"class":558},"status ",[334,2604,2605],{"class":340},"===",[334,2607,1069],{"class":360},[334,2609,2610],{"class":558},") ",[334,2612,341],{"class":340},[334,2614,2615],{"class":336,"line":411},[334,2616,2617],{"class":1176},"  \u002F\u002F Try to refresh\n",[334,2619,2620,2623,2626,2629,2631,2633,2636,2638,2641,2643,2645],{"class":336,"line":426},[334,2621,2622],{"class":350},"  const",[334,2624,2625],{"class":558}," refreshed",[334,2627,2628],{"class":340}," =",[334,2630,2563],{"class":2562},[334,2632,2567],{"class":2566},[334,2634,2570],{"class":2635},"swJcz",[334,2637,2573],{"class":340},[334,2639,2640],{"class":382},"\u002Fapi\u002Fauth\u002Frefresh",[334,2642,2573],{"class":340},[334,2644,1743],{"class":340},[334,2646,2647],{"class":340}," {\n",[334,2649,2650,2653,2655,2658,2660,2662],{"class":336,"line":432},[334,2651,2652],{"class":2635},"    method",[334,2654,357],{"class":340},[334,2656,2657],{"class":340}," '",[334,2659,1182],{"class":382},[334,2661,2573],{"class":340},[334,2663,364],{"class":340},[334,2665,2666,2669,2671,2673,2676,2678],{"class":336,"line":455},[334,2667,2668],{"class":2635},"    credentials",[334,2670,357],{"class":340},[334,2672,2657],{"class":340},[334,2674,2675],{"class":382},"include",[334,2677,2573],{"class":340},[334,2679,2680],{"class":1176},"  \u002F\u002F Include cookies\n",[334,2682,2683,2686,2688],{"class":336,"line":474},[334,2684,2685],{"class":340},"  }",[334,2687,2581],{"class":2635},[334,2689,2584],{"class":340},[334,2691,2692],{"class":336,"line":480},[334,2693,2694],{"class":2635},"  \n",[334,2696,2697,2700,2703,2706,2708,2711,2713],{"class":336,"line":486},[334,2698,2699],{"class":2562},"  if",[334,2701,2702],{"class":2635}," (",[334,2704,2705],{"class":558},"refreshed",[334,2707,2599],{"class":340},[334,2709,2710],{"class":558},"ok",[334,2712,2610],{"class":2635},[334,2714,341],{"class":340},[334,2716,2718],{"class":336,"line":2717},12,[334,2719,2720],{"class":1176},"    \u002F\u002F Retry original request with new token\n",[334,2722,2724,2727,2730,2732,2734,2736,2738,2740,2742,2744,2746],{"class":336,"line":2723},13,[334,2725,2726],{"class":350},"    const",[334,2728,2729],{"class":558}," retry",[334,2731,2628],{"class":340},[334,2733,2563],{"class":2562},[334,2735,2567],{"class":2566},[334,2737,2570],{"class":2635},[334,2739,2573],{"class":340},[334,2741,2576],{"class":382},[334,2743,2573],{"class":340},[334,2745,2581],{"class":2635},[334,2747,2584],{"class":340},[334,2749,2751],{"class":336,"line":2750},14,[334,2752,2753],{"class":1176},"    \u002F\u002F Continue...\n",[334,2755,2757,2759,2762],{"class":336,"line":2756},15,[334,2758,2685],{"class":340},[334,2760,2761],{"class":2562}," else",[334,2763,2647],{"class":340},[334,2765,2767],{"class":336,"line":2766},16,[334,2768,2769],{"class":1176},"    \u002F\u002F Redirect to login\n",[334,2771,2773,2776,2778,2781,2783,2786,2788,2790,2793,2795],{"class":336,"line":2772},17,[334,2774,2775],{"class":558},"    window",[334,2777,2599],{"class":340},[334,2779,2780],{"class":558},"location",[334,2782,2599],{"class":340},[334,2784,2785],{"class":558},"href",[334,2787,2628],{"class":340},[334,2789,2657],{"class":340},[334,2791,2792],{"class":382},"\u002Flogin",[334,2794,2573],{"class":340},[334,2796,2584],{"class":340},[334,2798,2800],{"class":336,"line":2799},18,[334,2801,2802],{"class":340},"  }\n",[334,2804,2806],{"class":336,"line":2805},19,[334,2807,489],{"class":340},[313,2809],{},[527,2811,2813],{"id":2812},"scenario-5-tenant-not-found","Scenario 5: Tenant Not Found",[309,2815,2816],{},[493,2817,2266],{},[324,2819,2821],{"className":326,"code":2820,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 404,\n  \"message\": \"Organization not found\",\n  \"slug\": \"typo-salon\"\n}\n",[331,2822,2823,2827,2841,2859,2876],{"__ignoreMap":329},[334,2824,2825],{"class":336,"line":337},[334,2826,341],{"class":340},[334,2828,2829,2831,2833,2835,2837,2839],{"class":336,"line":344},[334,2830,347],{"class":340},[334,2832,351],{"class":350},[334,2834,354],{"class":340},[334,2836,357],{"class":340},[334,2838,1468],{"class":360},[334,2840,364],{"class":340},[334,2842,2843,2845,2847,2849,2851,2853,2855,2857],{"class":336,"line":367},[334,2844,347],{"class":340},[334,2846,372],{"class":350},[334,2848,354],{"class":340},[334,2850,357],{"class":340},[334,2852,379],{"class":340},[334,2854,1554],{"class":382},[334,2856,354],{"class":340},[334,2858,364],{"class":340},[334,2860,2861,2863,2865,2867,2869,2871,2874],{"class":336,"line":390},[334,2862,347],{"class":340},[334,2864,1565],{"class":350},[334,2866,354],{"class":340},[334,2868,357],{"class":340},[334,2870,379],{"class":340},[334,2872,2873],{"class":382},"typo-salon",[334,2875,471],{"class":340},[334,2877,2878],{"class":336,"line":411},[334,2879,489],{"class":340},[309,2881,2882],{},[493,2883,2315],{},[497,2885,2886,2889,2892,2898],{},[500,2887,2888],{},"✅ Verify organization slug spelling",[500,2890,2891],{},"✅ Ensure subdomain matches organization",[500,2893,2397,2894,2897],{},[331,2895,2896],{},"GET \u002Fapi\u002Ftenant\u002F:slug"," to verify org exists",[500,2899,2900],{},"✅ Check if organization was suspended or deleted",[313,2902],{},[527,2904,2906],{"id":2905},"scenario-6-double-booking-conflict","Scenario 6: Double Booking \u002F Conflict",[309,2908,2909],{},[493,2910,2266],{},[324,2912,2913],{"className":326,"code":1613,"language":328,"meta":329,"style":329},[331,2914,2915,2919,2933,2951,2967],{"__ignoreMap":329},[334,2916,2917],{"class":336,"line":337},[334,2918,341],{"class":340},[334,2920,2921,2923,2925,2927,2929,2931],{"class":336,"line":344},[334,2922,347],{"class":340},[334,2924,351],{"class":350},[334,2926,354],{"class":340},[334,2928,357],{"class":340},[334,2930,1632],{"class":360},[334,2932,364],{"class":340},[334,2934,2935,2937,2939,2941,2943,2945,2947,2949],{"class":336,"line":367},[334,2936,347],{"class":340},[334,2938,372],{"class":350},[334,2940,354],{"class":340},[334,2942,357],{"class":340},[334,2944,379],{"class":340},[334,2946,1596],{"class":382},[334,2948,354],{"class":340},[334,2950,364],{"class":340},[334,2952,2953,2955,2957,2959,2961,2963,2965],{"class":336,"line":390},[334,2954,347],{"class":340},[334,2956,439],{"class":350},[334,2958,354],{"class":340},[334,2960,357],{"class":340},[334,2962,379],{"class":340},[334,2964,448],{"class":382},[334,2966,471],{"class":340},[334,2968,2969],{"class":336,"line":411},[334,2970,489],{"class":340},[309,2972,2973],{},[493,2974,2315],{},[497,2976,2977,2980,2983],{},[500,2978,2979],{},"✅ Use different email",[500,2981,2982],{},"✅ If it's your email, try logging in instead",[500,2984,2985],{},"✅ Contact support to recover account",[313,2987],{},[316,2989,2991],{"id":2990},"validation-error-examples","Validation Error Examples",[527,2993,2995],{"id":2994},"email-validation","Email Validation",[309,2997,2998],{},[493,2999,3000],{},"Invalid:",[324,3002,3004],{"className":326,"code":3003,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 400,\n  \"details\": [\n    { \"field\": \"email\", \"message\": \"Invalid email address\" }\n  ]\n}\n",[331,3005,3006,3010,3024,3036,3073,3077],{"__ignoreMap":329},[334,3007,3008],{"class":336,"line":337},[334,3009,341],{"class":340},[334,3011,3012,3014,3016,3018,3020,3022],{"class":336,"line":344},[334,3013,347],{"class":340},[334,3015,351],{"class":350},[334,3017,354],{"class":340},[334,3019,357],{"class":340},[334,3021,361],{"class":360},[334,3023,364],{"class":340},[334,3025,3026,3028,3030,3032,3034],{"class":336,"line":367},[334,3027,347],{"class":340},[334,3029,416],{"class":350},[334,3031,354],{"class":340},[334,3033,357],{"class":340},[334,3035,423],{"class":340},[334,3037,3038,3040,3042,3044,3046,3048,3050,3052,3054,3056,3058,3060,3062,3064,3066,3069,3071],{"class":336,"line":390},[334,3039,1946],{"class":340},[334,3041,379],{"class":340},[334,3043,439],{"class":438},[334,3045,354],{"class":340},[334,3047,357],{"class":340},[334,3049,379],{"class":340},[334,3051,448],{"class":382},[334,3053,354],{"class":340},[334,3055,1743],{"class":340},[334,3057,379],{"class":340},[334,3059,372],{"class":438},[334,3061,354],{"class":340},[334,3063,357],{"class":340},[334,3065,379],{"class":340},[334,3067,3068],{"class":382},"Invalid email address",[334,3070,354],{"class":340},[334,3072,565],{"class":340},[334,3074,3075],{"class":336,"line":411},[334,3076,483],{"class":340},[334,3078,3079],{"class":336,"line":426},[334,3080,489],{"class":340},[309,3082,3083],{},[493,3084,3085],{},"Valid formats:",[497,3087,3088,3094],{},[500,3089,3090,3093],{},[331,3091,3092],{},"user@example.com"," ✅",[500,3095,3096,3093],{},[331,3097,3098],{},"user+tag@example.co.uk",[527,3100,3102],{"id":3101},"password-validation","Password Validation",[309,3104,3105],{},[493,3106,3107],{},"Weak password:",[324,3109,3111],{"className":326,"code":3110,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 400,\n  \"message\": \"Password must contain: uppercase (A-Z), lowercase (a-z), number (0-9), special char (!@#$%)\"\n}\n",[331,3112,3113,3117,3131,3148],{"__ignoreMap":329},[334,3114,3115],{"class":336,"line":337},[334,3116,341],{"class":340},[334,3118,3119,3121,3123,3125,3127,3129],{"class":336,"line":344},[334,3120,347],{"class":340},[334,3122,351],{"class":350},[334,3124,354],{"class":340},[334,3126,357],{"class":340},[334,3128,361],{"class":360},[334,3130,364],{"class":340},[334,3132,3133,3135,3137,3139,3141,3143,3146],{"class":336,"line":367},[334,3134,347],{"class":340},[334,3136,372],{"class":350},[334,3138,354],{"class":340},[334,3140,357],{"class":340},[334,3142,379],{"class":340},[334,3144,3145],{"class":382},"Password must contain: uppercase (A-Z), lowercase (a-z), number (0-9), special char (!@#$%)",[334,3147,471],{"class":340},[334,3149,3150],{"class":336,"line":390},[334,3151,489],{"class":340},[309,3153,3154],{},[493,3155,3156],{},"Valid examples:",[497,3158,3159,3164,3169],{},[500,3160,3161,3093],{},[331,3162,3163],{},"SecureP@ss123",[500,3165,3166,3093],{},[331,3167,3168],{},"MyP@ssw0rd",[500,3170,3171,3093],{},[331,3172,3173],{},"Strong!P@ss2026",[527,3175,3177],{"id":3176},"phone-number-validation","Phone Number Validation",[309,3179,3180],{},[493,3181,3000],{},[324,3183,3185],{"className":326,"code":3184,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 400,\n  \"details\": [\n    { \"field\": \"phone\", \"message\": \"Invalid phone format\" }\n  ]\n}\n",[331,3186,3187,3191,3205,3217,3255,3259],{"__ignoreMap":329},[334,3188,3189],{"class":336,"line":337},[334,3190,341],{"class":340},[334,3192,3193,3195,3197,3199,3201,3203],{"class":336,"line":344},[334,3194,347],{"class":340},[334,3196,351],{"class":350},[334,3198,354],{"class":340},[334,3200,357],{"class":340},[334,3202,361],{"class":360},[334,3204,364],{"class":340},[334,3206,3207,3209,3211,3213,3215],{"class":336,"line":367},[334,3208,347],{"class":340},[334,3210,416],{"class":350},[334,3212,354],{"class":340},[334,3214,357],{"class":340},[334,3216,423],{"class":340},[334,3218,3219,3221,3223,3225,3227,3229,3231,3234,3236,3238,3240,3242,3244,3246,3248,3251,3253],{"class":336,"line":390},[334,3220,1946],{"class":340},[334,3222,379],{"class":340},[334,3224,439],{"class":438},[334,3226,354],{"class":340},[334,3228,357],{"class":340},[334,3230,379],{"class":340},[334,3232,3233],{"class":382},"phone",[334,3235,354],{"class":340},[334,3237,1743],{"class":340},[334,3239,379],{"class":340},[334,3241,372],{"class":438},[334,3243,354],{"class":340},[334,3245,357],{"class":340},[334,3247,379],{"class":340},[334,3249,3250],{"class":382},"Invalid phone format",[334,3252,354],{"class":340},[334,3254,565],{"class":340},[334,3256,3257],{"class":336,"line":411},[334,3258,483],{"class":340},[334,3260,3261],{"class":336,"line":426},[334,3262,489],{"class":340},[309,3264,3265],{},[493,3266,3267],{},"Valid formats (Philippines):",[497,3269,3270,3275,3280],{},[500,3271,3272,3093],{},[331,3273,3274],{},"09161234567",[500,3276,3277,3093],{},[331,3278,3279],{},"+639161234567",[500,3281,3282,3285],{},[331,3283,3284],{},"02-1234567"," (landline) ✅",[527,3287,3289],{"id":3288},"date-validation","Date Validation",[309,3291,3292],{},[493,3293,3000],{},[324,3295,3297],{"className":326,"code":3296,"language":328,"meta":329,"style":329},"{\n  \"statusCode\": 400,\n  \"details\": [\n    { \"field\": \"bookingDate\", \"message\": \"Must be YYYY-MM-DD format, not past\" }\n  ]\n}\n",[331,3298,3299,3303,3317,3329,3366,3370],{"__ignoreMap":329},[334,3300,3301],{"class":336,"line":337},[334,3302,341],{"class":340},[334,3304,3305,3307,3309,3311,3313,3315],{"class":336,"line":344},[334,3306,347],{"class":340},[334,3308,351],{"class":350},[334,3310,354],{"class":340},[334,3312,357],{"class":340},[334,3314,361],{"class":360},[334,3316,364],{"class":340},[334,3318,3319,3321,3323,3325,3327],{"class":336,"line":367},[334,3320,347],{"class":340},[334,3322,416],{"class":350},[334,3324,354],{"class":340},[334,3326,357],{"class":340},[334,3328,423],{"class":340},[334,3330,3331,3333,3335,3337,3339,3341,3343,3345,3347,3349,3351,3353,3355,3357,3359,3362,3364],{"class":336,"line":390},[334,3332,1946],{"class":340},[334,3334,379],{"class":340},[334,3336,439],{"class":438},[334,3338,354],{"class":340},[334,3340,357],{"class":340},[334,3342,379],{"class":340},[334,3344,863],{"class":382},[334,3346,354],{"class":340},[334,3348,1743],{"class":340},[334,3350,379],{"class":340},[334,3352,372],{"class":438},[334,3354,354],{"class":340},[334,3356,357],{"class":340},[334,3358,379],{"class":340},[334,3360,3361],{"class":382},"Must be YYYY-MM-DD format, not past",[334,3363,354],{"class":340},[334,3365,565],{"class":340},[334,3367,3368],{"class":336,"line":411},[334,3369,483],{"class":340},[334,3371,3372],{"class":336,"line":426},[334,3373,489],{"class":340},[309,3375,3376],{},[493,3377,3085],{},[497,3379,3380,3386],{},[500,3381,3382,3385],{},[331,3383,3384],{},"2026-04-10"," (future) ✅",[500,3387,3388,3093],{},[331,3389,3390],{},"2026-12-25",[313,3392],{},[316,3394,3396],{"id":3395},"error-handling-best-practices","Error Handling Best Practices",[527,3398,3400],{"id":3399},"do","✅ DO",[497,3402,3403,3409,3415,3418,3421,3427],{},[500,3404,3405,3406,3408],{},"✅ Check ",[331,3407,351],{}," before processing response",[500,3410,3411,3412,3414],{},"✅ Display user-friendly messages from ",[331,3413,372],{}," field",[500,3416,3417],{},"✅ Retry on 5xx errors with exponential backoff",[500,3419,3420],{},"✅ Implement auto-retry for token refresh on 401",[500,3422,3423,3424,3426],{},"✅ Include ",[331,3425,2131],{}," when reporting bugs",[500,3428,3429],{},"✅ Log errors for debugging (not in production)",[527,3431,3433],{"id":3432},"dont","❌ DON'T",[497,3435,3436,3439,3442,3447,3450,3453],{},[500,3437,3438],{},"❌ Ignore error status codes",[500,3440,3441],{},"❌ Assume 200 means success (check response)",[500,3443,3444,3445,2581],{},"❌ Show raw error details to users (use ",[331,3446,372],{},[500,3448,3449],{},"❌ Retry infinitely (cap at 3-5 attempts)",[500,3451,3452],{},"❌ Store sensitive error info",[500,3454,3455],{},"❌ Expose stack traces to frontend",[313,3457],{},[316,3459,3461],{"id":3460},"quick-reference-table","Quick Reference Table",[3463,3464,3465,3484],"table",{},[3466,3467,3468],"thead",{},[3469,3470,3471,3475,3478,3481],"tr",{},[3472,3473,3474],"th",{},"Status",[3472,3476,3477],{},"Error",[3472,3479,3480],{},"Cause",[3472,3482,3483],{},"Action",[3485,3486,3487,3501,3514,3528,3542,3556,3570,3584],"tbody",{},[3469,3488,3489,3493,3495,3498],{},[3490,3491,3492],"td",{},"400",[3490,3494,383],{},[3490,3496,3497],{},"Bad data",[3490,3499,3500],{},"Fix input, resend",[3469,3502,3503,3506,3508,3511],{},[3490,3504,3505],{},"401",[3490,3507,1036],{},[3490,3509,3510],{},"Auth invalid",[3490,3512,3513],{},"Call refresh, re-login",[3469,3515,3516,3519,3522,3525],{},[3490,3517,3518],{},"403",[3490,3520,3521],{},"Forbidden",[3490,3523,3524],{},"No permission",[3490,3526,3527],{},"Check role, contact admin",[3469,3529,3530,3533,3536,3539],{},[3490,3531,3532],{},"404",[3490,3534,3535],{},"Not found",[3490,3537,3538],{},"Resource missing",[3490,3540,3541],{},"Verify ID\u002Fslug",[3469,3543,3544,3547,3550,3553],{},[3490,3545,3546],{},"409",[3490,3548,3549],{},"Conflict",[3490,3551,3552],{},"Already exists",[3490,3554,3555],{},"Use different value",[3469,3557,3558,3561,3564,3567],{},[3490,3559,3560],{},"422",[3490,3562,3563],{},"Invalid state",[3490,3565,3566],{},"Business logic",[3490,3568,3569],{},"Try different input",[3469,3571,3572,3575,3578,3581],{},[3490,3573,3574],{},"500",[3490,3576,3577],{},"Server error",[3490,3579,3580],{},"Backend issue",[3490,3582,3583],{},"Retry later, report",[3469,3585,3586,3589,3592,3595],{},[3490,3587,3588],{},"503",[3490,3590,3591],{},"Unavailable",[3490,3593,3594],{},"Maintenance",[3490,3596,3597],{},"Wait, retry",[313,3599],{},[316,3601,3603],{"id":3602},"summary","Summary",[309,3605,3606],{},[493,3607,3608],{},"Always check response status first:",[324,3610,3612],{"className":2539,"code":3611,"language":2541,"meta":329,"style":329},"if (!response.ok) {\n  \u002F\u002F 4xx or 5xx error\n  const error = await response.json();\n  console.error(error.message);\n  \u002F\u002F Handle based on statusCode\n} else {\n  \u002F\u002F 2xx success\n  const data = await response.json();\n  \u002F\u002F Process data\n}\n",[331,3613,3614,3633,3638,3661,3682,3687,3695,3700,3721,3726],{"__ignoreMap":329},[334,3615,3616,3618,3620,3623,3626,3628,3631],{"class":336,"line":337},[334,3617,2593],{"class":2562},[334,3619,2702],{"class":558},[334,3621,3622],{"class":340},"!",[334,3624,3625],{"class":558},"response",[334,3627,2599],{"class":340},[334,3629,3630],{"class":558},"ok) ",[334,3632,341],{"class":340},[334,3634,3635],{"class":336,"line":344},[334,3636,3637],{"class":1176},"  \u002F\u002F 4xx or 5xx error\n",[334,3639,3640,3642,3645,3647,3649,3652,3654,3656,3659],{"class":336,"line":367},[334,3641,2622],{"class":350},[334,3643,3644],{"class":558}," error",[334,3646,2628],{"class":340},[334,3648,2563],{"class":2562},[334,3650,3651],{"class":558}," response",[334,3653,2599],{"class":340},[334,3655,328],{"class":2566},[334,3657,3658],{"class":2635},"()",[334,3660,2584],{"class":340},[334,3662,3663,3666,3668,3670,3672,3674,3676,3678,3680],{"class":336,"line":390},[334,3664,3665],{"class":558},"  console",[334,3667,2599],{"class":340},[334,3669,395],{"class":2566},[334,3671,2570],{"class":2635},[334,3673,395],{"class":558},[334,3675,2599],{"class":340},[334,3677,372],{"class":558},[334,3679,2581],{"class":2635},[334,3681,2584],{"class":340},[334,3683,3684],{"class":336,"line":411},[334,3685,3686],{"class":1176},"  \u002F\u002F Handle based on statusCode\n",[334,3688,3689,3691,3693],{"class":336,"line":426},[334,3690,562],{"class":340},[334,3692,2761],{"class":2562},[334,3694,2647],{"class":340},[334,3696,3697],{"class":336,"line":432},[334,3698,3699],{"class":1176},"  \u002F\u002F 2xx success\n",[334,3701,3702,3704,3707,3709,3711,3713,3715,3717,3719],{"class":336,"line":455},[334,3703,2622],{"class":350},[334,3705,3706],{"class":558}," data",[334,3708,2628],{"class":340},[334,3710,2563],{"class":2562},[334,3712,3651],{"class":558},[334,3714,2599],{"class":340},[334,3716,328],{"class":2566},[334,3718,3658],{"class":2635},[334,3720,2584],{"class":340},[334,3722,3723],{"class":336,"line":474},[334,3724,3725],{"class":1176},"  \u002F\u002F Process data\n",[334,3727,3728],{"class":336,"line":480},[334,3729,489],{"class":340},[309,3731,3732],{},[493,3733,3734],{},"Key points:",[497,3736,3737,3745,3748,3751,3757,3760],{},[500,3738,3739,3740,3742,3743],{},"All errors have consistent format with ",[331,3741,351],{}," + ",[331,3744,372],{},[500,3746,3747],{},"4xx = Client problem (bad request, auth, permission)",[500,3749,3750],{},"5xx = Server problem (retry later)",[500,3752,3753,3754,3756],{},"Validation errors include ",[331,3755,416],{}," array with field info",[500,3758,3759],{},"Always implement token refresh on 401 (before re-login)",[500,3761,3762,3763,3426],{},"Include ",[331,3764,2131],{},[3766,3767,3768],"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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .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}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":329,"searchDepth":337,"depth":344,"links":3770},[3771,3772,3777,3785,3789,3797,3803,3807,3808],{"id":318,"depth":344,"text":319},{"id":524,"depth":344,"text":525,"children":3773},[3774,3775,3776],{"id":529,"depth":367,"text":530},{"id":568,"depth":367,"text":569},{"id":639,"depth":367,"text":640},{"id":648,"depth":344,"text":649,"children":3778},[3779,3780,3781,3782,3783,3784],{"id":652,"depth":367,"text":653},{"id":1016,"depth":367,"text":1017},{"id":1206,"depth":367,"text":1207},{"id":1419,"depth":367,"text":1420},{"id":1583,"depth":367,"text":1584},{"id":1769,"depth":367,"text":1770},{"id":2031,"depth":344,"text":2032,"children":3786},[3787,3788],{"id":2035,"depth":367,"text":2036},{"id":2168,"depth":367,"text":2169},{"id":2256,"depth":344,"text":2257,"children":3790},[3791,3792,3793,3794,3795,3796],{"id":2260,"depth":367,"text":2261},{"id":2337,"depth":367,"text":2338},{"id":2412,"depth":367,"text":2413},{"id":2483,"depth":367,"text":2484},{"id":2812,"depth":367,"text":2813},{"id":2905,"depth":367,"text":2906},{"id":2990,"depth":344,"text":2991,"children":3798},[3799,3800,3801,3802],{"id":2994,"depth":367,"text":2995},{"id":3101,"depth":367,"text":3102},{"id":3176,"depth":367,"text":3177},{"id":3288,"depth":367,"text":3289},{"id":3395,"depth":344,"text":3396,"children":3804},[3805,3806],{"id":3399,"depth":367,"text":3400},{"id":3432,"depth":367,"text":3433},{"id":3460,"depth":344,"text":3461},{"id":3602,"depth":344,"text":3603},"Standard HTTP error codes, error response formats, and how to handle them.","md",null,{},{"icon":284},{"title":281,"description":3809},"Yw7FDFRYrJc-URlnfgGRAjTqYJ2wM41favuzV_Hm3UY",[3817,3819],{"title":276,"path":277,"stem":278,"description":3818,"icon":279,"children":-1},"How to configure all required environment variables for booki-api including Redis, Maya, Google OAuth, Gmail SMTP, and MongoDB.",{"title":286,"path":287,"stem":288,"description":3820,"icon":289,"children":-1},"How to generate a Gmail App Password and configure GMAIL_USER and GMAIL_APP_PASSWORD for the booki-api email service.",1777787842938]