improvement(docs): align sidebar method badges and polish API reference styling (#3484)

* improvement(docs): align sidebar method badges and polish API reference styling

* fix(docs): revert className prop on DocsPage for CI compatibility

* fix(docs): restore oneOf schema for delete rows and use rem units in CSS

* fix(docs): replace :has() selectors with direct className for reliable prod layout

The API docs layout was intermittently narrow in production because CSS
:has(.api-page-header) selectors are unreliable in Tailwind v4 production
builds. Apply className="openapi-page" directly to DocsPage and replace
all 64 :has() selectors with .openapi-page class targeting.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(docs): bypass TypeScript check for className prop on DocsPage

Use spread with type assertion to pass className to DocsPage, working
around a CI type resolution issue where the prop exists at runtime but
is not recognized by TypeScript in the Vercel build environment.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(docs): use inline style tag for grid layout, revert CSS to :has() selectors

The className prop on DocsPage doesn't exist in the fumadocs-ui version
resolved on Vercel, so .openapi-page was never applied and all 64 CSS
rules broke. Revert to :has(.api-page-header) selectors for styling and
use an inline <style> tag for the critical grid-column layout override,
which is SSR'd and doesn't depend on any CSS selector matching.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(docs): add pill styling to footer navigation method badges

The footer nav badges (POST, GET, etc.) had color from data-method rules
but lacked the structural pill styling (padding, border-radius, font-size).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Waleed
2026-03-09 00:22:09 -07:00
committed by GitHub
parent a61dc23d43
commit 13d2a134d0
4 changed files with 419 additions and 270 deletions

View File

@@ -233,6 +233,7 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
lang={lang}
breadcrumb={breadcrumbs}
/>
<style>{`#nd-page { grid-column: 3 / span 2 !important; max-width: 1400px !important; }`}</style>
<DocsPage
toc={data.toc}
breadcrumb={{

View File

@@ -561,7 +561,7 @@ video {
}
/* Hide the empty TOC aside on OpenAPI pages so it doesn't overlay content */
#nd-docs-layout:has(#nd-page .api-page-header) #nd-toc {
#nd-docs-layout:has(#nd-page:has(.api-page-header)) #nd-toc {
display: none;
}
@@ -590,44 +590,39 @@ video {
"Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
}
/* Method badge pills in page content — colored background pills */
#nd-page span.font-mono.font-medium[class*="text-green"] {
background-color: rgb(220 252 231 / 0.6);
padding: 0.125rem 0.5rem;
border-radius: 0.375rem;
font-size: 0.75rem;
/* Method badge pills — shared background colors (page + sidebar) */
span.font-mono.font-medium[data-method="get"],
span.font-mono.font-medium[data-method="head"],
span.font-mono.font-medium[data-method="options"] {
background-color: rgb(220 252 231 / 0.85);
}
html.dark #nd-page span.font-mono.font-medium[class*="text-green"] {
html.dark span.font-mono.font-medium[data-method="get"],
html.dark span.font-mono.font-medium[data-method="head"],
html.dark span.font-mono.font-medium[data-method="options"] {
background-color: rgb(34 197 94 / 0.15);
}
#nd-page span.font-mono.font-medium[class*="text-blue"] {
background-color: rgb(219 234 254 / 0.6);
padding: 0.125rem 0.5rem;
border-radius: 0.375rem;
font-size: 0.75rem;
span.font-mono.font-medium[data-method="post"] {
background-color: rgb(219 234 254 / 0.85);
}
html.dark #nd-page span.font-mono.font-medium[class*="text-blue"] {
html.dark span.font-mono.font-medium[data-method="post"] {
background-color: rgb(59 130 246 / 0.15);
}
#nd-page span.font-mono.font-medium[class*="text-orange"] {
background-color: rgb(255 237 213 / 0.6);
padding: 0.125rem 0.5rem;
border-radius: 0.375rem;
font-size: 0.75rem;
span.font-mono.font-medium[data-method="put"] {
background-color: rgb(254 249 195 / 0.85);
}
html.dark #nd-page span.font-mono.font-medium[class*="text-orange"] {
html.dark span.font-mono.font-medium[data-method="put"] {
background-color: rgb(234 179 8 / 0.15);
}
span.font-mono.font-medium[data-method="patch"] {
background-color: rgb(255 237 213 / 0.85);
}
html.dark span.font-mono.font-medium[data-method="patch"] {
background-color: rgb(249 115 22 / 0.15);
}
#nd-page span.font-mono.font-medium[class*="text-red"] {
background-color: rgb(254 226 226 / 0.6);
padding: 0.125rem 0.5rem;
border-radius: 0.375rem;
font-size: 0.75rem;
span.font-mono.font-medium[data-method="delete"] {
background-color: rgb(254 226 226 / 0.85);
}
html.dark #nd-page span.font-mono.font-medium[class*="text-red"] {
html.dark span.font-mono.font-medium[data-method="delete"] {
background-color: rgb(239 68 68 / 0.15);
}
@@ -635,52 +630,31 @@ html.dark #nd-page span.font-mono.font-medium[class*="text-red"] {
#nd-sidebar a:has(span.font-mono.font-medium) {
display: flex !important;
align-items: center !important;
gap: 6px;
gap: 0.375rem;
}
/* Sidebar method badges — ensure proper inline flex display */
/* Sidebar method badges — fixed-width for right-aligned labels */
#nd-sidebar a span.font-mono.font-medium {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 2.25rem;
font-size: 10px !important;
width: 2.625rem;
font-size: 0.625rem !important;
line-height: 1 !important;
padding: 2.5px 4px;
border-radius: 3px;
padding: 0.15625rem 0.25rem;
border-radius: 0.1875rem;
flex-shrink: 0;
}
/* Sidebar GET badges */
#nd-sidebar a span.font-mono.font-medium[class*="text-green"] {
background-color: rgb(220 252 231 / 0.6);
}
html.dark #nd-sidebar a span.font-mono.font-medium[class*="text-green"] {
background-color: rgb(34 197 94 / 0.15);
}
/* Sidebar POST badges */
#nd-sidebar a span.font-mono.font-medium[class*="text-blue"] {
background-color: rgb(219 234 254 / 0.6);
}
html.dark #nd-sidebar a span.font-mono.font-medium[class*="text-blue"] {
background-color: rgb(59 130 246 / 0.15);
}
/* Sidebar PUT badges */
#nd-sidebar a span.font-mono.font-medium[class*="text-orange"] {
background-color: rgb(255 237 213 / 0.6);
}
html.dark #nd-sidebar a span.font-mono.font-medium[class*="text-orange"] {
background-color: rgb(249 115 22 / 0.15);
}
/* Sidebar DELETE badges */
#nd-sidebar a span.font-mono.font-medium[class*="text-red"] {
background-color: rgb(254 226 226 / 0.6);
}
html.dark #nd-sidebar a span.font-mono.font-medium[class*="text-red"] {
background-color: rgb(239 68 68 / 0.15);
/* Footer navigation method badges — pill styling to match sidebar */
#nd-page span.font-mono.font-medium[data-method] {
display: inline-flex;
align-items: center;
justify-content: center;
font-size: 0.625rem !important;
line-height: 1 !important;
padding: 0.15625rem 0.375rem;
border-radius: 0.1875rem;
}
/* Code block containers — match regular docs styling */
@@ -724,9 +698,7 @@ div.flex.flex-row.items-start.bg-fd-secondary.border.rounded-lg.text-xs {
background-color: rgb(249 250 251) !important;
border-color: rgb(229 231 235) !important;
}
html.dark
#nd-page:has(.api-page-header)
div.flex.flex-row.items-center.rounded-xl.border.not-prose {
html.dark #nd-page:has(.api-page-header) div.flex.flex-row.items-center.rounded-xl.border.not-prose {
--color-fd-card: rgb(24 24 27) !important;
background-color: rgb(24 24 27) !important;
border-color: rgb(63 63 70) !important;
@@ -740,22 +712,11 @@ html.dark
font-size: 0.6875rem !important;
letter-spacing: 0.025em;
text-transform: uppercase;
padding: 0.125rem 0.5rem !important;
border-radius: 0.375rem !important;
}
/* POST — softer blue */
#nd-page:has(.api-page-header)
div.flex.flex-row.items-center.rounded-xl.border.not-prose
span.font-mono.font-medium[class*="text-blue"] {
color: rgb(37 99 235) !important;
background-color: rgb(219 234 254 / 0.7) !important;
}
html.dark
#nd-page:has(.api-page-header)
div.flex.flex-row.items-center.rounded-xl.border.not-prose
span.font-mono.font-medium[class*="text-blue"] {
color: rgb(96 165 250) !important;
background-color: rgb(59 130 246 / 0.15) !important;
}
/* GET — softer green */
/* Path bar per-method colors (fumadocs renders these, so we match by class) */
/* GET */
#nd-page:has(.api-page-header)
div.flex.flex-row.items-center.rounded-xl.border.not-prose
span.font-mono.font-medium[class*="text-green"] {
@@ -769,6 +730,62 @@ html.dark
color: rgb(74 222 128) !important;
background-color: rgb(34 197 94 / 0.15) !important;
}
/* POST */
#nd-page:has(.api-page-header)
div.flex.flex-row.items-center.rounded-xl.border.not-prose
span.font-mono.font-medium[class*="text-blue"] {
color: rgb(37 99 235) !important;
background-color: rgb(219 234 254 / 0.7) !important;
}
html.dark
#nd-page:has(.api-page-header)
div.flex.flex-row.items-center.rounded-xl.border.not-prose
span.font-mono.font-medium[class*="text-blue"] {
color: rgb(96 165 250) !important;
background-color: rgb(59 130 246 / 0.15) !important;
}
/* PUT */
#nd-page:has(.api-page-header)
div.flex.flex-row.items-center.rounded-xl.border.not-prose
span.font-mono.font-medium[class*="text-yellow"] {
color: rgb(161 98 7) !important;
background-color: rgb(254 249 195 / 0.7) !important;
}
html.dark
#nd-page:has(.api-page-header)
div.flex.flex-row.items-center.rounded-xl.border.not-prose
span.font-mono.font-medium[class*="text-yellow"] {
color: rgb(250 204 21) !important;
background-color: rgb(234 179 8 / 0.15) !important;
}
/* PATCH */
#nd-page:has(.api-page-header)
div.flex.flex-row.items-center.rounded-xl.border.not-prose
span.font-mono.font-medium[class*="text-orange"] {
color: rgb(194 65 12) !important;
background-color: rgb(255 237 213 / 0.7) !important;
}
html.dark
#nd-page:has(.api-page-header)
div.flex.flex-row.items-center.rounded-xl.border.not-prose
span.font-mono.font-medium[class*="text-orange"] {
color: rgb(251 146 60) !important;
background-color: rgb(249 115 22 / 0.15) !important;
}
/* DELETE */
#nd-page:has(.api-page-header)
div.flex.flex-row.items-center.rounded-xl.border.not-prose
span.font-mono.font-medium[class*="text-red"] {
color: rgb(185 28 28) !important;
background-color: rgb(254 226 226 / 0.7) !important;
}
html.dark
#nd-page:has(.api-page-header)
div.flex.flex-row.items-center.rounded-xl.border.not-prose
span.font-mono.font-medium[class*="text-red"] {
color: rgb(248 113 113) !important;
background-color: rgb(239 68 68 / 0.15) !important;
}
/* Path text inside method+path bar — monospace, bright like Gumloop */
#nd-page:has(.api-page-header) div.flex.flex-row.items-center.rounded-xl.border.not-prose code {
@@ -778,10 +795,7 @@ html.dark
padding: 0 !important;
font-size: 0.8125rem !important;
}
html.dark
#nd-page:has(.api-page-header)
div.flex.flex-row.items-center.rounded-xl.border.not-prose
code {
html.dark #nd-page:has(.api-page-header) div.flex.flex-row.items-center.rounded-xl.border.not-prose code {
color: rgb(229 231 235) !important;
}
@@ -966,17 +980,17 @@ html.dark .response-section-dropdown-item:hover {
order: 1;
}
/* Type badge — order 2, grey pill like Mintlify */
/* Type badge — order 2, grey pill */
#nd-page:has(.api-page-header)
.flex.flex-wrap.items-center.gap-3.not-prose
> span.text-sm.font-mono.text-fd-muted-foreground {
order: 2;
background-color: rgb(240 240 243);
color: rgb(100 100 110);
padding: 0.125rem 0.5rem;
background-color: rgb(241 245 249);
color: rgb(71 85 105);
padding: 0.1875rem 0.5rem;
border-radius: 0.375rem;
font-size: 0.6875rem;
line-height: 1.25rem;
line-height: 1.125rem;
font-weight: 500;
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
}
@@ -984,8 +998,8 @@ html.dark
#nd-page:has(.api-page-header)
.flex.flex-wrap.items-center.gap-3.not-prose
> span.text-sm.font-mono.text-fd-muted-foreground {
background-color: rgb(39 39 42);
color: rgb(212 212 216);
background-color: rgb(51 51 56);
color: rgb(212 212 220);
}
/* Hide the "*" inside the name span — we'll add "required" as a ::after on the flex row */
@@ -993,33 +1007,30 @@ html.dark
display: none;
}
/* Required badge — order 3, light red pill */
#nd-page:has(.api-page-header)
.flex.flex-wrap.items-center.gap-3.not-prose:has(span.text-red-400)::after {
/* Required badge — order 3, red pill */
#nd-page:has(.api-page-header) .flex.flex-wrap.items-center.gap-3.not-prose:has(span.text-red-400)::after {
content: "required";
order: 3;
display: inline-flex;
align-items: center;
background-color: rgb(254 235 235);
color: rgb(220 38 38);
padding: 0.125rem 0.5rem;
background-color: rgb(254 226 226);
color: rgb(185 28 28);
padding: 0.1875rem 0.5rem;
border-radius: 0.375rem;
font-size: 0.6875rem;
line-height: 1.25rem;
line-height: 1.125rem;
font-weight: 500;
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
}
html.dark
#nd-page:has(.api-page-header)
.flex.flex-wrap.items-center.gap-3.not-prose:has(span.text-red-400)::after {
background-color: rgb(127 29 29 / 0.2);
background-color: rgb(153 27 27 / 0.3);
color: rgb(252 165 165);
}
/* Optional "?" indicator — hide it */
#nd-page:has(.api-page-header)
span.font-medium.font-mono.text-fd-primary
> span.text-fd-muted-foreground {
#nd-page:has(.api-page-header) span.font-medium.font-mono.text-fd-primary > span.text-fd-muted-foreground {
display: none;
}
@@ -1054,12 +1065,12 @@ html.dark
> span.text-sm.font-mono.text-fd-muted-foreground::after {
content: "string";
font-size: 0.6875rem;
line-height: 1.25rem;
line-height: 1.125rem;
font-weight: 500;
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
background-color: rgb(240 240 243);
color: rgb(100 100 110);
padding: 0.125rem 0.5rem;
background-color: rgb(241 245 249);
color: rgb(71 85 105);
padding: 0.1875rem 0.5rem;
border-radius: 0.375rem;
display: inline-flex;
align-items: center;
@@ -1069,8 +1080,8 @@ html.dark
div.my-4
> .flex.flex-wrap.items-center.gap-3.not-prose
> span.text-sm.font-mono.text-fd-muted-foreground::after {
background-color: rgb(39 39 42);
color: rgb(212 212 216);
background-color: rgb(51 51 56);
color: rgb(212 212 220);
}
/* "header" badge via ::before on the auth flex row */
@@ -1079,43 +1090,37 @@ html.dark
order: 3;
display: inline-flex;
align-items: center;
background-color: rgb(240 240 243);
color: rgb(100 100 110);
padding: 0.125rem 0.5rem;
background-color: rgb(241 245 249);
color: rgb(71 85 105);
padding: 0.1875rem 0.5rem;
border-radius: 0.375rem;
font-size: 0.6875rem;
line-height: 1.25rem;
line-height: 1.125rem;
font-weight: 500;
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
}
html.dark
#nd-page:has(.api-page-header)
div.my-4
> .flex.flex-wrap.items-center.gap-3.not-prose::before {
background-color: rgb(39 39 42);
color: rgb(212 212 216);
html.dark #nd-page:has(.api-page-header) div.my-4 > .flex.flex-wrap.items-center.gap-3.not-prose::before {
background-color: rgb(51 51 56);
color: rgb(212 212 220);
}
/* "required" badge via ::after on the auth flex row — light red pill */
/* "required" badge via ::after on the auth flex row — red pill */
#nd-page:has(.api-page-header) div.my-4 > .flex.flex-wrap.items-center.gap-3.not-prose::after {
content: "required";
order: 4;
display: inline-flex;
align-items: center;
background-color: rgb(254 235 235);
color: rgb(220 38 38);
padding: 0.125rem 0.5rem;
background-color: rgb(254 226 226);
color: rgb(185 28 28);
padding: 0.1875rem 0.5rem;
border-radius: 0.375rem;
font-size: 0.6875rem;
line-height: 1.25rem;
line-height: 1.125rem;
font-weight: 500;
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
}
html.dark
#nd-page:has(.api-page-header)
div.my-4
> .flex.flex-wrap.items-center.gap-3.not-prose::after {
background-color: rgb(127 29 29 / 0.2);
html.dark #nd-page:has(.api-page-header) div.my-4 > .flex.flex-wrap.items-center.gap-3.not-prose::after {
background-color: rgb(153 27 27 / 0.3);
color: rgb(252 165 165);
}
@@ -1168,22 +1173,19 @@ html.dark #nd-page:has(.api-page-header) .text-sm.border-t {
#nd-page:has(.api-page-header) .flex.flex-wrap.items-center.gap-3.not-prose > button,
#nd-page:has(.api-page-header) .flex.flex-wrap.items-center.gap-3.not-prose > span:has(> button) {
order: 2;
background-color: rgb(240 240 243);
color: rgb(100 100 110);
padding: 0.125rem 0.5rem;
background-color: rgb(241 245 249);
color: rgb(71 85 105);
padding: 0.1875rem 0.5rem;
border-radius: 0.375rem;
font-size: 0.6875rem;
line-height: 1.25rem;
line-height: 1.125rem;
font-weight: 500;
font-family: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
}
html.dark #nd-page:has(.api-page-header) .flex.flex-wrap.items-center.gap-3.not-prose > button,
html.dark
#nd-page:has(.api-page-header)
.flex.flex-wrap.items-center.gap-3.not-prose
> span:has(> button) {
background-color: rgb(39 39 42);
color: rgb(212 212 216);
html.dark #nd-page:has(.api-page-header) .flex.flex-wrap.items-center.gap-3.not-prose > span:has(> button) {
background-color: rgb(51 51 56);
color: rgb(212 212 220);
}
/* Section headings (Authorization, Path Parameters, etc.) — consistent top spacing */

