[{"data":1,"prerenderedAt":1069},["ShallowReactive",2],{"navigation":3,"\u002Fenterprise\u002Fentities":189,"\u002Fenterprise\u002Fentities-surround":1064},[4,34,60,116,137,153],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":33},"Getting Started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,15,18,23,28],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-house",{"title":5,"path":16,"stem":17,"icon":6},"\u002Fgetting-started\u002Fgetting-started","1.getting-started\u002F2.getting-started",{"title":19,"path":20,"stem":21,"icon":22},"Choosing a Preset","\u002Fgetting-started\u002Fchoosing-a-preset","1.getting-started\u002F3.choosing-a-preset","i-lucide-git-branch",{"title":24,"path":25,"stem":26,"icon":27},"Deployment","\u002Fgetting-started\u002Fdeployment","1.getting-started\u002F4.deployment","i-lucide-cloud",{"title":29,"path":30,"stem":31,"icon":32},"Background Maintenance","\u002Fgetting-started\u002Fbackground-maintenance","1.getting-started\u002F5.background-maintenance","i-lucide-timer-reset",false,{"title":35,"icon":36,"path":37,"stem":38,"children":39,"page":33},"Build","i-lucide-wrench","\u002Fbuild","2.build",[40,45,50,55],{"title":41,"path":42,"stem":43,"icon":44},"Routers & Prefixes","\u002Fbuild\u002Frouters-and-prefixes","2.build\u002F1.routers-and-prefixes","i-lucide-route",{"title":46,"path":47,"stem":48,"icon":49},"Configuration","\u002Fbuild\u002Fconfiguration","2.build\u002F2.configuration","i-lucide-settings",{"title":51,"path":52,"stem":53,"icon":54},"Authorization Dependencies","\u002Fbuild\u002Fauthorization-dependencies","2.build\u002F3.authorization-dependencies","i-lucide-shield-check",{"title":56,"path":57,"stem":58,"icon":59},"Command Line","\u002Fbuild\u002Fcli","2.build\u002F4.cli","i-lucide-terminal",{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":33},"Auth","i-lucide-lock","\u002Fauth","3.auth",[66,71,76,81,86,91,96,101,106,111],{"title":67,"path":68,"stem":69,"icon":70},"OAuth & Social Login","\u002Fauth\u002Foauth-and-social-login","3.auth\u002F1.oauth-and-social-login","i-lucide-log-in",{"title":72,"path":73,"stem":74,"icon":75},"Multi-Frontend Support","\u002Fauth\u002Fmulti-frontend","3.auth\u002F10.multi-frontend","i-lucide-layout-grid",{"title":77,"path":78,"stem":79,"icon":80},"Sessions & Audit","\u002Fauth\u002Fsessions-and-audit","3.auth\u002F2.sessions-and-audit","i-lucide-monitor-smartphone",{"title":82,"path":83,"stem":84,"icon":85},"Passwordless & Messaging","\u002Fauth\u002Fpasswordless-and-messaging","3.auth\u002F3.passwordless-and-messaging","i-lucide-mail",{"title":87,"path":88,"stem":89,"icon":90},"JWT Tokens","\u002Fauth\u002Fjwt-tokens","3.auth\u002F4.jwt-tokens","i-lucide-key-round",{"title":92,"path":93,"stem":94,"icon":95},"User Management API","\u002Fauth\u002Fuser-management-api","3.auth\u002F5.user-management-api","i-lucide-users",{"title":97,"path":98,"stem":99,"icon":100},"User Invitations","\u002Fauth\u002Fuser-invitations","3.auth\u002F6.user-invitations","i-lucide-send",{"title":102,"path":103,"stem":104,"icon":105},"Roles & Permissions","\u002Fauth\u002Froles-and-permissions","3.auth\u002F7.roles-and-permissions","i-lucide-shield",{"title":107,"path":108,"stem":109,"icon":110},"ABAC","\u002Fauth\u002Fabac","3.auth\u002F8.abac","i-lucide-filter",{"title":112,"path":113,"stem":114,"icon":115},"User Status","\u002Fauth\u002Fuser-status","3.auth\u002F9.user-status","i-lucide-user-cog",{"title":117,"icon":118,"path":119,"stem":120,"children":121,"page":33},"Enterprise","i-lucide-building-2","\u002Fenterprise","4.enterprise",[122,127,132],{"title":123,"path":124,"stem":125,"icon":126},"Core Authorization Concepts","\u002Fenterprise\u002Fcore-authorization-concepts","4.enterprise\u002F1.core-authorization-concepts","i-lucide-network",{"title":128,"path":129,"stem":130,"icon":131},"Entities","\u002Fenterprise\u002Fentities","4.enterprise\u002F2.entities","i-lucide-folder-tree",{"title":133,"path":134,"stem":135,"icon":136},"Entity Memberships","\u002Fenterprise\u002Fentity-memberships","4.enterprise\u002F3.entity-memberships","i-lucide-user-plus",{"title":138,"icon":139,"path":140,"stem":141,"children":142,"page":33},"Integrations","i-lucide-plug","\u002Fintegrations","5.integrations",[143,148],{"title":144,"path":145,"stem":146,"icon":147},"API Keys","\u002Fintegrations\u002Fapi-keys","5.integrations\u002F1.api-keys","i-lucide-key",{"title":149,"path":150,"stem":151,"icon":152},"OutlabsAuth UI","\u002Fintegrations\u002Foutlabsauth-ui","5.integrations\u002F2.outlabsauth-ui","i-lucide-layout-dashboard",{"title":154,"icon":155,"path":156,"stem":157,"children":158,"page":33},"Reference","i-lucide-book-marked","\u002Freference","6.reference",[159,164,169,174,179,184],{"title":160,"path":161,"stem":162,"icon":163},"Data Models","\u002Freference\u002Fdata-models","6.reference\u002F1.data-models","i-lucide-database",{"title":165,"path":166,"stem":167,"icon":168},"Activity Tracking","\u002Freference\u002Factivity-tracking","6.reference\u002F2.activity-tracking","i-lucide-activity",{"title":170,"path":171,"stem":172,"icon":173},"Testing","\u002Freference\u002Ftesting","6.reference\u002F3.testing","i-lucide-flask-conical",{"title":175,"path":176,"stem":177,"icon":178},"Observability","\u002Freference\u002Fobservability","6.reference\u002F4.observability","i-lucide-eye",{"title":180,"path":181,"stem":182,"icon":183},"Metrics Reference","\u002Freference\u002Fmetrics-reference","6.reference\u002F5.metrics-reference","i-lucide-chart-bar",{"title":185,"path":186,"stem":187,"icon":188},"Log Events Reference","\u002Freference\u002Flog-events-reference","6.reference\u002F6.log-events-reference","i-lucide-scroll-text",{"id":190,"title":128,"body":191,"description":1057,"extension":1058,"links":1059,"meta":1060,"navigation":1061,"path":129,"seo":1062,"stem":130,"__hash__":1063},"docs\u002F4.enterprise\u002F2.entities.md",{"type":192,"value":193,"toc":1042},"minimark",[194,201,214,217,222,268,304,323,325,329,336,352,377,399,408,410,414,458,461,463,467,472,477,634,638,738,742,785,789,830,832,836,846,897,908,910,914,954,971,973,977,1016,1020,1038],[195,196,197],"note",{},[198,199,200],"p",{},"Enterprise entity hierarchy HTTP API.",[198,202,203,204,208,209,213],{},"How to mount and call the entity tree when ",[205,206,207],"code",{},"enable_entity_hierarchy"," is on\n(",[210,211,212],"strong",{},"EnterpriseRBAC",").",[215,216],"hr",{},[218,219,221],"h2",{"id":220},"when-this-api-exists","When this API exists",[223,224,225,242],"table",{},[226,227,228],"thead",{},[229,230,231,235],"tr",{},[232,233,234],"th",{},"Preset",[232,236,237,238,241],{},"Mount ",[205,239,240],{},"get_entities_router","?",[243,244,245,256],"tbody",{},[229,246,247,253],{},[248,249,250],"td",{},[210,251,252],{},"SimpleRBAC",[248,254,255],{},"No — hierarchy is forced off",[229,257,258,262],{},[248,259,260],{},[210,261,212],{},[248,263,264,265],{},"Yes — typical prefix ",[205,266,267],{},"\u002Fv1\u002Fentities",[269,270,275],"pre",{"className":271,"code":272,"language":273,"meta":274,"style":274},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from outlabs_auth.routers import get_entities_router, get_config_router\n\napp.include_router(get_entities_router(auth, prefix=\"\u002Fv1\u002Fentities\"))\napp.include_router(get_config_router(auth, prefix=\"\u002Fv1\u002Fconfig\"))  # root type vocabulary\n","python","",[205,276,277,285,292,298],{"__ignoreMap":274},[278,279,282],"span",{"class":280,"line":281},"line",1,[278,283,284],{},"from outlabs_auth.routers import get_entities_router, get_config_router\n",[278,286,288],{"class":280,"line":287},2,[278,289,291],{"emptyLinePlaceholder":290},true,"\n",[278,293,295],{"class":280,"line":294},3,[278,296,297],{},"app.include_router(get_entities_router(auth, prefix=\"\u002Fv1\u002Fentities\"))\n",[278,299,301],{"class":280,"line":300},4,[278,302,303],{},"app.include_router(get_config_router(auth, prefix=\"\u002Fv1\u002Fconfig\"))  # root type vocabulary\n",[198,305,306,307,316,317,320,321,316],{},"Runnable: ",[308,309,313],"a",{"href":310,"rel":311},"https:\u002F\u002Fgithub.com\u002Foutlabsio\u002FoutlabsAuth\u002Ftree\u002Fmain\u002Fexamples\u002Fenterprise_rbac\u002F",[312],"nofollow",[205,314,315],{},"examples\u002Fenterprise_rbac",".",[318,319],"br",{},"\nCatalog: ",[308,322,41],{"href":42},[215,324],{},[218,326,328],{"id":327},"concepts-you-need","Concepts you need",[198,330,331,332,335],{},"An ",[210,333,334],{},"entity"," is a node in an org tree:",[337,338,339,346],"ul",{},[340,341,342,345],"li",{},[205,343,344],{},"structural"," — org chart (company → office → team, …)",[340,347,348,351],{},[205,349,350],{},"access_group"," — cross-cutting workspace \u002F group",[198,353,354,357,358,361,362,361,365,368,369,372,373,376],{},[205,355,356],{},"entity_type"," is a free-form string (",[205,359,360],{},"organization",", ",[205,363,364],{},"office",[205,366,367],{},"team",", …).\nParent\u002Fchild rules live on the parent (",[205,370,371],{},"allowed_child_classes"," \u002F\n",[205,374,375],{},"allowed_child_types","). Root types come from system config (below).",[198,378,379,382,383,361,386,361,389,392,393,396,397,316],{},[210,380,381],{},"Closure table (one idea):"," OutlabsAuth stores every ancestor→descendant pair\n(with depth) so “is this under that org?” and “list the whole subtree” stay\ncheap. Prefer ",[205,384,385],{},"\u002Fchildren",[205,387,388],{},"\u002Fdescendants",[205,390,391],{},"\u002Fpath",", and ",[205,394,395],{},"*_tree"," permissions\nover querying closure yourself. Deeper write-up:\n",[308,398,123],{"href":124},[198,400,401,402,405,406,316],{},"Users get access via ",[210,403,404],{},"memberships on entities",", not by appearing on the\nentity row alone — ",[308,407,133],{"href":134},[215,409],{},[218,411,413],{"id":412},"permissions-short","Permissions (short)",[223,415,416,426],{},[226,417,418],{},[229,419,420,423],{},[232,421,422],{},"Style",[232,424,425],{},"When",[243,427,428,438,450],{},[229,429,430,435],{},[248,431,432],{},[205,433,434],{},"require_permission(\"entity:…\")",[248,436,437],{},"Global check (no entity context)",[229,439,440,447],{},[248,441,442,443,446],{},"Tree check (",[205,444,445],{},"entity:create_tree",", …)",[248,448,449],{},"Target entity present — subtree auth",[229,451,452,455],{},[248,453,454],{},"Entity-scoped check",[248,456,457],{},"Permission in a specific entity context",[198,459,460],{},"Create under a parent uses tree create on that parent; root create falls back\nto a global create check.",[215,462],{},[218,464,466],{"id":465},"http-api","HTTP API",[198,468,469,470,316],{},"Paths relative to ",[205,471,267],{},[473,474,476],"h3",{"id":475},"list-crud","List \u002F CRUD",[223,478,479,495],{},[226,480,481],{},[229,482,483,486,489,492],{},[232,484,485],{},"Method",[232,487,488],{},"Path",[232,490,491],{},"Permission",[232,493,494],{},"Notes",[243,496,497,537,569,588,611],{},[229,498,499,504,509,514],{},[248,500,501],{},[205,502,503],{},"GET",[248,505,506],{},[205,507,508],{},"\u002F",[248,510,511],{},[205,512,513],{},"entity:read",[248,515,516,517,361,520,361,523,361,525,361,528,361,531,361,534],{},"Paginated active entities. Query: ",[205,518,519],{},"search",[205,521,522],{},"entity_class",[205,524,356],{},[205,526,527],{},"parent_id",[205,529,530],{},"root_only",[205,532,533],{},"page",[205,535,536],{},"limit",[229,538,539,544,548,559],{},[248,540,541],{},[205,542,543],{},"POST",[248,545,546],{},[205,547,508],{},[248,549,550,551,554,555,558],{},"Tree ",[205,552,553],{},"entity:create"," on ",[205,556,557],{},"parent_entity_id"," (or global if root)",[248,560,561,564,565,568],{},[205,562,563],{},"EntityCreateRequest"," → ",[205,566,567],{},"EntityResponse"," (201)",[229,570,571,575,580,584],{},[248,572,573],{},[205,574,503],{},[248,576,577],{},[205,578,579],{},"\u002F{entity_id}",[248,581,582],{},[205,583,513],{},[248,585,586],{},[205,587,567],{},[229,589,590,595,599,604],{},[248,591,592],{},[205,593,594],{},"PATCH",[248,596,597],{},[205,598,579],{},[248,600,601],{},[205,602,603],{},"entity:update",[248,605,606,607,610],{},"Partial ",[205,608,609],{},"EntityUpdateRequest"," (identity \u002F parent not renamed here)",[229,612,613,618,622,627],{},[248,614,615],{},[205,616,617],{},"DELETE",[248,619,620],{},[205,621,579],{},[248,623,624],{},[205,625,626],{},"entity:delete",[248,628,629,630,633],{},"Query ",[205,631,632],{},"cascade"," (default false) → 204",[473,635,637],{"id":636},"tree-navigation","Tree navigation",[223,639,640,652],{},[226,641,642],{},[229,643,644,646,648,650],{},[232,645,485],{},[232,647,488],{},[232,649,491],{},[232,651,494],{},[243,653,654,672,693,711],{},[229,655,656,660,665,669],{},[248,657,658],{},[205,659,503],{},[248,661,662],{},[205,663,664],{},"\u002F{entity_id}\u002Fchildren",[248,666,667],{},[205,668,513],{},[248,670,671],{},"Direct active children",[229,673,674,678,683,687],{},[248,675,676],{},[205,677,503],{},[248,679,680],{},[205,681,682],{},"\u002F{entity_id}\u002Fdescendants",[248,684,550,685],{},[205,686,513],{},[248,688,689,690,692],{},"Subtree; optional ",[205,691,356],{}," filter",[229,694,695,699,704,708],{},[248,696,697],{},[205,698,503],{},[248,700,701],{},[205,702,703],{},"\u002F{entity_id}\u002Fpath",[248,705,706],{},[205,707,513],{},[248,709,710],{},"Breadcrumb root → entity",[229,712,713,717,722,728],{},[248,714,715],{},[205,716,543],{},[248,718,719],{},[205,720,721],{},"\u002F{entity_id}\u002Fmove",[248,723,724,725,727],{},"Entity ",[205,726,603],{},"; tree create on new parent if set",[248,729,730,733,734,737],{},[205,731,732],{},"EntityMoveRequest"," (",[205,735,736],{},"new_parent_id"," optional → promote to root). Rewrites closure",[473,739,741],{"id":740},"create-ux-helper","Create UX helper",[223,743,744,756],{},[226,745,746],{},[229,747,748,750,752,754],{},[232,749,485],{},[232,751,488],{},[232,753,491],{},[232,755,494],{},[243,757,758],{},[229,759,760,764,769,775],{},[248,761,762],{},[205,763,503],{},[248,765,766],{},[205,767,768],{},"\u002Ftype-suggestions",[248,770,550,771,554,773],{},[205,772,553],{},[205,774,527],{},[248,776,777,778,780,781,361,783],{},"Sibling-based ",[205,779,356],{}," autocomplete. Query: ",[205,782,527],{},[205,784,522],{},[473,786,788],{"id":787},"members-bridge-read-only","Members bridge (read-only)",[223,790,791,803],{},[226,792,793],{},[229,794,795,797,799,801],{},[232,796,485],{},[232,798,488],{},[232,800,491],{},[232,802,494],{},[243,804,805],{},[229,806,807,811,816,821],{},[248,808,809],{},[205,810,503],{},[248,812,813],{},[205,814,815],{},"\u002F{entity_id}\u002Fmembers",[248,817,550,818],{},[205,819,820],{},"membership:read",[248,822,823,824,564,827],{},"Paginated convenience list. Full lifecycle: ",[205,825,826],{},"\u002Fv1\u002Fmemberships",[308,828,829],{"href":134},"54",[215,831],{},[218,833,835],{"id":834},"entity-type-config-api","Entity-type config API",[198,837,838,839,733,842,845],{},"Mounted separately under ",[205,840,841],{},"\u002Fv1\u002Fconfig",[205,843,844],{},"get_config_router","):",[223,847,848,861],{},[226,849,850],{},[229,851,852,854,856,858],{},[232,853,485],{},[232,855,488],{},[232,857,61],{},[232,859,860],{},"Purpose",[243,862,863,880],{},[229,864,865,869,874,877],{},[248,866,867],{},[205,868,503],{},[248,870,871],{},[205,872,873],{},"\u002Fv1\u002Fconfig\u002Fentity-types",[248,875,876],{},"Public",[248,878,879],{},"Allowed root types + child-type hints",[229,881,882,887,891,894],{},[248,883,884],{},[205,885,886],{},"PUT",[248,888,889],{},[205,890,873],{},[248,892,893],{},"Superuser",[248,895,896],{},"Update vocabulary",[198,898,899,900,903,904,907],{},"Empty ",[205,901,902],{},"allowed_root_types"," for a class rejects root creates of that class.\nPer-parent child rules still use the entity’s ",[205,905,906],{},"allowed_child_*"," fields.",[215,909],{},[218,911,913],{"id":912},"response-cheatsheet","Response cheatsheet",[198,915,916,921,922,361,925,361,928,361,931,361,934,937,938,361,940,361,942,361,944,947,948,950,951,953],{},[210,917,918,920],{},[205,919,567],{},":"," ",[205,923,924],{},"id",[205,926,927],{},"name",[205,929,930],{},"display_name",[205,932,933],{},"slug",[205,935,936],{},"description",",\n",[205,939,522],{},[205,941,356],{},[205,943,557],{},[205,945,946],{},"status",", validity window,\n",[205,949,371],{}," \u002F ",[205,952,375],{},", optional naming governance.",[198,955,956,921,961,964,965,361,968,316],{},[210,957,958,920],{},[205,959,960],{},"MemberResponse",[205,962,963],{},"user_id",", email\u002Fnames, ",[205,966,967],{},"role_ids",[205,969,970],{},"role_names",[215,972],{},[218,974,976],{"id":975},"typical-host-flow","Typical host flow",[978,979,980,986,992,999,1005,1010],"ol",{},[340,981,982,983],{},"Choose Enterprise — ",[308,984,985],{"href":20},"07",[340,987,988,989],{},"Mount entities + config routers — ",[308,990,991],{"href":42},"02",[340,993,994,995,998],{},"Set root types via ",[205,996,997],{},"PUT \u002Fv1\u002Fconfig\u002Fentity-types"," (or accept defaults)",[340,1000,1001,1002,1004],{},"Create roots → children; use ",[205,1003,768],{}," in admin UI",[340,1006,1007,1008],{},"Attach users with memberships — ",[308,1009,829],{"href":134},[340,1011,1012,1013],{},"Protect host routes with entity \u002F tree permission deps — ",[308,1014,1015],{"href":124},"13",[218,1017,1019],{"id":1018},"related","Related",[337,1021,1022,1026,1030,1034],{},[340,1023,1024],{},[308,1025,19],{"href":20},[340,1027,1028],{},[308,1029,123],{"href":124},[340,1031,1032],{},[308,1033,133],{"href":134},[340,1035,1036],{},[308,1037,160],{"href":161},[1039,1040,1041],"style",{},"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);}",{"title":274,"searchDepth":281,"depth":287,"links":1043},[1044,1045,1046,1047,1053,1054,1055,1056],{"id":220,"depth":287,"text":221},{"id":327,"depth":287,"text":328},{"id":412,"depth":287,"text":413},{"id":465,"depth":287,"text":466,"children":1048},[1049,1050,1051,1052],{"id":475,"depth":294,"text":476},{"id":636,"depth":294,"text":637},{"id":740,"depth":294,"text":741},{"id":787,"depth":294,"text":788},{"id":834,"depth":287,"text":835},{"id":912,"depth":287,"text":913},{"id":975,"depth":287,"text":976},{"id":1018,"depth":287,"text":1019},"Enterprise org tree CRUD, move, children, path.","md",null,{},{"icon":131},{"title":128,"description":1057},"-65R-pkGxLMBu5EaVEKH66ZcTDv-LQcGIN0xcTVUZKY",[1065,1067],{"title":123,"path":124,"stem":125,"description":1066,"icon":126,"children":-1},"Users, roles, permissions, entities, and tree access.",{"title":133,"path":134,"stem":135,"description":1068,"icon":136,"children":-1},"Enterprise membership lifecycle.",1787472745731]