PageSourceSearch

https://wexa.ai/assets/docs-CfweCRQx.js

js wexa.ai collected 2026-10-05 13:19:00 UTC 111,689 bytes, 399 lines download raw bytes

1import{a as e,t}from"./jsx-runtime-Bzw2jH9X.js";var n=e({default:()=>o,frontmatter:()=>i}),r=t(),i={title:`API keys`,description:`The three routes behind fab_sk_ credentials — create, list and revoke — with every parameter, every refusal, and why a key cannot mint another key.`,tab:`api`,group:`Credentials`,order:20};function a(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,h3:`h3`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,...e.components},{Card:n,CardGrid:i}=t;return n||s(`Card`,!0),i||s(`CardGrid`,!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:`api-keys`,children:`API keys`}),`
2`,(0,r.jsxs)(t.p,{children:[`Three routes manage `,(0,r.jsx)(t.code,{children:`fab_sk_`}),` credentials. All three require a `,(0,r.jsx)(t.strong,{children:`user token with an admin role on
3the target project`}),`, and none of them can be reached with an API key. This page is the per-route
4reference; `,(0,r.jsx)(t.a,{href:`/docs/api/authentication`,children:`authentication`}),` explains where a key sits among the three
5credential types.`]}),`
6`,(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:`Route`}),(0,r.jsx)(t.th,{children:`Purpose`}),(0,r.jsx)(t.th,{children:`Credential`})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`POST /v1/apikeys`})}),(0,r.jsx)(t.td,{children:`Create a key and return its secret once`}),(0,r.jsx)(t.td,{children:`User token, admin role`})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`GET /v1/apikeys?project_id=…`})}),(0,r.jsx)(t.td,{children:`List the project's keys, without secrets`}),(0,r.jsx)(t.td,{children:`User token, admin role`})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`DELETE /v1/apikeys/{id}?project_id=…`})}),(0,r.jsx)(t.td,{children:`Revoke one key immediately`}),(0,r.jsx)(t.td,{children:`User token, admin role`})]})]})]}),`
7`,(0,r.jsx)(t.h2,{id:`create-a-key`,children:`Create a key`}),`
8`,(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:`POST /v1/apikeys`}),` — body is JSON.`]}),`
9`,(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:`Field`}),(0,r.jsx)(t.th,{children:`Required`}),(0,r.jsx)(t.th,{children:`Notes`})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`name`})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:`Yes`})}),(0,r.jsxs)(t.td,{children:[`A human label. Empty or missing is refused `,(0,r.jsx)(t.code,{children:`400 name is required`}),`. The id is random and carries no meaning, so this is the only way to tell keys apart later.`]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`org_id`})}),(0,r.jsx)(t.td,{children:`Yes in practice`}),(0,r.jsxs)(t.td,{children:[`Read from the `,(0,r.jsx)(t.strong,{children:`body`}),`, not from your token's claims. Omitting it produces a key whose scope has no organization.`]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`dept_id`})}),(0,r.jsx)(t.td,{children:`No`}),(0,r.jsx)(t.td,{children:`Stamped into the key's scope as given.`})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`project_id`})}),(0,r.jsx)(t.td,{children:`Yes`}),(0,r.jsx)(t.td,{children:`The project the key is pinned to.`})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`grants`})}),(0,r.jsx)(t.td,{children:`No`}),(0,r.jsx)(t.td,{children:`An explicit grant list. Omitted, the key inherits the default set for the caller's role.`})]})]})]}),`
10`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsxs)(t.code,{children:[(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#6F42C1`},children:`curl`}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:` -sS`}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:` -X`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:` POST`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:` https://fabric.wexa.ai/v1/apikeys`}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:` \\`})]}),`
11`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  -H`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:` "Authorization: Bearer `}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`$USER_TOKEN`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"`}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:` \\`})]}),`
12`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  -H`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:` 'Content-Type: application/json'`}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:` \\`})]}),`
13`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  -d`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:` '{"name":"nightly-report","org_id":"org_abc","dept_id":"dept_abc","project_id":"proj_abc"}'`})]})]})})}),`
14`,(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:`201 Created`}),`:`]}),`
15`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsxs)(t.code,{children:[(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`{`})}),`
16`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "id"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"key_IEhcUZrVvqI9C9hOAkwA_yOM"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
17`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "name"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"nightly-report"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
18`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "note"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"store this secret now; it is not retrievable again"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
19`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "scope"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: {`})]}),`
20`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`    "org_id"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"org_abc"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"dept_id"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"dept_abc"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"project_id"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"proj_abc"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
21`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`    "user_id"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"u_abc"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"role"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"OWNER"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
22`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`    "grants"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: [`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"fabric:query.read"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"fabric:docs.read"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"fabric:ontology.write"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
23`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`               "fabric:orchestrate.read"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"fabric:orchestrate.write"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"fabric:agent.run"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
24`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`               "fabric:skill.write"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"fabric:model.write"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`],`})]}),`
25`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`    "auth_kind"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"api_key"`})]}),`
26`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`  },`})}),`
27`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "secret"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"fab_sk_EoWX5uQBDWVJfxXhgGdJOygW"`})]}),`
28`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`}`})})]})})}),`
29`,(0,r.jsx)(t.h3,{id:`the-grants-a-new-key-gets`,children:`The grants a new key gets`}),`
30`,(0,r.jsxs)(t.p,{children:[`With no `,(0,r.jsx)(t.code,{children:`grants`}),` field the key inherits the `,(0,r.jsx)(t.strong,{children:`default set for the creating role`}),`, not a fixed
31starter pair:`]}),`
32`,(0,r.jsxs)(t.ul,{children:[`
33`,(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:`OWNER`}),`, `,(0,r.jsx)(t.code,{children:`ORG_ADMIN`}),`, `,(0,r.jsx)(t.code,{children:`PROJECT_ADMIN`}),` → eight grants, including `,(0,r.jsx)(t.code,{children:`ontology.write`}),`, `,(0,r.jsx)(t.code,{children:`agent.run`}),`,
34`,(0,r.jsx)(t.code,{children:`skill.write`}),` and `,(0,r.jsx)(t.code,{children:`model.write`}),`.`]}),`
35`,(0,r.jsxs)(t.li,{children:[`Every other role → `,(0,r.jsx)(t.code,{children:`query.read`}),` and `,(0,r.jsx)(t.code,{children:`docs.read`}),` only. That branch is unreachable here in practice,
36because a non-admin cannot create a key at all.`]}),`
37`]}),`
38`,(0,r.jsxs)(t.p,{children:[`An explicit list is honoured exactly. Creating a key with `,(0,r.jsx)(t.code,{children:`{"grants":["fabric:query.read"]}`}),` and
39then reading `,(0,r.jsx)(t.code,{children:`GET /v1/whoami`}),` with it returned precisely one grant — and kept `,(0,r.jsx)(t.code,{children:`"role": "OWNER"`}),` in
40the scope, because the role is copied from the creator while the grants are not. `,(0,r.jsx)(t.strong,{children:`Read the grants,
41not the role.`})]}),`
42`,(0,r.jsx)(t.p,{children:`Narrow keys are the right default for anything unattended. A key cannot exceed what its creator
43held, but it can very easily hold more than the job needs.`}),`
44`,(0,r.jsx)(t.h3,{id:`refusals`,children:`Refusals`}),`
45`,(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:`Status`}),(0,r.jsx)(t.th,{children:`Body`}),(0,r.jsx)(t.th,{children:`Cause`})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`400`})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`name is required`})}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:`name`}),` absent or blank.`]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`400`})}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:`invalid_request`}),` with a decoder message`]}),(0,r.jsx)(t.td,{children:`The body is not valid JSON.`})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`401`})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`invalid_token`})}),(0,r.jsx)(t.td,{children:`No bearer header, or a credential that is not a valid user token — including an API key.`})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`403`})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`API key creation requires an admin role on this project`})}),(0,r.jsxs)(t.td,{children:[`A valid user token whose role is not `,(0,r.jsx)(t.code,{children:`OWNER`}),`, `,(0,r.jsx)(t.code,{children:`ORG_ADMIN`}),` or `,(0,r.jsx)(t.code,{children:`PROJECT_ADMIN`}),`. Confirmed live with a `,(0,r.jsx)(t.code,{children:`PROJECT_MEMBER`}),` token.`]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`502`})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`identity_unavailable`})}),(0,r.jsx)(t.td,{children:`The token carried no role claim, so the gateway had to look up the caller's project role and could not. Membership is never taken on trust from the request.`})]})]})]}),`
46`,(0,r.jsx)(t.h2,{id:`list-keys`,children:`List keys`}),`
47`,(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:`GET /v1/apikeys?project_id=…`}),`. The query parameter is required — without it the call is refused
48`,(0,r.jsx)(t.code,{children:`400 project_id query param required`}),` before authentication is even attempted.`]}),`
49`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsxs)(t.code,{children:[(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#6F42C1`},children:`curl`}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:` -sS`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:` "https://fabric.wexa.ai/v1/apikeys?project_id=proj_abc"`}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:` \\`})]}),`
50`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  -H`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:` "Authorization: Bearer `}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`$USER_TOKEN`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"`})]})]})})}),`
51`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsxs)(t.code,{children:[(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`{`})}),`
52`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "keys"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: [`})]}),`
53`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`    {`})}),`
54`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "id"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"key_IEhcUZrVvqI9C9hOAkwA_yOM"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
55`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "name"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"nightly-report"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
56`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "scope"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: { `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"org_id"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"org_abc"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"project_id"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"proj_abc"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"role"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"OWNER"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"grants"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: [`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"…"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`], `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"auth_kind"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"api_key"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:` },`})]}),`
57`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "created_by"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"u_abc"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
58`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "created_at"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"2026-09-15T15:52:30.732832779+05:30"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
59`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "last_used_at"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"2026-09-15T15:52:41.582623887+05:30"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
60`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "revoked"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`false`})]}),`
61`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`    }`})}),`
62`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`  ]`})}),`
63`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`}`})})]})})}),`
64`,(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:`last_used_at`}),` is the audit field worth watching. A key with no recent use is a key you can revoke
65cheaply; a revoked key that keeps being used tells you which caller still has the old secret. The
66secret itself is absent from every entry, and `,(0,r.jsx)(t.code,{children:`revoked`}),` keys stay listed rather than disappearing,
67so the record of what existed survives the revocation.`]}),`
68`,(0,r.jsx)(t.h2,{id:`revoke-a-key`,children:`Revoke a key`}),`
69`,(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:`DELETE /v1/apikeys/{id}?project_id=…`}),`. Both the path id and the query parameter are required.`]}),`
70`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsxs)(t.code,{children:[(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#6F42C1`},children:`curl`}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:` -sS`}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:` -X`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:` DELETE`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:` "https://fabric.wexa.ai/v1/apikeys/key_IEhcUZrVvqI9C9hOAkwA_yOM?project_id=proj_abc"`}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:` \\`})]}),`
71`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  -H`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:` "Authorization: Bearer `}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`$USER_TOKEN`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"`})]})]})})}),`
72`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsx)(t.code,{children:(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`{ `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"ok"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`true`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:` }`})]})})})}),`
73`,(0,r.jsxs)(t.p,{children:[`The id is checked against the project's own key list before anything is revoked, so a project admin
74cannot revoke a key belonging to another project by guessing its id. An id that is not in this
75project answers `,(0,r.jsx)(t.code,{children:`404 no such API key in this project`}),` — the same answer whether the key exists
76elsewhere or not at all.`]}),`
77`,(0,r.jsxs)(t.p,{children:[`Revocation takes effect on the next request. Immediately after the `,(0,r.jsx)(t.code,{children:`{"ok":true}`}),` above, the same
78key on `,(0,r.jsx)(t.code,{children:`GET /v1/whoami`}),` answered:`]}),`
79`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsxs)(t.code,{children:[(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{children:`HTTP/1.1 401 Unauthorized`})}),`
80`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{})}),`
81`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{children:`{"error":"invalid_token","error_description":"api key invalid or revoked"}`})})]})})}),`
82`,(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:`Status`}),(0,r.jsx)(t.th,{children:`Body`}),(0,r.jsx)(t.th,{children:`Cause`})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`400`})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`project_id query param required`})}),(0,r.jsx)(t.td,{children:`The query parameter is missing.`})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`401`})}
82),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`invalid_token`})}),(0,r.jsx)(t.td,{children:`Not a user token, or not one at all.`})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`403`})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`forbidden`})}),(0,r.jsx)(t.td,{children:`Valid user token, no admin role on that project.`})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`404`})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`no such API key in this project`})}),(0,r.jsx)(t.td,{children:`The id is not in this project's list.`})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`502`})}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:`revoke_failed`}),` / `,(0,r.jsx)(t.code,{children:`identity_unavailable`})]}),(0,r.jsx)(t.td,{children:`The key store, or the record of the caller's role, could not be reached.`})]})]})]}),`
83`,(0,r.jsx)(t.h2,{id:`rotating-a-key`,children:`Rotating a key`}),`
84`,(0,r.jsx)(t.p,{children:`There is no rotate endpoint. Rotation is three calls in this order, and the order is what keeps the
85caller running:`}),`
86`,(0,r.jsxs)(t.ol,{children:[`
87`,(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:`POST /v1/apikeys`}),` — mint the replacement, with the `,(0,r.jsx)(t.strong,{children:`same grants`}),` rather than the role default
88if the old key was deliberately narrow.`]}),`
89`,(0,r.jsxs)(t.li,{children:[`Deploy the new secret to every caller. Watch `,(0,r.jsx)(t.code,{children:`last_used_at`}),` on the old key stop moving.`]}),`
90`,(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:`DELETE /v1/apikeys/{id}`}),` — revoke the old one.`]}),`
91`]}),`
92`,(0,r.jsx)(t.p,{children:`Reversing steps 1 and 3 takes the integration down for the length of the deployment.`}),`
93`,(0,r.jsx)(t.h2,{id:`audit`,children:`Audit`}),`
94`,(0,r.jsxs)(t.p,{children:[`Creation and revocation both append an audit event — `,(0,r.jsx)(t.code,{children:`apikey.created`}),` and `,(0,r.jsx)(t.code,{children:`apikey.revoked`}),`, each
95recording the actor, their role, the key id and the project. They are readable at `,(0,r.jsx)(t.code,{children:`GET /v1/audit`}),`;
96see `,(0,r.jsx)(t.a,{href:`/docs/concepts/lifecycle-and-audit`,children:`lifecycle and audit`}),` for the record's shape and its
97hash-chain verification.`]}),`
98`,(0,r.jsx)(t.h2,{id:`related`,children:`Related`}),`
99`,(0,r.jsxs)(i,{children:[(0,r.jsx)(n,{title:`Authentication`,href:`/docs/api/authentication`,children:(0,r.jsxs)(t.p,{children:[`How a `,(0,r.jsx)(t.code,{children:`fab_sk_`}),` credential is resolved, and what limits apply to it.`]})}),(0,r.jsx)(n,{title:`Identity`,href:`/docs/api/identity`,children:(0,r.jsx)(t.p,{children:`Reading back the scope and grants a key actually holds.`})}),(0,r.jsx)(n,{title:`Roles and permissions`,href:`/docs/administration/roles-and-permissions`,children:(0,r.jsx)(t.p,{children:`Which roles count as admin on a project.`})}),(0,r.jsx)(n,{title:`Credential management`,href:`/docs/administration/credential-management`,children:(0,r.jsx)(t.p,{children:`The same lifecycle from an administrator's point of view.`})})]})]})}function o(e={}){let{wrapper:t}=e.components||{};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}function s(e,t){throw Error(`Expected `+(t?`component`:`object`)+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}var c=e({default:()=>d,frontmatter:()=>l}
99),l={title:`Authentication`,description:`The four credential types the gateway accepts, the order it tries them in, the grants each one ends up with, and every route that is deliberately unauthenticated.`,tab:`api`,group:`Credentials`,order:10};function u(e){let t={a:`a`,code:`code`,em:`em`,h1:`h1`,h2:`h2`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,...e.components},{Card:n,CardGrid:i}=t;return n||f(`Card`,!0),i||f(`CardGrid`,!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:`authentication`,children:`Authentication`}),`
100`,(0,r.jsx)(t.p,{children:`Every authenticated route on the gateway takes one header and nothing else:`}),`
101`,(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:`Authorization: Bearer <credential>
102`})}),`
103`,(0,r.jsxs)(t.p,{children:[`Behind that header the gateway accepts four kinds of credential. `,(0,r.jsx)(t.a,{href:`/docs/surfaces/rest/authentication`,children:`REST
104authentication`}),` introduces them and shows which to pick; this
105page is the reference behind it — the resolution order, the claims each type carries, the grants
106each one actually ends up with, and the complete list of routes that take no credential at all.`]}),`
107`,(0,r.jsxs)(t.p,{children:[`Hosts are written as `,(0,r.jsx)(t.code,{children:`https://fabric.wexa.ai`}),`; substitute your own issuer.`]}),`
108`,(0,r.jsx)(t.h2,{id:`how-a-credential-is-resolved`,children:`How a credential is resolved`}),`
109`,(0,r.jsx)(t.p,{children:`The gateway does not ask you which kind of credential you are sending. It works it out, in a fixed
110order, and the order is worth knowing because it decides which error you get when something is
111wrong.`}),`
112`,(0,r.jsxs)(t.ol,{children:[`
113`,(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:`Prefix match.`}),` A credential beginning `,(0,r.jsx)(t.code,{children:`fab_sk_`}),` is looked up in the API key store, by SHA-256
114hash. Nothing else is tried.`]}),`
115`,(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:`OAuth access token.`}),` Otherwise the credential is verified as an access token issued by this
116gateway — an HS256 JWT carrying `,(0,r.jsx)(t.code,{children:`token_use: "access"`}),`.`]}),`
117`,(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:`User token fallback.`}),` If that fails, it is verified as a Wexa user token: the same HS256
118signature, without the `,(0,r.jsx)(t.code,{children:`token_use: "access"`}),` claim. This is the session token the dashboard
119holds.`]}),`
120`]}),`
121`,(0,r.jsxs)(t.p,{children:[`An SDK session access token, issued by `,(0,r.jsx)(t.a,{href:`/docs/tools/login`,children:`login`}),`, is recognised by its
122`,(0,r.jsx)(t.code,{children:`token_use: "session"`}),` claim and resolved as the user who logged in, with their role in the project
123checked again on every call.`]}),`
124`,(0,r.jsxs)(t.p,{children:[`Two consequences follow. A mistyped API key that no longer starts with `,(0,r.jsx)(t.code,{children:`fab_sk_`}),` is never looked up
125as a key — it falls through to step 2, fails both JWT checks, and comes back as
126`,(0,r.jsx)(t.code,{children:`{"error":"invalid_token","error_description":"token invalid"}`}),` rather than anything mentioning a
127key. And a revoked key, which `,(0,r.jsx)(t.em,{children:`does`}),` match the prefix, is refused with a different message:
128`,(0,r.jsx)(t.code,{children:`api key invalid or revoked`}),`. The two strings are the fastest way to tell "wrong secret" from
129"wrong kind of secret".`]}),`
130`,(0,r.jsx)(t.h2,{id:`the-four-types-side-by-side`,children:`The four types side by side`}),`
131`,(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{}),(0,r.jsx)(t.th,{children:`API key`}),(0,r.jsx)(t.th,{children:`User token`}),(0,r.jsx)(t.th,{children:`OAuth 2.1 access token`}),(0,r.jsx)(t.th,{children:`SDK session`})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:`Form`}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:`fab_sk_…`}),` opaque string`]}),(0,r.jsx)(t.td,{children:`HS256 JWT`}),(0,r.jsxs)(t.td,{children:[`HS256 JWT, `,(0,r.jsx)(t.code,{children:`token_use: "access"`})]}),(0,r.jsxs)(t.td,{children:[`HS256 JWT, `,(0,r.jsx)(t.code,{children:`token_use: "session"`}),`, plus a `,(0,r.jsx)(t.code,{children:`fab_srt_…`}),` refresh token`]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:`Issued by`}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:`POST /v1/apikeys`}),` on this gateway`]}),(0,r.jsx)(t.td,{children:`The platform, at sign-in`}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:`POST /oauth/token`}),` on this gateway`]}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:`POST /v1/auth/login`}),` on this gateway`]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:`Verified by`}),(0,r.jsx)(t.td,{children:`Hash lookup in the key store`}),(0,r.jsx)(t.td,{children:`Signature check against the shared secret`}),(0,r.jsx)(t.td,{children:`Signature check against the shared secret`}),(0,r.jsx)(t.td,{children:`Signature check, then the session and the user's membership`})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:`Scope`}),(0,r.jsx)(t.td,{children:`Pinned at creation; never widens`}),(0,r.jsx)(t.td,{children:`The session's own claims, with header fallbacks`}),(0,r.jsx)(t.td,{children:`The scope consented to at authorization`}),(0,r.jsx)(t.td,{children:`One project, as the logged-in user with their current role`})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:`Expiry`}),(0,r.jsx)(t.td,{children:`None — revocation only`}),(0,r.jsxs)(t.td,{children:[`The session's `,(0,r.jsx)(t.code,{children:`exp`})]}),(0,r.jsx)(t.td,{children:`3600 seconds, refreshable for 30 days`}),(0,r.jsx)(t.td,{children:`3600 seconds, refreshable for 30 days`})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:`Reports itself as`}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`auth_kind: "api_key"`})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`auth_kind: "user_jwt"`})}),(0,r.jsx)(t.td,{children:`the access-token scope`}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`auth_kind: "session"`})})]})]})]}),`
132`,(0,r.jsx)(t.p,{children:`A user token is issued at sign-in; this gateway issues the other two. That split is the reason a
133user token is the credential for key management: it is minted where who you are is known, while an
134API key only knows the scope it was stamped with.`}),`
135`,(0,r.jsx)(t.h2,{id:`grants-are-derived-three-different-ways`,children:`Grants are derived three different ways`}),`
136`,(0,r.jsxs)(t.p,{children:[`This is the part that surprises people. The same person, on the same project, ends up with a
137different grant list depending on which credential they are holding. All three of the following were
138read back from `,(0,r.jsx)(t.code,{children:`GET /v1/whoami`}),` on one gateway, for one `,(0,r.jsx)(t.code,{children:`OWNER`}),` on one project.`]}),`
139`,(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:`Credential`}),(0,r.jsx)(t.th,{children:`Grants returned`})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:`API key (no explicit grants requested)`}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:`query.read`}),`, `,(0,r.jsx)(t.code,{children:`docs.read`}),`, `,(0,r.jsx)(t.code,{children:`ontology.write`}),`, `,(0,r.jsx)(t.code,{children:`orchestrate.read`}),`, `,(0,r.jsx)(t.code,{children:`orchestrate.write`}),`, `,(0,r.jsx)(t.code,{children:`agent.run`}),`, `,(0,r.jsx)(t.code,{children:`skill.write`}),`, `,(0,r.jsx)(t.code,{children:`model.write`})]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:`User token`}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:`query.read`}),`, `,(0,r.jsx)(t.code,{children:`ontology.write`}),`, `,(0,r.jsx)(t.code,{children:`docs.read`}),`, `,(0,r.jsx)(t.code,{children:`catalog.read`}),`, `,(0,r.jsx)(t.code,{children:`catalog.write`}),`, `,(0,r.jsx)(t.code,{children:`agent.run`})]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:`OAuth access token`}),(0,r.jsxs)(t.td,{children:[`exactly the scope consented to — here `,(0,r.jsx)(t.code,{children:`query.read`}),`, `,(0,r.jsx)(t.code,{children:`docs.read`})]})]})]})]}),`
140`,(0,r.jsxs)(t.p,{children:[`The API key list is the default set for the minting role: eight grants for `,(0,r.jsx)(t.code,{children:`OWNER`}),`, `,(0,r.jsx)(t.code,{children:`ORG_ADMIN`}),` and
141`,(0,r.jsx)(t.code,{children:`PROJECT_ADMIN`}),`, and the read-only pair `,(0,r.jsx)(t.code,{children:`query.read`}),` + `,(0,r.jsx)(t.code,{children:`docs.read`}),` for every other role. The user
142token's list is a `,(0,r.jsx)(t.strong,{children:`fixed six`}
142),`, assigned by the verification path itself and not varied by role —
143which is why it is the only credential of the three that can reach the catalog write endpoints. The
144access token's list is whatever the consent screen granted, and nothing more.`]}),`
145`,(0,r.jsxs)(t.p,{children:[`Grants gate the `,(0,r.jsx)(t.em,{children:`call`}),`, not the listing. A credential that lacks a grant still sees every tool in a
146`,(0,r.jsx)(t.code,{children:`tools/list`}),` response; the refusal arrives when it calls one, as
147`,(0,r.jsx)(t.code,{children:`error (S2:resolve-scope): token missing required grant "…"`}),`.`]}),`
148`,(0,r.jsx)(t.h2,{id:`api-key-format-and-storage`,children:`API key format and storage`}),`
149`,(0,r.jsxs)(t.p,{children:[`A key is `,(0,r.jsx)(t.code,{children:`fab_sk_`}),` followed by a random string. Only a SHA-256 hash of the secret is stored, so the
150gateway can verify a key it is shown and can never reproduce one it is not. The plaintext exists in
151exactly one response body, at creation. There is no recovery endpoint, and there is no rotation
152endpoint: a lost key is replaced by minting a new one, migrating callers, and revoking the old one.
153`,(0,r.jsx)(t.a,{href:`/docs/api/api-keys`,children:`API keys`}),` documents that sequence.`]}),`
154`,(0,r.jsx)(t.h2,{id:`rate-limits-on-a-key-authenticated-call`,children:`Rate limits on a key-authenticated call`}),`
155`,(0,r.jsx)(t.p,{children:`Two different limiters exist, and conflating them leads to the wrong retry behaviour.`}),`
156`,(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:`A per-key limit of 60 requests per minute applies to one route only:`}),`
157`,(0,r.jsx)(t.code,{children:`POST /v1/agents/{agentflowId}/chat/completions`}),`. It is a fixed one-minute window held in the
158the gateway, counted per key id, and it is the only place the per-key limiter is consulted.
159On a live gateway one key was allowed 60 requests inside the window, and the 61st was refused:`]}),`
160`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsxs)(t.code,{children:[(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{children:`HTTP/1.1 429 Too Many Requests`})}),`
161`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{children:`Retry-After: 1`})}),`
162`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{})}),`
163`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{children:`{"error":{"message":"too many requests for this API key — try again shortly","type":"rate_limit_exceeded","code":"rate_limited"}}`})})]})})}),`
164`,(0,r.jsxs)(t.p,{children:[`Note the body: that route speaks the OpenAI error shape, not Wexa's, and its `,(0,r.jsx)(t.code,{children:`Retry-After`}),` is a
165constant `,(0,r.jsx)(t.code,{children:`1`}),` rather than a computed remainder.`]}),`
166`,(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:`Everything else is governed by the project and organization quota windows`}),` — 120 requests per
167project and 600 per organization in a sliding 60-second window by default, `,(0,r.jsx)(t.code,{children:`0`}),` meaning unlimited.
168Those produce Wexa's own error body, `,(0,r.jsx)(t.code,{children:`"error":"S3:rate-quota"`}),`, with a `,(0,r.jsx)(t.code,{children:`Retry-After`}),` carrying the
169real seconds remaining. `,(0,r.jsx)(t.a,{href:`/docs/concepts/quota-and-credits`,children:`Quota and credits`}),` covers how they are
170configured, and `,(0,r.jsx)(t.a,{href:`/docs/surfaces/rest/errors-and-retries`,children:`errors and retries`}),` covers what to do about
171either one.`]}),`
172`,(0,r.jsx)(t.h2,{id:`routes-that-take-no-credential`,children:`Routes that take no credential`}),`
173`,(0,r.jsxs)(t.p,{children:[`Some routes are unauthenticated on purpose. They are not all unauthenticated in the same way, and
174the distinction matters: three of these verify a secret, they just do not verify a `,(0,r.jsx)(t.em,{children:`bearer`}),` secret.`]}),`
175`,(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:`Route`}),(0,r.jsx)(t.th,{children:`How it is authenticated`}),(0,r.jsx)(t.th,{children:`Why`})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`GET /healthz`})}),(0,r.jsx)(t.td,{children:`Nothing`}),(0,r.jsx)(t.td,{children:`A liveness probe runs before anything holds a credential.`})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`GET /v1/connection-info`})}),(0,r.jsx)(t.td,{children:`Nothing`}),(0,r.jsxs)(t.td,{children:[`It is what a client reads `,(0,r.jsx)(t.em,{children:`in order to`}),` authenticate. No secrets are in it.`]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`GET /.well-known/oauth-protected-resource`})}),(0,r.jsx)(t.td,{children:`Nothing`}),(0,r.jsxs)(t.td,{children:[`The `,(0,r.jsx)(t.code,{children:`401`}),` challenge points at it, so requiring a credential would be circular.`]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`GET /.well-known/oauth-protected-resource/mcp/{projectId}`})}),(0,r.jsx)(t.td,{children:`Nothing`}),(0,r.jsx)(t.td,{children:`The project-scoped variant of the same document.`})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`GET /.well-known/oauth-authorization-server`})}),(0,r.jsx)(t.td,{children:`Nothing`}),(0,r.jsx)(t.td,{children:`Standard authorization-server metadata.`})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`POST /oauth/register`})}),(0,r.jsx)(t.td,{children:`Nothing`}),(0,r.jsxs)(t.td,{children:[`Dynamic client registration is the mechanism by which an unknown client becomes known. An optional `,(0,r.jsx)(t.code,{children:`x-server-key`}),` header marks a first-party registration.`]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:`POST /mcp`}),`, `,(0,r.jsx)(t.code,{children:`GET /mcp`}),`, `,(0,r.jsx)(t.code,{children:`DELETE /mcp`}),`, `,(0,r.jsx)(t.code,{children:`GET /sse`})]}),(0,r.jsx)(t.td,{children:`Nothing`}),(0,r.jsxs)(t.td,{children:[`Retired paths answering `,(0,r.jsx)(t.code,{children:`410 Gone`}),` before authentication runs, so the answer is identical with or without a valid credential.`]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`POST /v1/codesync/webhook/github`})}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.strong,{children:`Provider signature`}),` — HMAC-SHA256 over the raw body in `,(0,r.jsx)(t.code,{children:`X-Hub-Signature-256`})]}),(0,r.jsx)(t.td,{children:`GitHub cannot hold a Wexa credential; it signs instead.`})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`POST /v1/catalog/om/webhook`})}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.strong,{children:`Provider signature`}),` — HMAC-SHA256, verified inside the webhook handler`]}),(0,r.jsx)(t.td,{children:`Same reason, for catalog change events.`})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:`POST /actions/linkedin/notify/{connectorID}/{pin}`}),`, `,(0,r.jsx)(t.code,{children:`POST /actions/mail/notify/{connectorID}/{pin}`}),`, `,(0,r.jsx)(t.code,{children:`POST /actions/whatsapp/notify/{connectorID}/{pin}`})]}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.strong,{children:`Path secret`}),` — the `,(0,r.jsx)(t.code,{children:`{pin}`}),` segment`]}),(0,r.jsx)(t.td,{children:`The provider was handed this URL and nothing else; the pin is the shared secret, and it is checked downstream.`})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`POST /unipile-webhook/{projectID}/{connectorID}`})}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.strong,{children:`Nothing`}),` — no pin, no signature`]}),(0,r.jsx)(t.td,{children:`The provider signs nothing. Authenticity is re-established downstream, which re-fetches the reported account from the provider before trusting it.`})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:`POST /blandai/{triggerID}`}),`, `,(0,r.jsx)(t.code,{children:`POST /falai/{triggerID}`})]}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:`Nothing`})}),(0,r.jsx)(t.td,{children:`These providers send no verifiable credential either. The trigger id is resolved against registration records downstream, and an unknown one is refused there.`})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`POST /v1/internal/catalog/ingest`})}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.strong,{children:`Shared-secret header`}),` — `,(0,r.jsx)(t.code,{children:`x-server-key`}),` must equal the gateway's configured server key`]}),(0,r.jsxs)(t.td,{children:[`A service-to-service route, never called by a customer. Unset key, or wrong key, answers `,(0,r.jsx)(t.code,{children:`401 unauthorized`}),`.`]})]})]})]}),`
176`,(0,r.jsxs)(t.p,{children:[`One route is authenticated but not by that header. `,(0,r.jsx)(t.code,{children:`POST /oauth/authorize`}),` reads the user token from
177a `,(0,r.jsx)(t.code,{children:`user_token`}),` `,(0,r.jsx)(t.strong,{children:`form field`}),`, falling back to the `,(0,r.jsx)(t.code,{children:`Authorization`}),` header only if the field is
178empty — because it is posted by a browser consent screen, not by an API client. Sent without either,
179it answers `,(0,r.jsx)(t.code,{children:`401 consent requires a valid Fabric user token`}),`.`]}),`
180`,(0,r.jsx)(t.h2,{id:`what-a-refusal-looks-like`,children:`What a refusal looks like`}),`
181`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsxs)(t.code,{children:[(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{children:`HTTP/1.1 401 Unauthorized`})}),`
182`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{children:`Www-Authenticate: Bearer resource_metadata="https://fabric.wexa.ai/.well-known/oauth-protected-resource"`})}),`
183`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{})}),`
184`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{children:`{"error":"invalid_token","error_description":"missing bearer credential"}`})})]})})}),`
185`,(0,r.jsx)(t.p,{children:`On a project-scoped connect URL the challenge names the project-scoped document instead, so a
186client that follows it discovers the right project without being told:`}),`
187`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsx)(t.code,{children:(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{children:`Www-Authenticate: Bearer resource_metadata="https://fabric.wexa.ai/.well-known/oauth-protected-resource/mcp/proj_abc123"`})})})})}),`
188`,(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:`Body`}),(0,r.jsx)(t.th,{children:`Meaning`})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`missing bearer credential`})}),(0,r.jsxs)(t.td,{children:[`No `,(0,r.jsx)(t.code,{children:`Authorization: Bearer`}),` header at all.`]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`api key invalid or revoked`})}),(0,r.jsxs)(t.td,{children:[`The credential matched `,(0,r.jsx)(t.code,{children:`fab_sk_`}),` but no live key.`]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`token invalid`})}),(0,r.jsx)(t.td,{children:`Not a key, and not a valid token of either JWT kind. Also what an API key gets on a route that requires a user token.`})]})]})]}),`
189`,(0,r.jsx)(t.h2,{id:`related`,children:`Related`}),`
190`,(0,r.jsxs)(i,{children:[(0,r.jsx)(n,{title:`API keys`,href:`/docs/api/api-keys`,children:(0,r.jsxs)(t.p,{children:[`Creating, listing and revoking `,(0,r.jsx)(t.code,{children:`fab_sk_`}),` credentials.`]})}),(0,r.jsx)(n,{title:`OAuth 2.1`,href:`/docs/api/oauth`,children:(0,r.jsx)(t.p,{children:`Registration, authorization, token, and both discovery documents.`})}),(0,r.jsx)(n,{title:`Identity`,href:`/docs/api/identity`,children:(0,r.jsx)(t.p,{children:`The endpoint that echoes your resolved scope back to you.`})}),(0,r.jsx)(n,{title:`REST authentication`,href:`/docs/surfaces/rest/authentication`,children:(0,r.jsx)(t.p,{children:`The narrative version: which credential to pick and why.`})})]})]})}function d(e={}){let{wrapper:t}=e.components||{};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}function f(e,t){throw Error(`Expected `+(t?`component`:`object`)+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}var p=e({default:()=>g,frontmatter:()=>m}
190),m={title:`Catalog`,description:`The thirteen catalog routes — ingestion, asset search and detail, lineage, the platform schema, the scorecard, connector status, synchronisation and the external webhook — with the grant each one needs and the two behaviours that surprise people.`,tab:`api`,group:`Platform routes`,order:60};function h(e){let t={a:`a`,code:`code`,h1:`h1`,h2:`h2`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,table:`table`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.h1,{id:`catalog`,children:`Catalog`}),`
191`,(0,r.jsx)(t.p,{children:`The catalog is Wexa's inventory of the data estate: tables, columns, the classifications attached
192to them, and the lineage between them. Thirteen routes read and write it. Eleven of them are
193ordinary project-scoped REST; one is a service-to-service ingest path you cannot call; one is an
194inbound webhook from OpenMetadata.`}),`
195`,(0,r.jsx)(t.p,{children:`Response bodies are quoted as they came back, trimmed where a field repeats.`}),`
196`,(0,r.jsx)(t.h2,{id:`grants-not-roles`,children:`Grants, not roles`}),`
197`,(0,r.jsxs)(t.p,{children:[`Two grants gate the whole surface, and neither is included in the default set an `,(0,r.jsx)(t.code,{children:`OWNER`}),`'s API key
198receives. Ask for them explicitly when you mint the key:`]}),`
199`,(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:`Grant`}),(0,r.jsx)(t.th,{children:`Routes`})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`fabric:catalog.read`})}),(0,r.jsxs)(t.td,{children:[`every `,(0,r.jsx)(t.code,{children:`GET`}),` on this page`]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`fabric:catalog.write`})}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:`POST /v1/catalog/ingest`}),`, `,(0,r.jsx)(t.code,{children:`POST /v1/catalog/sync`})]})]})]})]}),`
200`,(0,r.jsx)(t.p,{children:`A key without the grant is refused before anything is read:`}),`
201`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsx)(t.code,{children:(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`{ `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"error"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"forbidden"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"error_description"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"catalog:write grant required"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:` }`})]})})})}),`
202`,(0,r.jsxs)(t.p,{children:[`Every read is additionally confined to the caller's own project. For a user token the gateway confirms membership before answering, and adopts the platform's authoritative
203organization for that project, so a spoofed `,(0,r.jsx)(t.code,{children:`x-project-id`}),` header buys nothing.`]}),`
204`,(0,r.jsx)(t.h2,{id:`post-v1catalogingest`,children:(0,r.jsx)(t.code,{children:`POST /v1/catalog/ingest`})}),`
205`,(0,r.jsx)(t.p,{children:`Writes assets and lineage into the catalog. The body is OpenMetadata-shaped, which is the format the
206synchroniser emits, so the same payload works whether it came from OpenMetadata or from your own
207extraction.`}),`
208`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsxs)(t.code,{children:[(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#6F42C1`},children:`curl`}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:` -sS`}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:` -X`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:` POST`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:` https://fabric.wexa.ai/v1/catalog/ingest`}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:` \\`})]}),`
209`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  -H`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:` "Authorization: Bearer `}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`$FABRIC_API_KEY`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"`}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:` \\`})]}),`
210`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  -H`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:` "Content-Type: application/json"`}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:` \\`})]}),`
211`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  -d`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:` '{`})]}),`
212`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`    "project_id": "proj_abc",`})}),`
213`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`    "source": "manual",`})}),`
214`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`    "tables": [{`})}),`
215`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`      "id": "t1",`})}),`
216`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`      "name": "orders",`})}),`
217`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`      "fullyQualifiedName": "warehouse.public.orders",`})}),`
218`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`      "description": "One row per customer order.",`})}),`
219`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`      "tableType": "Regular",`})}),`
220`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`      "tags": [{ "tagFQN": "Sensitive" }],`})}),`
221`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`      "columns": [`})}),`
222`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`        { "name": "customer_email", "fullyQualifiedName": "warehouse.public.orders.customer_email",`})}),`
223`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`          "dataType": "VARCHAR", "description": "Billing contact", "tags": [{ "tagFQN": "PII" }] },`})}),`
224`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`        { "name": "total_cents", "fullyQualifiedName": "warehouse.public.orders.total_cents",`})}),`
225`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`          "dataType": "BIGINT", "description": "Order total in cents" }`})}),`
226`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`      ]`})}),`
227`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`    }],`})}),`
228`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`    "lineage": [{`})}),`
229`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`      "fromEntity": { "fullyQualifiedName": "warehouse.public.orders" },`})}),`
230`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`      "toEntity":   { "fullyQualifiedName": "warehouse.analytics.orders_daily" }`})}),`
231`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`    }]`})}),`
232`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`  }'`})})]})})}),`
233`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsx)(t.code,{children:(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`{ `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"created"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`5`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"updated"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`0`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"edges"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`5`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:` }`})]})})})}),`
234`,(0,r.jsxs)(t.p,{children:[`Sending exactly the same body again returned `,(0,r.jsx)(t.code,{children:`{"created":0,"updated":5,"edges":5}`}),` — assets are
235keyed on their fully-qualified name, so re-ingesting is an update rather than a duplicate. The
236counts include the derived nodes: a two-table, three-column payload created five assets, because
237each column is an asset in its own right.`]}
237),`
238`,(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:`project_id`}),` may be omitted, in which case the token's project is used. If it is present and names a
239different project the call is refused:`]}),`
240`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsx)(t.code,{children:(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`{ `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"error"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"forbidden"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"error_description"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"project_id must match token scope"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:` }`})]})})})}),`
241`,(0,r.jsxs)(t.p,{children:[`Two optional fields appear in the response when they apply: `,(0,r.jsx)(t.code,{children:`rejected`}),`, the count of lineage edges
242the allow-list refused, and `,(0,r.jsx)(t.code,{children:`errors`}),`, a list of strings.`]}),`
243`,(0,r.jsx)(t.h2,{id:`get-v1catalogassets`,children:(0,r.jsx)(t.code,{children:`GET /v1/catalog/assets`})}),`
244`,(0,r.jsx)(t.p,{children:`Search. Five query parameters, all optional.`}),`
245`,(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:`Parameter`}),(0,r.jsx)(t.th,{children:`Meaning`})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`q`})}),(0,r.jsx)(t.td,{children:`substring match on name and fully-qualified name`})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`kind`})}),(0,r.jsxs)(t.td,{children:[`one asset kind — `,(0,r.jsx)(t.code,{children:`Table`}),`, `,(0,r.jsx)(t.code,{children:`Column`}),`, `,(0,r.jsx)(t.code,{children:`Classification`}),`, `,(0,r.jsx)(t.code,{children:`DataService`})]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`pii_only`})}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:`true`}),` or `,(0,r.jsx)(t.code,{children:`1`}),` restricts to assets flagged as personally identifiable`]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`limit`})}),(0,r.jsxs)(t.td,{children:[`default `,(0,r.jsx)(t.code,{children:`20`}),`, `,(0,r.jsx)(t.strong,{children:`clamped to 100`}),` — asking for 500 returns 100`]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`offset`})}),(0,r.jsxs)(t.td,{children:[`default `,(0,r.jsx)(t.code,{children:`0`})]})]})]})]}),`
246`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsxs)(t.code,{children:[(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#6F42C1`},children:`curl`}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:` -sS`}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:` -H`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:` "Authorization: Bearer `}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`$FABRIC_API_KEY`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"`}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:` \\`})]}),`
247`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`  "https://fabric.wexa.ai/v1/catalog/assets?kind=Table&limit=2"`})})]})})}),`
248`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsxs)(t.code,{children:[(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`{`})}),`
249`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "limit"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`2`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
250`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "offset"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`0`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
251`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "total"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`2`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
252`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "results"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: [`})]}),`
253`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`    {`})}),`
254`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "id"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"cat_000001"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
255`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "kind"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"Table"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
256`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "fqn"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"warehouse.public.orders"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
257`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "project_id"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"proj_abc"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
258`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "props"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: {`})]}),`
259`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`        "description"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"One row per customer order."`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
260`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`        "columnCount"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`2`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
261`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`        "sourceSystem"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"warehouse"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
262`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`        "tableType"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"Regular"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
263`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`        "tags"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"[`}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`\\"`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`Sensitive`}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`\\"`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`]"`})]}),`
264`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`      },`})}),`
265`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "created_at"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"2026-09-15T16:21:16Z"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
266`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "updated_at"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"2026-09-15T16:21:16Z"`})]}),`
267`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`    }`})}),`
268`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`  ]`})}),`
269`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`}`})})]})})}),`
270`,(0,r.jsxs)(t.p,{children:[`Two things to expect. `,(0,r.jsx)(t.code,{children:`props.tags`}),` is a JSON `,(0,r.jsx)(t.strong,{children:`string`}),`, not an array — parse it a second time.
271And the unfiltered listing includes four global `,(0,r.jsx)(t.code,{children:`Classification`}),` assets — `,(0,r.jsx)(t.code,{children:`PII`}),`, `,(0,r.jsx)(t.code,{children:`Sensitive`}),`,
272`,(0,r.jsx)(t.code,{children:`Confidential`}),` and `,(0,r.jsx)(t.code,{children:`Public`}),` — that carry `,(0,r.jsx)(t.code,{children:`"project_id": "_global"`}),`; they are seeded, not ingested,
273and filtering on `,(0,r.jsx)(t.code,{children:`kind=Table`}),` removes them.`]}),`
274`,(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:`pii_only=true`}),` on the payload above returned exactly one row, the `,(0,r.jsx)(t.code,{children:`customer_email`}),` column, because
275its `,(0,r.jsx)(t.code,{children:`PII`}),` tag set `,(0,r.jsx)(t.code,{children:`props.piiFlag`}),` during ingestion.`]}),`
276`,(0,r.jsx)(t.h2,{id:`get-v1catalogassetsid`,children:(0,r.jsx)(t.code,{children:`GET /v1/catalog/assets/{id}`})}),`
277`,(0,r.jsxs)(t.p,{children:[`One asset plus both sides of its edge list. The `,(0,r.jsx)(t.code,{children:`{id}`}),` is the catalog id (`,(0,r.jsx)(t.code,{children:`cat_000001`}),`), not the
278fully-qualified name.`]}),`
279`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsxs)(t.code,{children:[(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`{`})}),`
280`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "asset"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: { `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"id"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"cat_000001"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"kind"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"Table"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"fqn"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"warehouse.public.orders"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"…"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"…"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:` },`})]}),`
281`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "incoming_edges"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`null`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
282`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "outgoing_edges"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: [`})]}),`
283`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`    { `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"id"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"edge_000003"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"label"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"HAS_COLUMN"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,    `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"from_id"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"cat_000001"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"to_id"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"cat_000002"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:` },`})]}),`
284`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`    { `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"id"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"edge_000006"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"label"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"HAS_COLUMN"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,    `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"from_id"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"cat_000001"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"to_id"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"cat_000005"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:` },`})]}),`
285`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`    { `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"id"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"edge_000010"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"label"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"DERIVES_FROM"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,  `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"from_id"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"cat_000001"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"to_id"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"cat_000007"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:` }`})]}),`
286`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`  ]`})}),`
287`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`}`})})]})})}),`
288`,(0,r.jsxs)(t.p,{children:[`An unknown id returns `,(0,r.jsx)(t.code,{children:`404`}),` with `,(0,r.jsx)(t.code,{children:`{"error":"not_found","error_description":"asset not found"}`}),`. So
289does an id belonging to another project — the tenant guard answers `,(0,r.jsx)(t.code,{children:`404`}),` rather than `,(0,r.jsx)(t.code,{children:`403`}),`
290deliberately, so a guessable id cannot confirm that someone else's asset exists.`]}),`
291`,(0,r.jsx)(t.h2,{id:`get-v1cataloglineageid`,children:(0,r.jsx)(t.code,{children:`GET /v1/catalog/lineage/{id}`})}),`
292`,(0,r.jsx)(t.p,{children:`Walks lineage edges outward from one asset.`}),`
293`,(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:`Parameter`}),(0,r.jsx)(t.th,{children:`Meaning`})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`direction`})}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:`downstream`}),` (default) or `,(0,r.jsx)(t.code,{children:`upstream`})]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`max_depth`})}),(0,r.jsxs)(t.td,{children:[`default `,(0,r.jsx)(t.code,{children:`5`}),`, clamped to `,(0,r.jsx)(t.code,{children:`10`})]})]})]})]}),`
294`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsxs)(t.code,{children:[(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`{`})}),`
295`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "root"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: { `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"id"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"cat_000001"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"fqn"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"warehouse.public.orders"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"…"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"…"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:` },`})]}),`
296`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "direction"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"upstream"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
297`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "node_count"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`1`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
298`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "nodes"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: [`})]}),`
299`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`    { `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"asset"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: { `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"fqn"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"warehouse.analytics.orders_daily"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"…"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"…"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:` },`})]}),`
300`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "depth"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`1`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"via"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"DERIVES_FROM"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:` }`})]}),`
301`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`  ]`})}),`
302`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`}`})})]})})}),`
303`,(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:`node_count`}),` is the length of `,(0,r.jsx)(t.code,{children:`nodes`}),`, and `,(0,r.jsx)(t.code,{children:`nodes`}),` is `,(0,r.jsx)(t.code,{children:`null`}),` rather than `,(0,r.jsx)(t.code,{children:`[]`}),` when the walk finds
304nothing. The root asset is never included in `,(0,r.jsx)(t.code,{children:`nodes`}),`.`]}),`
305`,(0,r.jsx)(t.h2,{id:`get-v1catalogschema`,children:(0,r.jsx)(t.code,{children:`GET /v1/catalog/schema`})}),`
306`,(0,r.jsx)(t.p,{children:`The platform schema the catalog stores assets against — node kinds, their properties, which
307properties are indexed. It takes no parameters and is the same for every project.`}),`
308`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsxs)(t.code,{children:[(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`{`})}),`
309`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "version"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"1"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
310`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "domain"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"data-estate"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
311`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "nodes"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: [`})]}),`
312`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`    {`})}),`
313`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "name"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"DataService"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
314`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "label"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"DataService"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
315`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "description"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"A data source or connector (Snowflake, Postgres, Kafka…)"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
316`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "category"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"data"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
317`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "properties"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: [`})]}),`
318`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`        { `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"name"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"serviceType"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"type"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"string"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"indexed"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`true`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:` },`})]}),`
319`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`        { `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"name"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"projectId"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,   `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"type"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"string"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"indexed"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`true`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:` }`})]}),`
320`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`      ]`})}),`
321`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`    }`})}),`
322`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`  ]`})}),`
323`,(0,r.jsx)(t.span,{className:`line`,c
323hildren:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`}`})})]})})}),`
324`,(0,r.jsxs)(t.p,{children:[`Read it when you are writing an ingestion client and need to know which property names the catalog
325will index. It is not the project ontology — that is
326`,(0,r.jsx)(t.a,{href:`#get-v1catalogontology`,children:(0,r.jsx)(t.code,{children:`GET /v1/catalog/ontology`})}),` below.`]}),`
327`,(0,r.jsx)(t.h2,{id:`get-v1catalogscorecard`,children:(0,r.jsx)(t.code,{children:`GET /v1/catalog/scorecard`})}),`
328`,(0,r.jsx)(t.p,{children:`Quality rules evaluated over the project's catalog, with a count and up to a few examples each.`}),`
329`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsxs)(t.code,{children:[(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`{`})}),`
330`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "project_id"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"proj_abc"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
331`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "status"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"healthy"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
332`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "rules"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: [`})]}),`
333`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`    { `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"key"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"pii_columns_without_description"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"severity"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"warning"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"count"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`0`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
334`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "description"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"PII-classified columns missing a description"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:` },`})]}),`
335`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`    { `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"key"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"orphan_columns"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,        `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"severity"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"warning"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"count"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`0`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:` },`})]}),`
336`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`    { `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"key"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"tables_without_lineage"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"severity"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"info"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,    `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"count"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`0`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:` },`})]}),`
337`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`    { `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"key"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"undescribed_tables"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,    `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"severity"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"info"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,    `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"count"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`0`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:` },`})]}),`
338`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`    { `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"key"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"tables_without_owner"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,  `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"severity"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"info"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,    `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"count"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`2`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
339`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "examples"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: [`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"warehouse.analytics.orders_daily"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"warehouse.public.orders"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`] }`})]}),`
340`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`  ]`})}),`
341`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`}`})})]})})}),`
342`,(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:`status`}),` summarises the rules; `,(0,r.jsx)(t.code,{children:`examples`}),` appears only on rules with a non-zero count. Ownership is
343the rule that fires on a fresh ingest, because nothing in the ingest payload assigns an owner.`]}),`
344`,(0,r.jsx)(t.h2,{id:`get-v1catalogontology`,children:(0,r.jsx)(t.code,{children:`GET /v1/catalog/ontology`})}),`
345`,(0,r.jsx)(t.p,{children:`The entity-and-relationship ontology inferred from the project's catalog: the containment hierarchy
346plus relationships derived from lineage.`}),`
347`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsxs)(t.code,{children:[(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`{`})}),`
348`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "project_id"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"proj_abc"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
349`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "entity_count"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`3`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
350`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "relationship_count"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`1`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
351`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "entities"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: [`})]}),`
352`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`    { `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"name"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"orders"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,       `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"kind"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"Table"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,       `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"fqn"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"warehouse.public.orders"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
353`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "service"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"warehouse"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"properties"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: [`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"customer_email"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"total_cents"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`] },`})]}),`
354`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`    { `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"name"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"orders_daily"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"kind"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"Table"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,       `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"fqn"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"warehouse.analytics.orders_daily"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
355`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "service"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"warehouse"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"properties"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: [`}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"day"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`] },`})]}),`
356`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`    { `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"name"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"warehouse"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,    `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"kind"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"DataService"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"fqn"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"warehouse"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
357`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "service"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"warehouse"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"properties"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`null`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:` }`})]}),`
358`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`  ],`})}),`
359`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "relationships"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: [`})]}),`
360`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`    { `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"from"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"orders"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"label"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"DERIVES_FROM"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"to"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"orders_daily"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"via"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"lineage"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:` }`})]}),`
361`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`  ]`})}),`
362`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`}`})})]})})}),`
363`,(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:`?columns=true`}),` additionally emits one entity per column. It is heavier — on the two-table example
364above it took the entity count from 3 to 6 — so request it only when you are rendering columns.`]}),`
365`,(0,r.jsx)(t.p,{children:`If the ontology comes back empty the gateway re-reads the project from its durable store once
366before answering, so a restart does not make a previously discovered ontology disappear.`}),`
367`,(0,r.jsxs)(t.h2,{id:`post-v1catalogsync-and-get-v1catalogsyncstats`,children:[(0,r.jsx)(t.code,{children:`POST /v1/catalog/sync`}),` and `,(0,r.jsx)(t.code,{children:`GET /v1/catalog/sync/stats`})]}),`
368`,(0,r.jsx)(t.p,{children:`Trigger a synchronisation from OpenMetadata, and read the last run's statistics. Both depend on the
369synchroniser being configured, and both say so plainly when it is not:`}),`
370`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsx)(t.code,{children:(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`{ `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"error"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"unavailable"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,
370 `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"error_description"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"OM sync not configured (OM_SYNC_ENABLED=false)"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:` }`})]})})})}),`
371`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsx)(t.code,{children:(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`{ `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"error"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"unavailable"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"error_description"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"OM sync not configured for this organization"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:` }`})]})})})}),`
372`,(0,r.jsxs)(t.h2,{id:`get-v1catalogconnectors-and-get-v1catalogconnectorsom-status`,children:[(0,r.jsx)(t.code,{children:`GET /v1/catalog/connectors`}),` and `,(0,r.jsx)(t.code,{children:`GET /v1/catalog/connectors/om-status`})]}),`
373`,(0,r.jsx)(t.p,{children:`The connector inventory, and how much of it OpenMetadata knows about.`}),`
374`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsxs)(t.code,{children:[(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`{`})}),`
375`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "connectors"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: [`})]}),`
376`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`    { `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"name"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"slack"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"display_name"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"Slack (Fabric)"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"category"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"messaging"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
377`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "origin"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"fabric"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"om_synced"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`false`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
378`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`      "description"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"Slack workspace messages, channels, and files"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:` }`})]}),`
379`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`  ]`})}),`
380`,(0,r.jsx)(t.span,{className:`line`,children:(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`}`})})]})})}),`
381`,(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:`origin`}),` distinguishes a connector Wexa registers itself from one discovered in OpenMetadata;
382`,(0,r.jsx)(t.code,{children:`om_synced`}),` says whether the two have been reconciled. The `,(0,r.jsx)(t.code,{children:`om-status`}),` route answers with the
383reconciliation counts, and on an unconfigured deployment returns zeros and nulls rather than an
384error:`]}),`
385`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsxs)(t.code,{children:[(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`{ `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"fabric_registered"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`null`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"om_native"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`null`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"total_fabric"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`0`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"total_om_native"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`0`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`,`})]}),`
386`,(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`  "fetched_at"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"2026-09-15T16:20:22Z"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:` }`})]})]})})}),`
387`,(0,r.jsx)(t.h2,{id:`post-v1catalogomwebhook`,children:(0,r.jsx)(t.code,{children:`POST /v1/catalog/om/webhook`})}),`
388`,(0,r.jsxs)(t.p,{children:[`The inbound webhook OpenMetadata calls when something in the estate changes, so the catalog refreshes
389in seconds rather than at the next scheduled synchronisation. It is unauthenticated in the usual
390sense — no bearer token — and is covered in full, with its signature scheme, on
391`,(0,r.jsx)(t.a,{href:`/docs/api/webhooks`,children:`Webhooks`}),`.`]}),`
392`,(0,r.jsx)(t.h2,{id:`post-v1internalcatalogingest`,children:(0,r.jsx)(t.code,{children:`POST /v1/internal/catalog/ingest`})}),`
393`,(0,r.jsxs)(t.p,{children:[`Not reachable by you. It is the service-to-service ingest path, authenticated by a shared
394`,(0,r.jsx)(t.code,{children:`x-server-key`}),` header that only Wexa's own services hold, and it refuses everything else:`]}),`
395`,(0,r.jsx)(r.Fragment,{children:(0,r.jsx)(t.pre,{className:`shiki github-light`,style:{backgroundColor:`#fff`,color:`#24292e`},tabIndex:`0`,children:(0,r.jsx)(t.code,{children:(0,r.jsxs)(t.span,{className:`line`,children:[(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`{ `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"error"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"unauthorized"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`, `}),(0,r.jsx)(t.span,{style:{color:`#005CC5`},children:`"error_description"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:`: `}),(0,r.jsx)(t.span,{style:{color:`#032F62`},children:`"valid x-server-key required"`}),(0,r.jsx)(t.span,{style:{color:`#24292E`},children:` }`})]})})})}),`
396`,(0,r.jsxs)(t.p,{children:[`It is listed here so that seeing it in a network trace does not look like a route you are missing.
397Use `,(0,r.jsx)(t.code,{children:`POST /v1/catalog/ingest`}),` with a credential instead.`]}),`
398`,(0,r.jsx)(t.h2,{id:`per-route-ledger`,children:`Per-route ledger`}),`
399`,(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:`Route`}),(0,r.jsx)(t.th,{children:`Result`})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`POST /v1/catalog/ingest`})}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:`200`}),`, and `,(0,r.jsx)(t.code,{children:`403`}),` on both grant and project mismatch`]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`GET /v1/catalog/assets`})}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:`200`}),`, with `,(0,r.jsx)(t.code,{children:`q`}),`, `,(0,r.jsx)(t.code,{children:`kind`}),`, `,(0,r.jsx)(t.code,{children:`pii_only`}),`, `,(0,r.jsx)(t.code,{children:`limit`}),`, `,(0,r.jsx)(t.code,{children:`offset`})]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`GET /v1/catalog/assets/{id}`})}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:`200`}),` and `,(0,r.jsx)(t.code,{children:`404`})]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`GET /v1/catalog/lineage/{id}`})}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:`200`}),` in both directions`]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`GET /v1/catalog/schema`})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`200`})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`GET /v1/catalog/scorecard`})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`200`})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`GET /v1/catalog/ontology`})}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:`200`}),`, with and without `,(0,r.jsx)(t.code,{children:`columns=true`})]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`POST /v1/catalog/sync`})}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:`503`}),` — synchroniser not configured`]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`GET /v1/catalog/sync/stats`})}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:`503`}),` — synchroniser not configured`]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`GET /v1/catalog/connectors`})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`200`})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`GET /v1/catalog/connectors/om-status`})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`200`})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`POST /v1/catalog/om/webhook`})}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:`503`}),` — webhook handler not configured`]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:`POST /v1/internal/catalog/ingest`})}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:`401`}),`, with and without a wrong header`]})]})]})]})]})}function g(e={}){let{wrapper:t}=e.components||{};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}export{c as n,n as r,p as t};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.