View File

@@ -62,7 +62,10 @@ function openapiPluginBadgeLeft() {
null,
createElement(
'span',
{ className: `font-mono font-medium me-1.5 text-[10px] text-nowrap ${colorClass}` },
{
className: `font-mono font-medium me-1.5 text-[10px] text-nowrap ${colorClass}`,
'data-method': method.toLowerCase(),
},
method
),
node.name

View File

@@ -284,7 +284,8 @@
"description": "Cursor for fetching the next page of results. null when there are no more results."
},
"limits": {
"$ref": "#/components/schemas/Limits"
"$ref": "#/components/schemas/Limits",
"description": "Rate limit and usage information for the current API key."
}
}
}
@@ -342,7 +343,8 @@
"$ref": "#/components/schemas/WorkflowDetail"
},
"limits": {
"$ref": "#/components/schemas/Limits"
"$ref": "#/components/schemas/Limits",
"description": "Rate limit and usage information for the current API key."
}
}
}
@@ -1063,7 +1065,8 @@
"type": "object",
"properties": {
"success": {
"type": "boolean"
"type": "boolean",
"description": "Indicates whether the request was successful."
},
"data": {
"type": "object",
@@ -1072,13 +1075,15 @@
"type": "array",
"items": {
"$ref": "#/components/schemas/Table"
}
},
"description": "Array of tables in the workspace."
},
"totalCount": {
"type": "integer",
"description": "Total number of tables."
}
}
},
"description": "Response payload."
}
}
}
@@ -1145,7 +1150,8 @@
"minItems": 1,
"description": "Column definitions for the table."
}
}
},
"description": "Table schema definition containing column definitions."
}
}
}
@@ -1161,18 +1167,22 @@
"type": "object",
"properties": {
"success": {
"type": "boolean"
"type": "boolean",
"description": "Indicates whether the request was successful."
},
"data": {
"type": "object",
"properties": {
"table": {
"$ref": "#/components/schemas/Table"
"$ref": "#/components/schemas/Table",
"description": "The newly created table."
},
"message": {
"type": "string"
"type": "string",
"description": "Confirmation message."
}
}
},
"description": "Response payload."
}
}
}
@@ -1238,15 +1248,18 @@
"type": "object",
"properties": {
"success": {
"type": "boolean"
"type": "boolean",
"description": "Indicates whether the request was successful."
},
"data": {
"type": "object",
"properties": {
"table": {
"$ref": "#/components/schemas/Table"
"$ref": "#/components/schemas/Table",
"description": "The requested table with its metadata and schema."
}
}
},
"description": "Response payload."
}
}
}
@@ -1313,15 +1326,18 @@
"type": "object",
"properties": {
"success": {
"type": "boolean"
"type": "boolean",
"description": "Indicates whether the request was successful."
},
"data": {
"type": "object",
"properties": {
"message": {
"type": "string"
"type": "string",
"description": "Confirmation message."
}
}
},
"description": "Response payload."
}
}
}
@@ -1431,7 +1447,8 @@
"type": "object",
"properties": {
"success": {
"type": "boolean"
"type": "boolean",
"description": "Indicates whether the request was successful."
},
"data": {
"type": "object",
@@ -1440,7 +1457,8 @@
"type": "array",
"items": {
"$ref": "#/components/schemas/TableRow"
}
},
"description": "Array of rows matching the query."
},
"rowCount": {
"type": "integer",
@@ -1451,12 +1469,15 @@
"description": "Total rows matching the filter."
},
"limit": {
"type": "integer"
"type": "integer",
"description": "The limit that was applied to the query."
},
"offset": {
"type": "integer"
"type": "integer",
"description": "The offset that was applied to the query."
}
}
},
"description": "Response payload."
}
}
}
@@ -1517,7 +1538,8 @@
"description": "Single row insert.",
"properties": {
"workspaceId": {
"type": "string"
"type": "string",
"description": "The workspace that owns the table."
},
"data": {
"type": "object",
@@ -1532,7 +1554,8 @@
"description": "Batch insert (up to 1000 rows).",
"properties": {
"workspaceId": {
"type": "string"
"type": "string",
"description": "The workspace that owns the table."
},
"rows": {
"type": "array",
@@ -1540,7 +1563,8 @@
"type": "object",
"additionalProperties": true
},
"maxItems": 1000
"maxItems": 1000,
"description": "Array of row objects to insert. Each object contains key-value pairs matching the table schema."
}
}
}
@@ -1558,27 +1582,33 @@
"type": "object",
"properties": {
"success": {
"type": "boolean"
"type": "boolean",
"description": "Indicates whether the request was successful."
},
"data": {
"type": "object",
"properties": {
"row": {
"$ref": "#/components/schemas/TableRow"
"$ref": "#/components/schemas/TableRow",
"description": "The inserted row (present for single-row inserts)."
},
"rows": {
"type": "array",
"items": {
"$ref": "#/components/schemas/TableRow"
}
},
"description": "Array of inserted rows (present for batch inserts)."
},
"insertedCount": {
"type": "integer"
"type": "integer",
"description": "Number of rows successfully inserted."
},
"message": {
"type": "string"
"type": "string",
"description": "Confirmation message."
}
}
},
"description": "Response payload."
}
}
}
@@ -1623,7 +1653,8 @@
"schema": {
"type": "string",
"example": "tbl_abc123"
}
},
"description": "The table to update rows in."
}
],
"requestBody": {
@@ -1635,7 +1666,8 @@
"required": ["workspaceId", "filter", "data"],
"properties": {
"workspaceId": {
"type": "string"
"type": "string",
"description": "The workspace that owns the table."
},
"filter": {
"type": "object",
@@ -1667,24 +1699,29 @@
"type": "object",
"properties": {
"success": {
"type": "boolean"
"type": "boolean",
"description": "Indicates whether the request was successful."
},
"data": {
"type": "object",
"properties": {
"message": {
"type": "string"
"type": "string",
"description": "Confirmation message describing how many rows were updated."
},
"updatedCount": {
"type": "integer"
"type": "integer",
"description": "Number of rows that were updated."
},
"updatedRowIds": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Array of IDs for each row that was updated."
}
}
},
"description": "Response payload."
}
}
}
@@ -1729,7 +1766,8 @@
"schema": {
"type": "string",
"example": "tbl_abc123"
}
},
"description": "The table to delete rows from."
}
],
"requestBody": {
@@ -1744,16 +1782,19 @@
"description": "Delete by filter.",
"properties": {
"workspaceId": {
"type": "string"
"type": "string",
"description": "The workspace that owns the table."
},
"filter": {
"type": "object",
"additionalProperties": true
"additionalProperties": true,
"description": "Filter criteria to match rows for deletion."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 1000
"maximum": 1000,
"description": "Maximum number of rows to delete. Defaults to all matching rows, capped at 1000."
}
}
},
@@ -1763,14 +1804,16 @@
"description": "Delete by IDs.",
"properties": {
"workspaceId": {
"type": "string"
"type": "string",
"description": "The workspace that owns the table."
},
"rowIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 1000
"maxItems": 1000,
"description": "Explicit list of row IDs to delete (max 1000)."
}
}
}
@@ -1788,22 +1831,26 @@
"type": "object",
"properties": {
"success": {
"type": "boolean"
"type": "boolean",
"description": "Indicates whether the request was successful."
},
"data": {
"type": "object",
"properties": {
"message": {
"type": "string"
"type": "string",
"description": "Confirmation message describing how many rows were deleted."
},
"deletedCount": {
"type": "integer"
"type": "integer",
"description": "Number of rows that were deleted."
},
"deletedRowIds": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Array of IDs for each row that was deleted."
},
"requestedCount": {
"type": "integer",
@@ -1816,7 +1863,8 @@
},
"description": "Row IDs that were requested but not found (only present when deleting by IDs)."
}
}
},
"description": "Response payload."
}
}
}
@@ -1863,7 +1911,8 @@
"schema": {
"type": "string",
"example": "tbl_abc123"
}
},
"description": "The table the row belongs to."
},
{
"name": "rowId",
@@ -1881,7 +1930,8 @@
"required": true,
"schema": {
"type": "string"
}
},
"description": "The workspace that owns the table."
}
],
"responses": {
@@ -1893,15 +1943,18 @@
"type": "object",
"properties": {
"success": {
"type": "boolean"
"type": "boolean",
"description": "Indicates whether the request was successful."
},
"data": {
"type": "object",
"properties": {
"row": {
"$ref": "#/components/schemas/TableRow"
"$ref": "#/components/schemas/TableRow",
"description": "The requested row."
}
}
},
"description": "Response payload."
}
}
}
@@ -1946,7 +1999,8 @@
"schema": {
"type": "string",
"example": "tbl_abc123"
}
},
"description": "The table the row belongs to."
},
{
"name": "rowId",
@@ -1968,7 +2022,8 @@
"required": ["workspaceId", "data"],
"properties": {
"workspaceId": {
"type": "string"
"type": "string",
"description": "The workspace that owns the table."
},
"data": {
"type": "object",
@@ -1989,18 +2044,22 @@
"type": "object",
"properties": {
"success": {
"type": "boolean"
"type": "boolean",
"description": "Indicates whether the request was successful."
},
"data": {
"type": "object",
"properties": {
"row": {
"$ref": "#/components/schemas/TableRow"
"$ref": "#/components/schemas/TableRow",
"description": "The updated row with all current field values."
},
"message": {
"type": "string"
"type": "string",
"description": "Confirmation message."
}
}
},
"description": "Response payload."
}
}
}
@@ -2045,7 +2104,8 @@
"schema": {
"type": "string",
"example": "tbl_abc123"
}
},
"description": "The table the row belongs to."
},
{
"name": "rowId",
@@ -2063,7 +2123,8 @@
"required": true,
"schema": {
"type": "string"
}
},
"description": "The workspace that owns the table."
}
],
"responses": {
@@ -2075,18 +2136,22 @@
"type": "object",
"properties": {
"success": {
"type": "boolean"
"type": "boolean",
"description": "Indicates whether the request was successful."
},
"data": {
"type": "object",
"properties": {
"message": {
"type": "string"
"type": "string",
"description": "Confirmation message."
},
"deletedCount": {
"type": "integer"
"type": "integer",
"description": "Number of rows deleted (always 1 for single-row deletion)."
}
}
},
"description": "Response payload."
}
}
}
@@ -2133,7 +2198,8 @@
"schema": {
"type": "string",
"example": "tbl_abc123"
}
},
"description": "The table to upsert the row into."
}
],
"requestBody": {
@@ -2171,13 +2237,15 @@
"type": "object",
"properties": {
"success": {
"type": "boolean"
"type": "boolean",
"description": "Indicates whether the request was successful."
},
"data": {
"type": "object",
"properties": {
"row": {
"$ref": "#/components/schemas/TableRow"
"$ref": "#/components/schemas/TableRow",
"description": "The inserted or updated row."
},
"operation": {
"type": "string",
@@ -2185,9 +2253,11 @@
"description": "Whether the row was inserted or updated."
},
"message": {
"type": "string"
"type": "string",
"description": "Confirmation message."
}
}
},
"description": "Response payload."
}
}
}
@@ -2246,7 +2316,8 @@
"type": "object",
"properties": {
"success": {
"type": "boolean"
"type": "boolean",
"description": "Whether the request completed successfully."
},
"data": {
"type": "object",
@@ -2255,13 +2326,15 @@
"type": "array",
"items": {
"$ref": "#/components/schemas/FileMetadata"
}
},
"description": "Array of file metadata objects in the workspace."
},
"totalCount": {
"type": "integer",
"description": "Total number of files."
}
}
},
"description": "Response payload containing the files list and count."
}
}
}
@@ -2326,18 +2399,22 @@
"type": "object",
"properties": {
"success": {
"type": "boolean"
"type": "boolean",
"description": "Whether the upload completed successfully."
},
"data": {
"type": "object",
"properties": {
"file": {
"$ref": "#/components/schemas/FileMetadata"
"$ref": "#/components/schemas/FileMetadata",
"description": "Metadata of the newly uploaded file."
},
"message": {
"type": "string"
"type": "string",
"description": "Human-readable confirmation message."
}
}
},
"description": "Response payload containing the uploaded file metadata."
}
}
}
@@ -2361,7 +2438,8 @@
"type": "object",
"properties": {
"error": {
"type": "string"
"type": "string",
"description": "Error message indicating a file with the same name already exists in this workspace."
}
}
}
@@ -2523,15 +2601,18 @@
"type": "object",
"properties": {
"success": {
"type": "boolean"
"type": "boolean",
"description": "Whether the deletion completed successfully."
},
"data": {
"type": "object",
"properties": {
"message": {
"type": "string"
"type": "string",
"description": "Human-readable confirmation message."
}
}
},
"description": "Response payload containing the deletion confirmation."
}
}
}
@@ -2590,7 +2671,8 @@
"type": "object",
"properties": {
"success": {
"type": "boolean"
"type": "boolean",
"description": "Whether the request was successful."
},
"data": {
"type": "object",
@@ -2599,13 +2681,15 @@
"type": "array",
"items": {
"$ref": "#/components/schemas/KnowledgeBase"
}
},
"description": "Array of knowledge base objects in the workspace."
},
"totalCount": {
"type": "integer",
"description": "Total number of knowledge bases."
}
}
},
"description": "Response payload containing the list of knowledge bases."
}
}
}
@@ -2662,7 +2746,8 @@
"maxLength": 1000
},
"chunkingConfig": {
"$ref": "#/components/schemas/ChunkingConfig"
"$ref": "#/components/schemas/ChunkingConfig",
"description": "Optional chunking configuration for document processing. Defaults to maxSize=1024, minSize=100, overlap=200 if omitted."
}
}
}
@@ -2678,18 +2763,22 @@
"type": "object",
"properties": {
"success": {
"type": "boolean"
"type": "boolean",
"description": "Whether the request was successful."
},
"data": {
"type": "object",
"properties": {
"knowledgeBase": {
"$ref": "#/components/schemas/KnowledgeBase"
"$ref": "#/components/schemas/KnowledgeBase",
"description": "The newly created knowledge base object."
},
"message": {
"type": "string"
"type": "string",
"description": "Human-readable confirmation message."
}
}
},
"description": "Response payload containing the created knowledge base."
}
}
}
@@ -2754,15 +2843,18 @@
"type": "object",
"properties": {
"success": {
"type": "boolean"
"type": "boolean",
"description": "Whether the request was successful."
},
"data": {
"type": "object",
"properties": {
"knowledgeBase": {
"$ref": "#/components/schemas/KnowledgeBase"
"$ref": "#/components/schemas/KnowledgeBase",
"description": "The knowledge base object."
}
}
},
"description": "Response payload containing the knowledge base details."
}
}
}
@@ -2833,7 +2925,8 @@
"maxLength": 1000
},
"chunkingConfig": {
"$ref": "#/components/schemas/ChunkingConfig"
"$ref": "#/components/schemas/ChunkingConfig",
"description": "Updated chunking configuration. All three fields (maxSize, minSize, overlap) must be provided if included."
}
}
}
@@ -2849,18 +2942,22 @@
"type": "object",
"properties": {
"success": {
"type": "boolean"
"type": "boolean",
"description": "Whether the request was successful."
},
"data": {
"type": "object",
"properties": {
"knowledgeBase": {
"$ref": "#/components/schemas/KnowledgeBase"
"$ref": "#/components/schemas/KnowledgeBase",
"description": "The updated knowledge base object."
},
"message": {
"type": "string"
"type": "string",
"description": "Human-readable confirmation message."
}
}
},
"description": "Response payload containing the updated knowledge base."
}
}
}
@@ -2926,15 +3023,18 @@
"type": "object",
"properties": {
"success": {
"type": "boolean"
"type": "boolean",
"description": "Whether the request was successful."
},
"data": {
"type": "object",
"properties": {
"message": {
"type": "string"
"type": "string",
"description": "Human-readable confirmation message."
}
}
},
"description": "Response payload."
}
}
}
@@ -3066,7 +3166,8 @@
"type": "object",
"properties": {
"success": {
"type": "boolean"
"type": "boolean",
"description": "Whether the request was successful."
},
"data": {
"type": "object",
@@ -3075,26 +3176,33 @@
"type": "array",
"items": {
"$ref": "#/components/schemas/KnowledgeDocument"
}
},
"description": "Array of document objects in the knowledge base."
},
"pagination": {
"type": "object",
"properties": {
"total": {
"type": "integer"
"type": "integer",
"description": "Total number of documents matching the query."
},
"limit": {
"type": "integer"
"type": "integer",
"description": "Maximum number of documents returned per page."
},
"offset": {
"type": "integer"
"type": "integer",
"description": "Number of documents skipped from the beginning."
},
"hasMore": {
"type": "boolean"
"type": "boolean",
"description": "Whether there are more documents beyond the current page."
}
}
},
"description": "Pagination metadata for the document list."
}
}
},
"description": "Response payload containing the documents and pagination info."
}
}
}
@@ -3173,18 +3281,22 @@
"type": "object",
"properties": {
"success": {
"type": "boolean"
"type": "boolean",
"description": "Whether the request was successful."
},
"data": {
"type": "object",
"properties": {
"document": {
"$ref": "#/components/schemas/KnowledgeDocument"
"$ref": "#/components/schemas/KnowledgeDocument",
"description": "The newly created document object with initial processing status of 'pending'."
},
"message": {
"type": "string"
"type": "string",
"description": "Human-readable confirmation message."
}
}
},
"description": "Response payload containing the uploaded document."
}
}
}
@@ -3211,7 +3323,8 @@
"type": "object",
"properties": {
"error": {
"type": "string"
"type": "string",
"description": "Error message indicating a file with the same name already exists."
}
}
}
@@ -3226,7 +3339,8 @@
"type": "object",
"properties": {
"error": {
"type": "string"
"type": "string",
"description": "Error message indicating the workspace storage limit has been exceeded."
}
}
}
@@ -3241,7 +3355,8 @@
"type": "object",
"properties": {
"error": {
"type": "string"
"type": "string",
"description": "Error message indicating the file type is not supported."
}
}
}
@@ -3306,15 +3421,18 @@
"type": "object",
"properties": {
"success": {
"type": "boolean"
"type": "boolean",
"description": "Whether the request was successful."
},
"data": {
"type": "object",
"properties": {
"document": {
"$ref": "#/components/schemas/KnowledgeDocumentDetail"
"$ref": "#/components/schemas/KnowledgeDocumentDetail",
"description": "Detailed document object including processing and connector information."
}
}
},
"description": "Response payload containing the document details."
}
}
}
@@ -3386,15 +3504,18 @@
"type": "object",
"properties": {
"success": {
"type": "boolean"
"type": "boolean",
"description": "Whether the request was successful."
},
"data": {
"type": "object",
"properties": {
"message": {
"type": "string"
"type": "string",
"description": "Human-readable confirmation message."
}
}
},
"description": "Response payload."
}
}
}
@@ -3455,7 +3576,8 @@
},
"description": "An array of knowledge base IDs to search across."
}
]
],
"description": "Array of knowledge base IDs to search across."
},
"query": {
"type": "string",
@@ -3489,7 +3611,8 @@
"type": "object",
"properties": {
"success": {
"type": "boolean"
"type": "boolean",
"description": "Whether the request was successful."
},
"data": {
"type": "object",
@@ -3498,7 +3621,8 @@
"type": "array",
"items": {
"$ref": "#/components/schemas/SearchResult"
}
},
"description": "Array of search result objects ranked by similarity."
},
"query": {
"type": "string",
@@ -3519,7 +3643,8 @@
"type": "integer",
"description": "Number of results returned."
}
}
},
"description": "Response payload containing the search results and metadata."
}
}
}
@@ -3610,7 +3735,8 @@
"type": "array",
"items": {
"$ref": "#/components/schemas/ColumnDefinition"
}
},
"description": "Array of column definitions for the table."
}
}
},
@@ -4749,11 +4875,28 @@
"description": "Comparison operator (e.g. eq, neq, gt, lt, gte, lte, contains, between)."
},
"value": {
"oneOf": [{ "type": "string" }, { "type": "number" }, { "type": "boolean" }],
"oneOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
],
"description": "Value to filter by."
},
"valueTo": {
"oneOf": [{ "type": "string" }, { "type": "number" }],
"oneOf": [
{
"type": "string"
},
{
"type": "number"
}
],
"description": "Upper bound value for 'between' operator."
}
}