{"openapi":"3.0.0","info":{"title":"Honen Connector API","version":"1.0.0","description":"Workspace Connector HTTP API. Every command is POST /api/v1/{domain}/{action} with a JSON body, authenticated with a Connector Bearer token and authorized by the Connector's policy. Mutating commands accept Idempotency-Key so network retries cannot duplicate writes. Versioning and deprecation policy: /api/v1 is stable; breaking changes use a new major version. Deprecated operations are marked in OpenAPI and documented with migration steps; scheduled retirement is announced with Sunset. See https://honen.com/developers/the-http-api-api-v1-conventions.md and https://honen.com/developers/llms.txt."},"servers":[{"url":"https://honen.com"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"A Connector secret or child token (Authorization: Bearer hn_…)."}},"schemas":{"ErrorResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"resolution":{"type":"string"},"errors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}},"details":{"nullable":true}},"required":["code","message","resolution"]}},"required":["success","error"]}},"parameters":{}},"paths":{"/api/v1/analytics/monthly-overview":{"post":{"operationId":"analytics_monthly-overview","summary":"Monthly active creators, course types, creation starts/first publications, and learner start/completion MAU and totals.","description":"Matches the main Analytics page. Omit month for the current calendar month to date in America/New_York. Creator completions mean first publication; learner completions use recorded completion dates. Unique people are counted once per metric within each month. Requires workspace VIEW_ANALYTICS.","tags":["analytics"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"month":{"type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])$","description":"Reporting month in YYYY-MM format, from January 2000 through the current month. Defaults to the current month."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"month":{"type":"string"},"currentMonth":{"type":"string"},"timezone":{"type":"string"},"creation":{"type":"object","properties":{"activeCreators":{"type":"number"},"coursesStarted":{"type":"number"},"coursesCompleted":{"type":"number"},"courseTypes":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["COURSE","ASSESSMENT","ATOM"]},"started":{"type":"number"},"completed":{"type":"number"}},"required":["type","started","completed"]}}},"required":["activeCreators","coursesStarted","coursesCompleted","courseTypes"]},"learning":{"type":"object","properties":{"startingLearners":{"type":"number"},"completingLearners":{"type":"number"},"coursesStarted":{"type":"number"},"coursesCompleted":{"type":"number"}},"required":["startingLearners","completingLearners","coursesStarted","coursesCompleted"]}},"required":["month","currentMonth","timezone","creation","learning"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/analytics/hero":{"post":{"operationId":"analytics_hero","summary":"Workspace top-line counts (students, courses, completions).","description":"Workspace top-line counts (students, courses, completions).","tags":["analytics"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"scopeType":{"type":"string","enum":["WORKSPACE"]},"totalStudents":{"type":"number"},"totalInstructors":{"type":"number"},"totalAdmins":{"type":"number"},"totalCourses":{"type":"number"},"courseCompletions":{"type":"number"},"pendingInvites":{"type":"number"},"avgTimeToCompleteSeconds":{"type":"number","nullable":true}},"required":["scopeType","totalStudents","totalInstructors","totalAdmins","totalCourses","courseCompletions","pendingInvites","avgTimeToCompleteSeconds"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/analytics/courses":{"post":{"operationId":"analytics_courses","summary":"Per-course performance rows for the workspace.","description":"Per-course performance rows for the workspace.","tags":["analytics"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"integer","minimum":0,"exclusiveMinimum":true}}}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"courses":{"type":"array","items":{"type":"object","properties":{"courseId":{"type":"string"},"title":{"type":"string"},"enrolled":{"type":"number"},"completed":{"type":"number"},"completionPercent":{"type":"number"}},"required":["courseId","title","enrolled","completed","completionPercent"]}}},"required":["courses"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/analytics/students":{"post":{"operationId":"analytics_students","summary":"Student roster with assigned vs completed counts.","description":"Student roster with assigned vs completed counts.","tags":["analytics"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"integer","minimum":0,"exclusiveMinimum":true}}}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"students":{"type":"array","items":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"avatarUrl":{"type":"string","nullable":true}},"required":["id","name","email","avatarUrl"]},"joinedAt":{"type":"string"},"coursesAssigned":{"type":"number"},"coursesCompleted":{"type":"number"},"groups":{"type":"array","items":{"type":"string"}}},"required":["user","joinedAt","coursesAssigned","coursesCompleted","groups"]}}},"required":["students"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/analytics/needs-attention":{"post":{"operationId":"analytics_needs-attention","summary":"Students with assigned coursework but zero completions.","description":"Students with assigned coursework but zero completions.","tags":["analytics"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"integer","minimum":0,"exclusiveMinimum":true}}}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"students":{"type":"array","items":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"avatarUrl":{"type":"string","nullable":true}},"required":["id","name","email","avatarUrl"]},"joinedAt":{"type":"string"},"coursesAssigned":{"type":"number"},"coursesCompleted":{"type":"number"},"groups":{"type":"array","items":{"type":"string"}}},"required":["user","joinedAt","coursesAssigned","coursesCompleted","groups"]}}},"required":["students"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/analytics/top-performers":{"post":{"operationId":"analytics_top-performers","summary":"Students ranked by completion ratio.","description":"Students ranked by completion ratio.","tags":["analytics"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"integer","minimum":0,"exclusiveMinimum":true}}}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"students":{"type":"array","items":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"avatarUrl":{"type":"string","nullable":true}},"required":["id","name","email","avatarUrl"]},"joinedAt":{"type":"string"},"coursesAssigned":{"type":"number"},"coursesCompleted":{"type":"number"},"groups":{"type":"array","items":{"type":"string"}}},"required":["user","joinedAt","coursesAssigned","coursesCompleted","groups"]}}},"required":["students"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/performance/student":{"post":{"operationId":"performance_student","summary":"One student's quiz/test scores and activity completion.","description":"One student's quiz/test scores and activity completion.","tags":["performance"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"courseId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["userId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"}},"required":["id","name","email"]},"courses":{"type":"array","items":{"type":"object","properties":{"courseId":{"type":"string"},"courseTitle":{"type":"string"},"startedAt":{"type":"string","nullable":true},"completedAt":{"type":"string","nullable":true},"lastActiveAt":{"type":"string","nullable":true},"quizCount":{"type":"number"},"avgQuizPercent":{"type":"number","nullable":true},"testCount":{"type":"number"},"avgTestPercent":{"type":"number","nullable":true}},"required":["courseId","courseTitle","startedAt","completedAt","lastActiveAt","quizCount","avgQuizPercent","testCount","avgTestPercent"]}},"quizScores":{"type":"array","items":{"type":"object","properties":{"activityId":{"type":"string"},"topicId":{"type":"string"},"topicTitle":{"type":"string"},"unitId":{"type":"string"},"unitTitle":{"type":"string"},"score":{"type":"number"},"totalQuestions":{"type":"number"},"percent":{"type":"number"},"elapsedSeconds":{"type":"number"},"isCompleted":{"type":"boolean","enum":[false,true]},"updatedAt":{"type":"string"}},"required":["activityId","topicId","topicTitle","unitId","unitTitle","score","totalQuestions","percent","elapsedSeconds","isCompleted","updatedAt"]}},"testScores":{"type":"array","items":{"type":"object","properties":{"testId":{"type":"string"},"testTitle":{"type":"string"},"unitId":{"type":"string"},"unitTitle":{"type":"string"},"score":{"type":"number"},"totalGradeable":{"type":"number"},"percent":{"type":"number"},"elapsedSeconds":{"type":"number"},"isCompleted":{"type":"boolean","enum":[false,true]},"updatedAt":{"type":"string"}},"required":["testId","testTitle","unitId","unitTitle","score","totalGradeable","percent","elapsedSeconds","isCompleted","updatedAt"]}},"activityCompletion":{"type":"object","properties":{"READ":{"type":"object","properties":{"attempted":{"type":"number"},"completed":{"type":"number"}},"required":["attempted","completed"]},"FLASHCARDS":{"type":"object","properties":{"attempted":{"type":"number"},"completed":{"type":"number"}},"required":["attempted","completed"]},"QUIZ":{"type":"object","properties":{"attempted":{"type":"number"},"completed":{"type":"number"}},"required":["attempted","completed"]},"LECTURE":{"type":"object","properties":{"attempted":{"type":"number"},"completed":{"type":"number"}},"required":["attempted","completed"]},"PODCAST":{"type":"object","properties":{"attempted":{"type":"number"},"completed":{"type":"number"}},"required":["attempted","completed"]},"JAM_SESSION":{"type":"object","properties":{"attempted":{"type":"number"},"completed":{"type":"number"}},"required":["attempted","completed"]},"COMIC":{"type":"object","properties":{"attempted":{"type":"number"},"completed":{"type":"number"}},"required":["attempted","completed"]},"GAME":{"type":"object","properties":{"attempted":{"type":"number"},"completed":{"type":"number"}},"required":["attempted","completed"]},"CHAT":{"type":"object","properties":{"attempted":{"type":"number"},"completed":{"type":"number"}},"required":["attempted","completed"]},"VIDEO":{"type":"object","properties":{"attempted":{"type":"number"},"completed":{"type":"number"}},"required":["attempted","completed"]}},"required":["READ","FLASHCARDS","QUIZ","LECTURE","PODCAST","JAM_SESSION","COMIC","GAME","CHAT","VIDEO"]}},"required":["user","courses","quizScores","testScores","activityCompletion"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/performance/course":{"post":{"operationId":"performance_course","summary":"Class-wide rollup for a course.","description":"Class-wide rollup for a course.","tags":["performance"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"courseId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["courseId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"course":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"}},"required":["id","title"]},"enrolled":{"type":"number"},"completed":{"type":"number"},"completionPercent":{"type":"number"},"avgQuizPercent":{"type":"number","nullable":true},"avgTestPercent":{"type":"number","nullable":true},"units":{"type":"array","items":{"type":"object","properties":{"unitId":{"type":"string"},"unitTitle":{"type":"string"},"totalActivities":{"type":"number"},"attemptedActivities":{"type":"number"},"completedActivities":{"type":"number"},"percentAttempted":{"type":"number"},"percentCompleted":{"type":"number"},"unitTestScore":{"type":"object","properties":{"score":{"type":"number"},"total":{"type":"number"},"percent":{"type":"number"}},"required":["score","total","percent"],"nullable":true}},"required":["unitId","unitTitle","totalActivities","attemptedActivities","completedActivities","percentAttempted","percentCompleted","unitTestScore"]}},"perQuizActivity":{"type":"array","items":{"type":"object","properties":{"activityId":{"type":"string"},"topicId":{"type":"string"},"topicTitle":{"type":"string"},"unitId":{"type":"string"},"attempts":{"type":"number"},"completedAttempts":{"type":"number"},"avgScore":{"type":"number","nullable":true},"avgPercent":{"type":"number","nullable":true}},"required":["activityId","topicId","topicTitle","unitId","attempts","completedAttempts","avgScore","avgPercent"]}},"perUnitTest":{"type":"array","items":{"type":"object","properties":{"testId":{"type":"string"},"unitId":{"type":"string"},"unitTitle":{"type":"string"},"attempts":{"type":"number"},"completedAttempts":{"type":"number"},"avgScore":{"type":"number","nullable":true},"avgPercent":{"type":"number","nullable":true}},"required":["testId","unitId","unitTitle","attempts","completedAttempts","avgScore","avgPercent"]}}},"required":["course","enrolled","completed","completionPercent","avgQuizPercent","avgTestPercent","units","perQuizActivity","perUnitTest"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/performance/test":{"post":{"operationId":"performance_test","summary":"Score distribution for one unit test.","description":"Score distribution for one unit test.","tags":["performance"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"testId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["testId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"test":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"unitId":{"type":"string"},"courseId":{"type":"string"}},"required":["id","title","unitId","courseId"]},"attempts":{"type":"array","items":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"}},"required":["id","name","email"]},"score":{"type":"number","nullable":true},"totalGradeable":{"type":"number","nullable":true},"percent":{"type":"number","nullable":true},"elapsedSeconds":{"type":"number"},"isCompleted":{"type":"boolean","enum":[false,true]},"updatedAt":{"type":"string"}},"required":["user","score","totalGradeable","percent","elapsedSeconds","isCompleted","updatedAt"]}},"completedAttempts":{"type":"number"},"avgScore":{"type":"number","nullable":true},"avgPercent":{"type":"number","nullable":true},"distribution":{"type":"object","properties":{"0-24":{"type":"number"},"25-49":{"type":"number"},"50-74":{"type":"number"},"75-100":{"type":"number"}},"required":["0-24","25-49","50-74","75-100"]}},"required":["test","attempts","completedAttempts","avgScore","avgPercent","distribution"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/performance/quiz":{"post":{"operationId":"performance_quiz","summary":"Score distribution for one quiz activity.","description":"Score distribution for one quiz activity.","tags":["performance"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"activityId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["activityId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"activity":{"type":"object","properties":{"id":{"type":"string"},"topicId":{"type":"string"},"topicTitle":{"type":"string"},"unitId":{"type":"string"},"unitTitle":{"type":"string"},"courseId":{"type":"string"}},"required":["id","topicId","topicTitle","unitId","unitTitle","courseId"]},"attempts":{"type":"array","items":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"}},"required":["id","name","email"]},"score":{"type":"number","nullable":true},"totalQuestions":{"type":"number","nullable":true},"percent":{"type":"number","nullable":true},"elapsedSeconds":{"type":"number"},"isCompleted":{"type":"boolean","enum":[false,true]},"updatedAt":{"type":"string"}},"required":["user","score","totalQuestions","percent","elapsedSeconds","isCompleted","updatedAt"]}},"completedAttempts":{"type":"number"},"avgScore":{"type":"number","nullable":true},"avgPercent":{"type":"number","nullable":true},"distribution":{"type":"object","properties":{"0-24":{"type":"number"},"25-49":{"type":"number"},"50-74":{"type":"number"},"75-100":{"type":"number"}},"required":["0-24","25-49","50-74","75-100"]}},"required":["activity","attempts","completedAttempts","avgScore","avgPercent","distribution"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/learning/course-units":{"post":{"operationId":"learning_course-units","summary":"Per-unit completion %, avg test score, avg time-on-task.","description":"Per-unit completion %, avg test score, avg time-on-task.","tags":["learning"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"courseId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"groupId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["courseId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"courseId":{"type":"string"},"totalMembers":{"type":"number"},"units":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"orderIndex":{"type":"number"},"topicCount":{"type":"number"},"projectCount":{"type":"number"},"projectCompletion":{"type":"number","nullable":true},"avgScore":{"type":"number","nullable":true},"minScore":{"type":"number","nullable":true},"maxScore":{"type":"number","nullable":true},"completion":{"type":"number"},"avgTimeSeconds":{"type":"number","nullable":true}},"required":["id","title","orderIndex","topicCount","projectCount","projectCompletion","avgScore","minScore","maxScore","completion","avgTimeSeconds"]}}},"required":["courseId","totalMembers","units"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/learning/unit-topics":{"post":{"operationId":"learning_unit-topics","summary":"Per-topic completion %, avg quiz score, avg time-on-task.","description":"Per-topic completion %, avg quiz score, avg time-on-task.","tags":["learning"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"unitId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"groupId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["unitId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"unitId":{"type":"string"},"courseId":{"type":"string"},"totalMembers":{"type":"number"},"topics":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"orderIndex":{"type":"number"},"avgScore":{"type":"number","nullable":true},"minScore":{"type":"number","nullable":true},"maxScore":{"type":"number","nullable":true},"completion":{"type":"number"},"avgTimeSeconds":{"type":"number","nullable":true}},"required":["id","title","orderIndex","avgScore","minScore","maxScore","completion","avgTimeSeconds"]}},"projects":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"type":{"type":"string"},"completion":{"type":"number","nullable":true},"requiredMembers":{"type":"number"},"totalMembers":{"type":"number"}},"required":["id","title","type","completion","requiredMembers","totalMembers"]}}},"required":["unitId","courseId","totalMembers","topics","projects"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/learning/struggling-topics":{"post":{"operationId":"learning_struggling-topics","summary":"Ranked hardest topics (low completion + low scores).","description":"Ranked hardest topics (low completion + low scores).","tags":["learning"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"courseId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"groupId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"limit":{"type":"integer","minimum":0,"exclusiveMinimum":true}},"required":["courseId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"courseId":{"type":"string"},"totalMembers":{"type":"number"},"topics":{"type":"array","items":{"type":"object","properties":{"unitId":{"type":"string"},"unitTitle":{"type":"string"},"topicId":{"type":"string"},"topicTitle":{"type":"string"},"completion":{"type":"number"},"avgScore":{"type":"number","nullable":true},"avgTimeSeconds":{"type":"number","nullable":true},"struggleScore":{"type":"number"}},"required":["unitId","unitTitle","topicId","topicTitle","completion","avgScore","avgTimeSeconds","struggleScore"]}}},"required":["courseId","totalMembers","topics"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/learning/question-stats":{"post":{"operationId":"learning_question-stats","summary":"Cohort wrong-answer rates per question (worst-first).","description":"Cohort wrong-answer rates per question (worst-first).","tags":["learning"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["test","quiz"]},"refId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"groupId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["kind","refId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"kind":{"type":"string","enum":["test","quiz"]},"refId":{"type":"string"},"title":{"type":"string"},"courseId":{"type":"string"},"unitId":{"type":"string"},"topicId":{"type":"string","nullable":true},"totalMembers":{"type":"number"},"completedAttempts":{"type":"number"},"avgElapsedSeconds":{"type":"number","nullable":true},"avgScorePercent":{"type":"number","nullable":true},"questions":{"type":"array","items":{"type":"object","properties":{"questionId":{"type":"string"},"order":{"type":"number"},"type":{"type":"string"},"question":{"type":"string"},"answeredCount":{"type":"number"},"correctCount":{"type":"number"},"wrongCount":{"type":"number"},"wrongRatePercent":{"type":"number","nullable":true},"topWrongAnswer":{"type":"string","nullable":true},"topWrongAnswerCount":{"type":"number"}},"required":["questionId","order","type","question","answeredCount","correctCount","wrongCount","wrongRatePercent","topWrongAnswer","topWrongAnswerCount"]}}},"required":["kind","refId","title","courseId","unitId","topicId","totalMembers","completedAttempts","avgElapsedSeconds","avgScorePercent","questions"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/learning/student-units":{"post":{"operationId":"learning_student-units","summary":"One learner's unit/topic/activity breakdown + times vs team avg.","description":"One learner's unit/topic/activity breakdown + times vs team avg.","tags":["learning"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"courseId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"groupId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["userId","courseId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"userId":{"type":"string"},"courseId":{"type":"string"},"overallProgress":{"type":"number"},"overallScore":{"type":"number","nullable":true},"overallStatus":{"type":"string","enum":["complete","active","not-started"]},"unitsCompleted":{"type":"number"},"totalUnits":{"type":"number"},"criteriaLabel":{"type":"string","nullable":true},"modules":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"progress":{"type":"number"},"quizScore":{"type":"number","nullable":true},"teamAvg":{"type":"number","nullable":true},"status":{"type":"string","enum":["complete","active","not-started"]},"timeSeconds":{"type":"number","nullable":true},"unitComplete":{"type":"boolean","enum":[false,true]},"topics":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"completedCount":{"type":"number"},"requiredCount":{"type":"number"},"totalActivities":{"type":"number"},"completed":{"type":"boolean","enum":[false,true]},"timeSeconds":{"type":"number","nullable":true},"activities":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"type":{"type":"string"},"completed":{"type":"boolean","enum":[false,true]},"timeSeconds":{"type":"number","nullable":true}},"required":["id","title","type","completed","timeSeconds"]}}},"required":["id","title","completedCount","requiredCount","totalActivities","completed","timeSeconds","activities"]}},"test":{"type":"object","properties":{"id":{"type":"string"},"required":{"type":"boolean","enum":[false,true]},"taken":{"type":"boolean","enum":[false,true]},"scorePercent":{"type":"number","nullable":true},"minScore":{"type":"number","nullable":true},"satisfied":{"type":"boolean","enum":[false,true]}},"required":["id","required","taken","scorePercent","minScore","satisfied"],"nullable":true},"projects":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"required":{"type":"boolean","enum":[false,true]},"completed":{"type":"boolean","enum":[false,true]},"satisfied":{"type":"boolean","enum":[false,true]}},"required":["id","title","required","completed","satisfied"]}}},"required":["id","title","progress","quizScore","teamAvg","status","timeSeconds","unitComplete","topics","test","projects"]}}},"required":["userId","courseId","overallProgress","overallScore","overallStatus","unitsCompleted","totalUnits","criteriaLabel","modules"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/learning/course-detail":{"post":{"operationId":"learning_course-detail","summary":"All assigned members with progress %, scores, status.","description":"All assigned members with progress %, scores, status.","tags":["learning"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"courseId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"groupId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["courseId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"courseId":{"type":"string"},"enrolled":{"type":"number"},"completed":{"type":"number"},"avgScore":{"type":"number","nullable":true},"members":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"progressPercent":{"type":"number"},"avgScore":{"type":"number","nullable":true},"minScore":{"type":"number","nullable":true},"maxScore":{"type":"number","nullable":true},"status":{"type":"string","enum":["complete","active","not-started"]},"completedAt":{"type":"string","nullable":true}},"required":["id","name","email","progressPercent","avgScore","minScore","maxScore","status","completedAt"]}}},"required":["courseId","enrolled","completed","avgScore","members"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/learning/completions":{"post":{"operationId":"learning_completions","summary":"Paginated course completion events.","description":"Paginated course completions. Send page (default 1) and limit (default 25) in the JSON body. Increment page until pagination.page reaches pagination.totalPages. Filters and authorization apply to every page.","tags":["learning"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"courseId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"userId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"groupId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"page":{"type":"integer","minimum":0,"exclusiveMinimum":true},"limit":{"type":"integer","minimum":0,"exclusiveMinimum":true}}}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"completions":{"type":"array","items":{"type":"object","properties":{"userId":{"type":"string"},"userName":{"type":"string","nullable":true},"userEmail":{"type":"string"},"courseId":{"type":"string"},"courseTitle":{"type":"string"},"completedAt":{"type":"string"},"avgScore":{"type":"number","nullable":true}},"required":["userId","userName","userEmail","courseId","courseTitle","completedAt","avgScore"]}},"pagination":{"type":"object","properties":{"page":{"type":"integer"},"limit":{"type":"integer"},"total":{"type":"integer"},"totalPages":{"type":"integer"}},"required":["page","limit","total","totalPages"]}},"required":["completions","pagination"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/learning/assignment-cohort":{"post":{"operationId":"learning_assignment-cohort","summary":"Assignment assignees: completion %, weak units, struggling topics.","description":"Assignment assignees: completion %, weak units, struggling topics.","tags":["learning"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"assignmentId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["assignmentId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"assignmentId":{"type":"string"},"courseId":{"type":"string"},"courseTitle":{"type":"string"},"assigneeCount":{"type":"number"},"completedCount":{"type":"number"},"completionPercent":{"type":"number"},"avgScore":{"type":"number","nullable":true},"strugglingTopics":{"type":"array","items":{"type":"object","properties":{"unitId":{"type":"string"},"unitTitle":{"type":"string"},"topicId":{"type":"string"},"topicTitle":{"type":"string"},"completion":{"type":"number"},"avgScore":{"type":"number","nullable":true},"avgTimeSeconds":{"type":"number","nullable":true},"struggleScore":{"type":"number"}},"required":["unitId","unitTitle","topicId","topicTitle","completion","avgScore","avgTimeSeconds","struggleScore"]}},"weakUnits":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"orderIndex":{"type":"number"},"topicCount":{"type":"number"},"projectCount":{"type":"number"},"projectCompletion":{"type":"number","nullable":true},"avgScore":{"type":"number","nullable":true},"minScore":{"type":"number","nullable":true},"maxScore":{"type":"number","nullable":true},"completion":{"type":"number"},"avgTimeSeconds":{"type":"number","nullable":true}},"required":["id","title","orderIndex","topicCount","projectCount","projectCompletion","avgScore","minScore","maxScore","completion","avgTimeSeconds"]}}},"required":["assignmentId","courseId","courseTitle","assigneeCount","completedCount","completionPercent","avgScore","strugglingTopics","weakUnits"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/learning/learning-modes":{"post":{"operationId":"learning_learning-modes","summary":"Which modalities learners used (% of cohort).","description":"Which modalities learners used (% of cohort).","tags":["learning"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"courseId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"userId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"groupId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}}}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"totalMembers":{"type":"number"},"modalities":{"type":"array","items":{"type":"object","properties":{"percent":{"type":"number"},"id":{"type":"string"},"name":{"type":"string"},"users":{"type":"number"}},"required":["percent","id","name","users"]}},"singleUser":{"type":"boolean","enum":[false,true]}},"required":["totalMembers","modalities","singleUser"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/learning/learning-modes-time":{"post":{"operationId":"learning_learning-modes-time","summary":"Time spent per modality.","description":"Time spent per modality.","tags":["learning"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"courseId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"userId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"groupId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}}}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"singleUser":{"type":"boolean","enum":[false,true]},"totalMembers":{"type":"number"},"totalSeconds":{"type":"number"},"modalities":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"totalSeconds":{"type":"number"},"avgSecondsPerMember":{"type":"number"},"percent":{"type":"number"}},"required":["id","name","totalSeconds","avgSecondsPerMember","percent"]}}},"required":["totalMembers","totalSeconds","modalities"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/learning/completion-time":{"post":{"operationId":"learning_completion-time","summary":"Fastest/slowest learners by avg tracked time-to-complete.","description":"Fastest/slowest learners by avg tracked time-to-complete.","tags":["learning"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"groupId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"search":{"type":"string"}}}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"members":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"avatarUrl":{"type":"string","nullable":true},"completionsCount":{"type":"number"},"trackedCount":{"type":"number"},"avgSeconds":{"type":"number","nullable":true},"fastestSeconds":{"type":"number","nullable":true}},"required":["id","name","email","avatarUrl","completionsCount","trackedCount","avgSeconds","fastestSeconds"]}},"totalMembers":{"type":"number"},"scoredMembers":{"type":"number"}},"required":["members","totalMembers","scoredMembers"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/learning/training-activity":{"post":{"operationId":"learning_training-activity","summary":"Daily active learners for the last 7 days.","description":"Daily active learners for the last 7 days.","tags":["learning"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"groupId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}}}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"activeCount":{"type":"number"}},"required":["date","activeCount"]}}},"required":["data"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/learning/student-questions":{"post":{"operationId":"learning_student-questions","summary":"One learner's per-question answers (office-hours drill-down).","description":"One learner's per-question answers (office-hours drill-down).","tags":["learning"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"kind":{"type":"string","enum":["test","quiz"]},"refId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"attemptId":{"type":"string"}},"required":["userId","kind","refId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"kind":{"type":"string","enum":["test","quiz"]},"title":{"type":"string"},"isCompleted":{"type":"boolean","enum":[false,true]},"score":{"type":"number"},"totalGradeable":{"type":"number"},"scorePercent":{"type":"number","nullable":true},"elapsedSeconds":{"type":"number"},"questions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"order":{"type":"number"},"type":{"type":"string"},"question":{"type":"string"},"explanation":{"type":"string","nullable":true},"options":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"text":{"type":"string"},"isCorrect":{"type":"boolean","enum":[false,true]},"isSelected":{"type":"boolean","enum":[false,true]}},"required":["label","text","isCorrect","isSelected"]},"nullable":true},"studentAnswerText":{"type":"string","nullable":true},"correctAnswerText":{"type":"string","nullable":true},"isCorrect":{"type":"boolean","enum":[false,true],"nullable":true},"answered":{"type":"boolean","enum":[false,true]}},"required":["id","order","type","question","explanation","options","studentAnswerText","correctAnswerText","isCorrect","answered"]}},"attempts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"attemptNumber":{"type":"number"},"score":{"type":"number","nullable":true},"totalGradeable":{"type":"number"},"scorePercent":{"type":"number","nullable":true},"elapsedSeconds":{"type":"number"},"submittedAt":{"type":"string"}},"required":["id","attemptNumber","score","totalGradeable","scorePercent","elapsedSeconds","submittedAt"]}},"selectedAttemptId":{"type":"string","nullable":true}},"required":["kind","title","isCompleted","score","totalGradeable","scorePercent","elapsedSeconds","questions","attempts","selectedAttemptId"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/learning/course-at-risk":{"post":{"operationId":"learning_course-at-risk","summary":"Who hasn't started, is behind, or has low test scores.","description":"Who hasn't started, is behind, or has low test scores.","tags":["learning"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"courseId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"groupId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"behindBelow":{"type":"integer"},"scoreBelow":{"type":"integer"}},"required":["courseId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"courseId":{"type":"string"},"enrolled":{"type":"number"},"completed":{"type":"number"},"classAvgScore":{"type":"number","nullable":true},"thresholds":{"type":"object","properties":{"behindBelow":{"type":"number"},"scoreBelow":{"type":"number"}},"required":["behindBelow","scoreBelow"]},"summary":{"type":"object","properties":{"notStarted":{"type":"number"},"behind":{"type":"number"},"lowScore":{"type":"number"},"needsHelp":{"type":"number"}},"required":["notStarted","behind","lowScore","needsHelp"]},"notStarted":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"progressPercent":{"type":"number"},"avgScore":{"type":"number","nullable":true},"minScore":{"type":"number","nullable":true},"maxScore":{"type":"number","nullable":true},"status":{"type":"string","enum":["complete","active","not-started"]},"completedAt":{"type":"string","nullable":true}},"required":["id","name","email","progressPercent","avgScore","minScore","maxScore","status","completedAt"]}},"behind":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"progressPercent":{"type":"number"},"avgScore":{"type":"number","nullable":true},"minScore":{"type":"number","nullable":true},"maxScore":{"type":"number","nullable":true},"status":{"type":"string","enum":["complete","active","not-started"]},"completedAt":{"type":"string","nullable":true}},"required":["id","name","email","progressPercent","avgScore","minScore","maxScore","status","completedAt"]}},"lowScore":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"progressPercent":{"type":"number"},"avgScore":{"type":"number","nullable":true},"minScore":{"type":"number","nullable":true},"maxScore":{"type":"number","nullable":true},"status":{"type":"string","enum":["complete","active","not-started"]},"completedAt":{"type":"string","nullable":true}},"required":["id","name","email","progressPercent","avgScore","minScore","maxScore","status","completedAt"]}}},"required":["courseId","enrolled","completed","classAvgScore","thresholds","summary","notStarted","behind","lowScore"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/learning/overdue-assignments":{"post":{"operationId":"learning_overdue-assignments","summary":"All incomplete assignments past due date in scope.","description":"All incomplete assignments past due date in scope.","tags":["learning"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"courseId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"groupId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}}}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"overdueCount":{"type":"number"},"rows":{"type":"array","items":{"type":"object","properties":{"userId":{"type":"string"},"userName":{"type":"string"},"userEmail":{"type":"string"},"assignmentId":{"type":"string"},"assignmentName":{"type":"string","nullable":true},"courseId":{"type":"string"},"courseTitle":{"type":"string"},"dueDate":{"type":"string","nullable":true},"daysOverdue":{"type":"number","nullable":true}},"required":["userId","userName","userEmail","assignmentId","assignmentName","courseId","courseTitle","dueDate","daysOverdue"]}}},"required":["overdueCount","rows"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/learning/project-scenarios":{"post":{"operationId":"learning_project-scenarios","summary":"Role-play / scenario completion, attempts, avg best score.","description":"Role-play / scenario completion, attempts, avg best score.","tags":["learning"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"courseId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"unitId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"groupId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["courseId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"courseId":{"type":"string"},"totalMembers":{"type":"number"},"projects":{"type":"array","items":{"type":"object","properties":{"projectId":{"type":"string"},"title":{"type":"string"},"type":{"type":"string"},"unitId":{"type":"string"},"unitTitle":{"type":"string"},"startedPercent":{"type":"number"},"completionPercent":{"type":"number"},"avgAttempts":{"type":"number","nullable":true},"avgBestScorePercent":{"type":"number","nullable":true},"startedCount":{"type":"number"},"completedCount":{"type":"number"}},"required":["projectId","title","type","unitId","unitTitle","startedPercent","completionPercent","avgAttempts","avgBestScorePercent","startedCount","completedCount"]}}},"required":["courseId","totalMembers","projects"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/learning/scenario-attempts":{"post":{"operationId":"learning_scenario-attempts","summary":"One learner's scenario attempt: evaluation + transcript.","description":"One learner's scenario attempt: evaluation + transcript.","tags":["learning"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"projectId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"attemptId":{"type":"string"}},"required":["userId","projectId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"projectTitle":{"type":"string"},"kind":{"type":"string"},"attempts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"attemptNumber":{"type":"number"},"score":{"type":"number"},"maxScore":{"type":"number"},"submittedAt":{"type":"string","nullable":true}},"required":["id","attemptNumber","score","maxScore","submittedAt"]}},"selected":{"type":"object","properties":{"id":{"type":"string"},"attemptNumber":{"type":"number"},"score":{"type":"number"},"maxScore":{"type":"number"},"submittedAt":{"type":"string","nullable":true},"evaluation":{"type":"object","additionalProperties":{"description":"Arbitrary JSON value."},"nullable":true},"transcript":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["user","character"]},"content":{"type":"string"},"characterName":{"type":"string","nullable":true},"timestamp":{"type":"number","nullable":true}},"required":["role","content"]},"nullable":true},"recordingUrl":{"type":"string","nullable":true},"recordingPending":{"type":"boolean","enum":[false,true]}},"required":["id","attemptNumber","score","maxScore","submittedAt","evaluation","transcript","recordingUrl","recordingPending"],"nullable":true}},"required":["projectTitle","kind","attempts","selected"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/learning/project-results":{"post":{"operationId":"learning_project-results","summary":"One learner's graded project: rubric grade + submission (form field responses, etc.).","description":"One learner's graded project: rubric grade + submission (form field responses, etc.).","tags":["learning"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"projectId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"attemptId":{"type":"string"}},"required":["userId","projectId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"projectTitle":{"type":"string"},"projectType":{"type":"string"},"attempts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"attemptNumber":{"type":"number"},"score":{"type":"number"},"maxScore":{"type":"number"},"submittedAt":{"type":"string","nullable":true}},"required":["id","attemptNumber","score","maxScore","submittedAt"]}},"selected":{"type":"object","properties":{"id":{"type":"string"},"attemptNumber":{"type":"number"},"score":{"type":"number"},"maxScore":{"type":"number"},"submittedAt":{"type":"string","nullable":true},"overallFeedback":{"type":"string","nullable":true},"criteria":{"type":"array","items":{"type":"object","properties":{"criterion":{"type":"string"},"score":{"type":"number"},"maxScore":{"type":"number"},"feedback":{"type":"string"}},"required":["criterion","score","maxScore","feedback"]}},"form":{"type":"object","properties":{"config":{"description":"Arbitrary JSON value."},"submission":{"type":"object","additionalProperties":{"description":"Arbitrary JSON value."}}},"required":["config","submission"],"nullable":true},"submission":{"description":"Arbitrary JSON value."}},"required":["id","attemptNumber","score","maxScore","submittedAt","overallFeedback","criteria","form","submission"],"nullable":true}},"required":["projectTitle","projectType","attempts","selected"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/learning/creator-review":{"post":{"operationId":"learning_creator-review","summary":"One creator's video-review submission + the Creator Team's feedback thread + acknowledgment status.","description":"One creator's video-review submission + the Creator Team's feedback thread + acknowledgment status.","tags":["learning"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"projectId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["userId","projectId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"submission":{"type":"object","additionalProperties":{"description":"Arbitrary JSON value."},"nullable":true},"submittedAt":{"type":"string","nullable":true},"feedback":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"adminName":{"type":"string"},"commentText":{"type":"string"},"createdAt":{"type":"string"}},"required":["id","adminName","commentText","createdAt"]}},"acknowledgedAt":{"type":"string","nullable":true}},"required":["submission","submittedAt","feedback","acknowledgedAt"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/courses/list":{"post":{"operationId":"courses_list","summary":"List courses visible to this Connector (owner/editor/admin).","description":"Returns all non-draft courses visible to the Connector creator, narrowed by courses.allowedCourseIds when set. Leave that allowlist empty to include current and future accessible courses. Integrations must call this endpoint again to discover newly added courses.","tags":["courses"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"courses":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"isPublished":{"type":"boolean","enum":[false,true]},"visibility":{"type":"string","enum":["public","private"]},"isOwned":{"type":"boolean","enum":[false,true]},"canEdit":{"type":"boolean","enum":[false,true]},"canManageEditors":{"type":"boolean","enum":[false,true]},"role":{"type":"string","enum":["owner","editor","workspace-admin"]},"editUrl":{"type":"string","nullable":true},"visibilityNote":{"type":"string","nullable":true},"updatedAt":{"type":"string"},"createdBy":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"peopleUrl":{"type":"string"}},"required":["id","name","email","peopleUrl"]}},"required":["id","title","description","isPublished","visibility","isOwned","canEdit","role","editUrl","visibilityNote","updatedAt","createdBy"]}},"totalCount":{"type":"number"}},"required":["courses","totalCount"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/courses/structure":{"post":{"operationId":"courses_structure","summary":"Course skills and unit/topic structure.","description":"Includes skills from the course landing page's Skills you'll learn section as an ordered array of id, title, description, and orderIndex. Returns skills: [] when no skills are configured.","tags":["courses"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"courseId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["courseId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"courseId":{"type":"string"},"courseTitle":{"type":"string"},"skills":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"orderIndex":{"type":"number"}},"required":["id","title","description","orderIndex"]}},"canEdit":{"type":"boolean","enum":[false,true]},"readOnlyNote":{"type":"string","nullable":true},"unitCount":{"type":"number"},"topicCount":{"type":"number"},"projectCount":{"type":"number"},"unitTestCount":{"type":"number"},"units":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"orderIndex":{"type":"number"},"contentOrder":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"id":{"type":"string"}},"required":["type","id"]}},"topics":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"orderIndex":{"type":"number"},"learningGoalCount":{"type":"number"},"activityTypes":{"type":"array","items":{"type":"string"}},"editUrl":{"type":"string","nullable":true}},"required":["id","title","description","orderIndex","learningGoalCount","activityTypes","editUrl"]}},"projects":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"type":{"type":"string"},"orderIndex":{"type":"number"},"editUrl":{"type":"string","nullable":true}},"required":["id","title","type","orderIndex","editUrl"]}},"test":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"questionCount":{"type":"number"},"editUrl":{"type":"string","nullable":true}},"required":["id","title","questionCount","editUrl"],"nullable":true}},"required":["id","title","description","orderIndex","topics","projects","test"]}}},"required":["courseId","courseTitle","skills","canEdit","readOnlyNote","unitCount","topicCount","projectCount","unitTestCount","units"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/courses/topic":{"post":{"operationId":"courses_topic","summary":"Topic detail (learning goals + activities).","description":"Topic detail (learning goals + activities).","tags":["courses"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"topicId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["topicId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"topicId":{"type":"string"},"unitId":{"type":"string"},"courseId":{"type":"string"},"courseTitle":{"type":"string"},"unitTitle":{"type":"string"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"instructions":{"type":"string","nullable":true},"orderIndex":{"type":"number"},"learningGoals":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":"string","nullable":true}},"required":["id","title","description"]}},"activities":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["FLASHCARDS"]},"id":{"type":"string"},"type":{"type":"string"},"status":{"type":"string"},"title":{"type":"string","nullable":true},"cards":{"type":"array","items":{"type":"object","properties":{"term":{"type":"string"},"definition":{"type":"string"},"hint":{"type":"string","nullable":true}},"required":["term","definition","hint"]}}},"required":["kind","id","type","status","title","cards"]},{"type":"object","properties":{"kind":{"type":"string","enum":["QUIZ"]},"id":{"type":"string"},"type":{"type":"string"},"status":{"type":"string"},"title":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"questions":{"type":"array","items":{"type":"object","properties":{"prompt":{"type":"string"},"options":{"type":"array","items":{"type":"string"}},"correctAnswerIndex":{"type":"number","nullable":true},"explanation":{"type":"string","nullable":true}},"required":["prompt","options","correctAnswerIndex","explanation"]}}},"required":["kind","id","type","status","title","description","questions"]},{"type":"object","properties":{"kind":{"type":"string","enum":["OTHER"]},"id":{"type":"string"},"type":{"type":"string"},"status":{"type":"string"},"title":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"contentNote":{"type":"string","nullable":true}},"required":["kind","id","type","status","title","description","contentNote"]}]}},"editUrl":{"type":"string","nullable":true}},"required":["topicId","unitId","courseId","courseTitle","unitTitle","title","description","instructions","orderIndex","learningGoals","activities","editUrl"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/courses/activity":{"post":{"operationId":"courses_activity","summary":"Activity detail (cards/questions/body by type).","description":"Activity detail (cards/questions/body by type).","tags":["courses"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"activityId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["activityId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"anyOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["FLASHCARDS"]},"id":{"type":"string"},"type":{"type":"string"},"status":{"type":"string"},"topicId":{"type":"string"},"courseId":{"type":"string"},"title":{"type":"string","nullable":true},"cards":{"type":"array","items":{"type":"object","properties":{"term":{"type":"string"},"definition":{"type":"string"},"hint":{"type":"string","nullable":true}},"required":["term","definition","hint"]}},"editUrl":{"type":"string","nullable":true}},"required":["kind","id","type","status","topicId","courseId","title","cards","editUrl"]},{"type":"object","properties":{"kind":{"type":"string","enum":["QUIZ"]},"id":{"type":"string"},"type":{"type":"string"},"status":{"type":"string"},"topicId":{"type":"string"},"courseId":{"type":"string"},"title":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"questions":{"type":"array","items":{"type":"object","properties":{"prompt":{"type":"string"},"options":{"type":"array","items":{"type":"string"}},"correctAnswerIndex":{"type":"number","nullable":true},"explanation":{"type":"string","nullable":true}},"required":["prompt","options","correctAnswerIndex","explanation"]}},"editUrl":{"type":"string","nullable":true}},"required":["kind","id","type","status","topicId","courseId","title","description","questions","editUrl"]},{"type":"object","properties":{"kind":{"type":"string","enum":["READ"]},"id":{"type":"string"},"type":{"type":"string"},"status":{"type":"string"},"topicId":{"type":"string"},"courseId":{"type":"string"},"title":{"type":"string","nullable":true},"contentKey":{"type":"string","nullable":true},"body":{"type":"string","nullable":true},"images":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"alt":{"type":"string"}},"required":["url","alt"]}},"url":{"type":"string"},"bodyTruncated":{"type":"boolean","enum":[false,true]},"bodyError":{"type":"string","nullable":true},"editUrl":{"type":"string","nullable":true}},"required":["kind","id","type","status","topicId","courseId","title","contentKey","body","images","url","bodyTruncated","bodyError","editUrl"]},{"type":"object","properties":{"kind":{"type":"string","enum":["OTHER"]},"id":{"type":"string"},"type":{"type":"string"},"status":{"type":"string"},"topicId":{"type":"string"},"courseId":{"type":"string"},"title":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"meta":{"type":"object","additionalProperties":{"description":"Arbitrary JSON value."},"nullable":true},"contentNote":{"type":"string"},"editUrl":{"type":"string","nullable":true}},"required":["kind","id","type","status","topicId","courseId","title","description","meta","contentNote","editUrl"]}]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/courses/project":{"post":{"operationId":"courses_project","summary":"Project detail (type, config, learning goals).","description":"Project detail (type, config, learning goals).","tags":["courses"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["projectId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"projectId":{"type":"string"},"unitId":{"type":"string"},"courseId":{"type":"string"},"courseTitle":{"type":"string"},"unitTitle":{"type":"string"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"goal":{"type":"string","nullable":true},"type":{"type":"string"},"orderIndex":{"type":"number"},"config":{"type":"string","nullable":true},"configTruncated":{"type":"boolean","enum":[false,true]},"learningGoals":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":"string","nullable":true}},"required":["id","title","description"]}},"editUrl":{"type":"string","nullable":true}},"required":["projectId","unitId","courseId","courseTitle","unitTitle","title","description","goal","type","orderIndex","config","configTruncated","learningGoals","editUrl"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/courses/unit-test":{"post":{"operationId":"courses_unit-test","summary":"Unit test detail (questions).","description":"Unit test detail (questions).","tags":["courses"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"testId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["testId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"testId":{"type":"string"},"unitId":{"type":"string"},"courseId":{"type":"string"},"courseTitle":{"type":"string"},"unitTitle":{"type":"string"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"questions":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"question":{"type":"string"},"explanation":{"type":"string","nullable":true},"options":{"type":"array","items":{"type":"string"},"nullable":true},"correctOptionIndex":{"type":"number","nullable":true},"correctAnswer":{"type":"boolean","enum":[false,true],"nullable":true},"sampleAnswer":{"type":"string","nullable":true}},"required":["type","question","explanation","options","correctOptionIndex","correctAnswer","sampleAnswer"]}},"editUrl":{"type":"string","nullable":true}},"required":["testId","unitId","courseId","courseTitle","unitTitle","title","description","questions","editUrl"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/members/list":{"post":{"operationId":"members_list","summary":"List workspace members and their roles.","description":"List workspace members and their roles.","tags":["members"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"members":{"type":"array","items":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":"string"},"avatarUrl":{"type":"string","nullable":true}},"required":["id","email","name","avatarUrl"]},"primaryRole":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"systemKey":{"type":"string","enum":["ADMIN","INSTRUCTOR","MEMBER","EXTERNAL"],"nullable":true},"color":{"type":"string","nullable":true},"scopeGroupId":{"type":"string","nullable":true},"scopeGroupName":{"type":"string"}},"required":["id","name","systemKey","color","scopeGroupId"],"nullable":true},"extraRoles":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"systemKey":{"type":"string","enum":["ADMIN","INSTRUCTOR","MEMBER","EXTERNAL"],"nullable":true},"color":{"type":"string","nullable":true},"scopeGroupId":{"type":"string","nullable":true},"scopeGroupName":{"type":"string"}},"required":["id","name","systemKey","color","scopeGroupId"]}},"joinedAt":{"type":"string"},"groups":{"type":"array","items":{"type":"string"}},"tags":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"color":{"type":"string"}},"required":["id","name","color"]}}},"required":["user","primaryRole","extraRoles","joinedAt","groups","tags"]}}},"required":["members"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/members/remove":{"post":{"operationId":"members_remove","summary":"Remove a member from the workspace.","description":"Remove a member from the workspace.","tags":["members"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["userId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"removed":{"type":"boolean","enum":[true]}},"required":["removed"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/members/set-role":{"post":{"operationId":"members_set-role","summary":"Set a member's workspace role.","description":"Set a member's workspace role.","tags":["members"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"systemKey":{"type":"string","enum":["ADMIN","INSTRUCTOR","MEMBER"]}},"required":["userId","systemKey"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"userId":{"type":"string"},"primaryRole":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"systemKey":{"type":"string","enum":["ADMIN","INSTRUCTOR","MEMBER","EXTERNAL"],"nullable":true},"color":{"type":"string","nullable":true},"scopeGroupId":{"type":"string","nullable":true},"scopeGroupName":{"type":"string"}},"required":["id","name","systemKey","color","scopeGroupId"],"nullable":true}},"required":["userId","primaryRole"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/members/set-tags":{"post":{"operationId":"members_set-tags","summary":"Replace a member's organizational tags (labels). Creates missing tags; [] clears.","description":"Replace a member's organizational tags (labels). Creates missing tags; [] clears.","tags":["members"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"tags":{"type":"array","items":{"type":"string"},"maxItems":20}},"required":["userId","tags"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"userId":{"type":"string"},"tags":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"color":{"type":"string"}},"required":["id","name","color"]}}},"required":["userId","tags"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/invites/list":{"post":{"operationId":"invites_list","summary":"List invites, optionally filtered by status.","description":"List invites, optionally filtered by status.","tags":["invites"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["PENDING","ACCEPTED","EXPIRED","REVOKED"]}}}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"invites":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","nullable":true},"firstName":{"type":"string","nullable":true},"lastName":{"type":"string","nullable":true},"code":{"type":"string","nullable":true},"type":{"type":"string","enum":["EMAIL","CODE"]},"target":{"type":"string","enum":["WORKSPACE","GROUP"]},"workspaceRole":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"systemKey":{"type":"string","enum":["ADMIN","INSTRUCTOR","MEMBER","EXTERNAL"],"nullable":true},"color":{"type":"string","nullable":true},"scopeGroupId":{"type":"string","nullable":true},"scopeGroupName":{"type":"string"}},"required":["id","name","systemKey","color","scopeGroupId"],"nullable":true},"groupRole":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"systemKey":{"type":"string","enum":["ADMIN","INSTRUCTOR","MEMBER","EXTERNAL"],"nullable":true},"color":{"type":"string","nullable":true},"scopeGroupId":{"type":"string","nullable":true},"scopeGroupName":{"type":"string"}},"required":["id","name","systemKey","color","scopeGroupId"],"nullable":true},"groupId":{"type":"string","nullable":true},"status":{"type":"string","enum":["PENDING","EXPIRED","ACCEPTED","REVOKED"]},"invitedBy":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"]},"createdAt":{"type":"string"},"expiresAt":{"type":"string","nullable":true}},"required":["id","email","firstName","lastName","code","type","target","workspaceRole","groupRole","groupId","status","invitedBy","createdAt","expiresAt"]}}},"required":["invites"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/invites/create":{"post":{"operationId":"invites_create","summary":"Invite a person to the workspace (or a group).","description":"Invite a person to the workspace (or a group).","tags":["invites"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"firstName":{"type":"string"},"lastName":{"type":"string"},"role":{"type":"string","enum":["ADMIN","INSTRUCTOR","MEMBER"],"default":"MEMBER"},"groupId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["email"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"code":{"type":"string","nullable":true},"email":{"type":"string","nullable":true},"type":{"type":"string","enum":["EMAIL","CODE"]},"target":{"type":"string","enum":["WORKSPACE","GROUP"]},"expiresAt":{"type":"string","nullable":true},"emailSent":{"type":"boolean","enum":[false,true],"nullable":true}},"required":["id","code","email","type","target","expiresAt","emailSent"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/invites/revoke":{"post":{"operationId":"invites_revoke","summary":"Revoke a pending invite.","description":"Revoke a pending invite.","tags":["invites"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"inviteId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["inviteId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"revoked":{"type":"boolean","enum":[true]}},"required":["revoked"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/invites/resend":{"post":{"operationId":"invites_resend","summary":"Resend a pending invite email.","description":"Resend a pending invite email.","tags":["invites"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"inviteId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["inviteId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"code":{"type":"string","nullable":true},"email":{"type":"string","nullable":true},"type":{"type":"string","enum":["EMAIL","CODE"]},"target":{"type":"string","enum":["WORKSPACE","GROUP"]},"expiresAt":{"type":"string","nullable":true},"emailSent":{"type":"boolean","enum":[false,true],"nullable":true}},"required":["id","code","email","type","target","expiresAt","emailSent"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/groups/list":{"post":{"operationId":"groups_list","summary":"List groups (optionally a subtree).","description":"List groups (optionally a subtree).","tags":["groups"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"parentId":{"type":"string","nullable":true},"includeDescendants":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"groups":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"parentId":{"type":"string","nullable":true},"depth":{"type":"number"},"memberCount":{"type":"number"},"childCount":{"type":"number"},"tags":{"type":"array","items":{"type":"string"}},"leadInstructor":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"nullable":true},"isArchived":{"type":"boolean","enum":[false,true]}},"required":["id","name","description","parentId","depth","memberCount","childCount","tags","leadInstructor","isArchived"]}}},"required":["groups"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/groups/members-list":{"post":{"operationId":"groups_members-list","summary":"List members of a group.","description":"List members of a group.","tags":["groups"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"groupId":{"type":"string"}},"required":["groupId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"members":{"type":"array","items":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"avatarUrl":{"type":"string","nullable":true}},"required":["id","name","email","avatarUrl"]},"primaryRole":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"systemKey":{"type":"string","enum":["ADMIN","INSTRUCTOR","MEMBER","EXTERNAL"],"nullable":true},"color":{"type":"string","nullable":true},"scopeGroupId":{"type":"string","nullable":true},"scopeGroupName":{"type":"string"}},"required":["id","name","systemKey","color","scopeGroupId"],"nullable":true},"extraRoles":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"systemKey":{"type":"string","enum":["ADMIN","INSTRUCTOR","MEMBER","EXTERNAL"],"nullable":true},"color":{"type":"string","nullable":true},"scopeGroupId":{"type":"string","nullable":true},"scopeGroupName":{"type":"string"}},"required":["id","name","systemKey","color","scopeGroupId"]}},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"joinedAt":{"type":"string","nullable":true},"enrolledAt":{"type":"string"}},"required":["user","primaryRole","extraRoles","status","joinedAt","enrolledAt"]}}},"required":["members"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/groups/create":{"post":{"operationId":"groups_create","summary":"Create a group.","description":"Create a group.","tags":["groups"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"parentId":{"type":"string"}},"required":["name"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"ancestorIds":{"type":"array","items":{"type":"string"}},"joinCode":{"type":"string","nullable":true},"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"parentId":{"type":"string","nullable":true},"depth":{"type":"number"},"memberCount":{"type":"number"},"childCount":{"type":"number"},"tags":{"type":"array","items":{"type":"string"}},"leadInstructor":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"nullable":true},"isArchived":{"type":"boolean","enum":[false,true]}},"required":["ancestorIds","joinCode","id","name","description","parentId","depth","memberCount","childCount","tags","leadInstructor","isArchived"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/groups/update":{"post":{"operationId":"groups_update","summary":"Update a group's name, description, or lead instructor.","description":"Update a group's name, description, or lead instructor.","tags":["groups"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"groupId":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"leadInstructorId":{"type":"string"}},"required":["groupId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"group":{"type":"object","properties":{"ancestorIds":{"type":"array","items":{"type":"string"}},"joinCode":{"type":"string","nullable":true},"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"parentId":{"type":"string","nullable":true},"depth":{"type":"number"},"memberCount":{"type":"number"},"childCount":{"type":"number"},"tags":{"type":"array","items":{"type":"string"}},"leadInstructor":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"nullable":true},"isArchived":{"type":"boolean","enum":[false,true]}},"required":["ancestorIds","joinCode","id","name","description","parentId","depth","memberCount","childCount","tags","leadInstructor","isArchived"]}},"required":["group"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/groups/delete":{"post":{"operationId":"groups_delete","summary":"Delete a group (cascades children + memberships).","description":"Delete a group (cascades children + memberships).","tags":["groups"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"groupId":{"type":"string"}},"required":["groupId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"deleted":{"type":"boolean","enum":[true]}},"required":["deleted"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/groups/member-add":{"post":{"operationId":"groups_member-add","summary":"Add a user to a group.","description":"Add a user to a group.","tags":["groups"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"groupId":{"type":"string"},"userId":{"type":"string"},"systemKey":{"type":"string","enum":["ADMIN","INSTRUCTOR","MEMBER"],"default":"MEMBER"}},"required":["groupId","userId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"membership":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"avatarUrl":{"type":"string","nullable":true}},"required":["id","name","email","avatarUrl"]},"primaryRole":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"systemKey":{"type":"string","enum":["ADMIN","INSTRUCTOR","MEMBER","EXTERNAL"],"nullable":true},"color":{"type":"string","nullable":true},"scopeGroupId":{"type":"string","nullable":true},"scopeGroupName":{"type":"string"}},"required":["id","name","systemKey","color","scopeGroupId"],"nullable":true},"extraRoles":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"systemKey":{"type":"string","enum":["ADMIN","INSTRUCTOR","MEMBER","EXTERNAL"],"nullable":true},"color":{"type":"string","nullable":true},"scopeGroupId":{"type":"string","nullable":true},"scopeGroupName":{"type":"string"}},"required":["id","name","systemKey","color","scopeGroupId"]}},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]},"joinedAt":{"type":"string","nullable":true},"enrolledAt":{"type":"string"}},"required":["user","primaryRole","extraRoles","status","joinedAt","enrolledAt"]}},"required":["membership"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/groups/member-remove":{"post":{"operationId":"groups_member-remove","summary":"Remove a user from a group.","description":"Remove a user from a group.","tags":["groups"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"groupId":{"type":"string"},"userId":{"type":"string"}},"required":["groupId","userId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"removed":{"type":"boolean","enum":[true]}},"required":["removed"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/groups/member-set-status":{"post":{"operationId":"groups_member-set-status","summary":"Set a group member's status (ACTIVE/INACTIVE).","description":"Set a group member's status (ACTIVE/INACTIVE).","tags":["groups"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"groupId":{"type":"string"},"userId":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","INACTIVE"]}},"required":["groupId","userId","status"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"membership":{"type":"object","properties":{"status":{"type":"string","enum":["ACTIVE","INACTIVE"]}},"required":["status"]}},"required":["membership"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/assignments/list":{"post":{"operationId":"assignments_list","summary":"List course assignments in the workspace.","description":"List course assignments in the workspace.","tags":["assignments"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["WORKSPACE","GROUP","CUSTOM"]},"groupId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}}}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"assignments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string","enum":["WORKSPACE","GROUP","CUSTOM"]},"name":{"type":"string","nullable":true},"course":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"thumbnailUrl":{"type":"string","nullable":true}},"required":["id","title"]},"groupId":{"type":"string","nullable":true},"groupName":{"type":"string","nullable":true},"assignedById":{"type":"string"},"assignedAt":{"type":"string"},"dueDate":{"type":"string","nullable":true},"totalAssignees":{"type":"number"},"completedCount":{"type":"number"},"completionPercent":{"type":"number"}},"required":["id","type","name","course","groupId","groupName","assignedById","assignedAt","dueDate","totalAssignees","completedCount","completionPercent"]}}},"required":["assignments"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/assignments/get":{"post":{"operationId":"assignments_get","summary":"Get one assignment with completion stats.","description":"Get one assignment with completion stats.","tags":["assignments"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"assignmentId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["assignmentId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"assignment":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string","enum":["WORKSPACE","GROUP","CUSTOM"]},"name":{"type":"string","nullable":true},"courseId":{"type":"string"},"courseTitle":{"type":"string"},"courseDescription":{"type":"string","nullable":true},"groupId":{"type":"string","nullable":true},"groupName":{"type":"string","nullable":true},"assignedById":{"type":"string"},"assignedByName":{"type":"string"},"assignedAt":{"type":"string"},"dueDate":{"type":"string","nullable":true},"totalAssignees":{"type":"number"},"completedCount":{"type":"number"},"completionPercent":{"type":"number"},"completionCriteria":{"type":"object","properties":{"activitiesPerTopic":{"anyOf":[{"type":"number"},{"type":"string","enum":["ALL"]}]},"testRequired":{"type":"boolean","enum":[false,true]},"testMinScore":{"type":"number","nullable":true},"projectsRequired":{"type":"boolean","enum":[false,true]},"quizMinScore":{"type":"number","nullable":true},"refreshersRequired":{"type":"boolean","enum":[false,true]}},"required":["activitiesPerTopic","testRequired","testMinScore","projectsRequired","quizMinScore"],"nullable":true},"rules":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["INCLUDE","EXCLUDE"]},"targetType":{"type":"string","enum":["GROUP","USER","INVITE"]},"groupId":{"type":"string","nullable":true},"userId":{"type":"string","nullable":true}},"required":["kind","targetType","groupId","userId"]}},"assignedUsers":{"type":"array","items":{"type":"object","properties":{"userId":{"type":"string"},"name":{"type":"string","nullable":true},"email":{"type":"string"},"avatarUrl":{"type":"string","nullable":true},"complete":{"type":"boolean","enum":[false,true]},"progressPercent":{"type":"number"},"completedAt":{"type":"string","nullable":true}},"required":["userId","name","email","avatarUrl","complete","progressPercent","completedAt"]}}},"required":["id","type","name","courseId","courseTitle","courseDescription","groupId","groupName","assignedById","assignedByName","assignedAt","dueDate","totalAssignees","completedCount","completionPercent","completionCriteria","rules","assignedUsers"]}},"required":["assignment"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/assignments/for-user":{"post":{"operationId":"assignments_for-user","summary":"List one user's assignments and completion state.","description":"List one user's assignments and completion state.","tags":["assignments"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["userId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","nullable":true},"email":{"type":"string"},"avatarUrl":{"type":"string","nullable":true}},"required":["id","name","email","avatarUrl"]},"assignments":{"type":"array","items":{"type":"object","properties":{"assignmentId":{"type":"string"},"name":{"type":"string","nullable":true},"courseId":{"type":"string"},"courseTitle":{"type":"string"},"type":{"type":"string","enum":["WORKSPACE","GROUP","CUSTOM"]},"scopeLabel":{"type":"string"},"groupName":{"type":"string","nullable":true},"dueDate":{"type":"string","nullable":true},"complete":{"type":"boolean","enum":[false,true]},"progressPercent":{"type":"number"},"completedAt":{"type":"string","nullable":true},"overdue":{"type":"boolean","enum":[false,true]}},"required":["assignmentId","name","courseId","courseTitle","type","scopeLabel","groupName","dueDate","complete","progressPercent","completedAt","overdue"]}}},"required":["user","assignments"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/assignments/create":{"post":{"operationId":"assignments_create","summary":"Assign one or more courses to a scope.","description":"Assign one or more courses to a scope.","tags":["assignments"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"courseIds":{"type":"array","items":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"minItems":1},"scopeType":{"type":"string","enum":["WORKSPACE","GROUP","CUSTOM"]},"groupId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"name":{"type":"string"},"dueDate":{"type":"string"},"message":{"type":"string"},"includedGroupIds":{"type":"array","items":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"includedUserIds":{"type":"array","items":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"excludedGroupIds":{"type":"array","items":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"excludedUserIds":{"type":"array","items":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}}},"required":["courseIds","scopeType"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"assignments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"courseId":{"type":"string"},"type":{"type":"string","enum":["WORKSPACE","GROUP","CUSTOM"]},"name":{"type":"string","nullable":true},"dueDate":{"type":"string","nullable":true},"assignedCount":{"type":"number"},"alreadyAssigned":{"type":"boolean","enum":[false,true]}},"required":["id","courseId","type","name","dueDate","assignedCount"]}}},"required":["assignments"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/assignments/remove":{"post":{"operationId":"assignments_remove","summary":"Remove an assignment.","description":"Remove an assignment.","tags":["assignments"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"assignmentId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["assignmentId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"removed":{"type":"boolean","enum":[true]}},"required":["removed"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/workspace/get":{"post":{"operationId":"workspace_get","summary":"Get workspace metadata (name, member + group counts).","description":"Get workspace metadata (name, member + group counts).","tags":["workspace"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string","nullable":true},"isPersonal":{"type":"boolean","enum":[false,true]},"isEnterprise":{"type":"boolean","enum":[false,true]},"ownerId":{"type":"string","nullable":true},"role":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"systemKey":{"type":"string","enum":["ADMIN","INSTRUCTOR","MEMBER","EXTERNAL"],"nullable":true},"color":{"type":"string","nullable":true},"scopeGroupId":{"type":"string","nullable":true},"scopeGroupName":{"type":"string"}},"required":["id","name","systemKey","color","scopeGroupId"],"nullable":true},"memberCount":{"type":"number"},"groupCount":{"type":"number"}},"required":["id","name","slug","isPersonal","isEnterprise","ownerId","role","memberCount","groupCount"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/workspace/update":{"post":{"operationId":"workspace_update","summary":"Update workspace name and/or slug.","description":"Update workspace name and/or slug.","tags":["workspace"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string"}}}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"workspace":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string","nullable":true},"isPersonal":{"type":"boolean","enum":[false,true]},"profilePictureKey":{"type":"string","nullable":true},"whitelabelEnabled":{"type":"boolean","enum":[false,true]},"coursePublishingReviewsEnabled":{"type":"boolean","enum":[false,true]},"whitelabelName":{"type":"string","nullable":true},"whitelabelLogoKey":{"type":"string","nullable":true},"whitelabelFaviconKey":{"type":"string","nullable":true},"whitelabelLoginImageKey":{"type":"string","nullable":true},"whitelabelLoginMessage":{"type":"string","nullable":true},"defaultTimezone":{"type":"string","nullable":true},"locale":{"type":"string","nullable":true},"terminology":{"type":"object","properties":{"workspace":{"type":"object","properties":{"singular":{"type":"string"},"plural":{"type":"string"},"Singular":{"type":"string"},"Plural":{"type":"string"}},"required":["singular","plural","Singular","Plural"]},"admin":{"type":"object","properties":{"singular":{"type":"string"},"plural":{"type":"string"},"Singular":{"type":"string"},"Plural":{"type":"string"}},"required":["singular","plural","Singular","Plural"]},"student":{"type":"object","properties":{"singular":{"type":"string"},"plural":{"type":"string"},"Singular":{"type":"string"},"Plural":{"type":"string"}},"required":["singular","plural","Singular","Plural"]},"group":{"type":"object","properties":{"singular":{"type":"string"},"plural":{"type":"string"},"Singular":{"type":"string"},"Plural":{"type":"string"}},"required":["singular","plural","Singular","Plural"]},"subgroup":{"type":"object","properties":{"singular":{"type":"string"},"plural":{"type":"string"},"Singular":{"type":"string"},"Plural":{"type":"string"}},"required":["singular","plural","Singular","Plural"]},"member":{"type":"object","properties":{"singular":{"type":"string"},"plural":{"type":"string"},"Singular":{"type":"string"},"Plural":{"type":"string"}},"required":["singular","plural","Singular","Plural"]},"instructor":{"type":"object","properties":{"singular":{"type":"string"},"plural":{"type":"string"},"Singular":{"type":"string"},"Plural":{"type":"string"}},"required":["singular","plural","Singular","Plural"]},"organization":{"type":"object","properties":{"singular":{"type":"string"},"plural":{"type":"string"},"Singular":{"type":"string"},"Plural":{"type":"string"}},"required":["singular","plural","Singular","Plural"]},"curriculum":{"type":"object","properties":{"singular":{"type":"string"},"plural":{"type":"string"},"Singular":{"type":"string"},"Plural":{"type":"string"}},"required":["singular","plural","Singular","Plural"]},"tag":{"type":"object","properties":{"singular":{"type":"string"},"plural":{"type":"string"},"Singular":{"type":"string"},"Plural":{"type":"string"}},"required":["singular","plural","Singular","Plural"]}},"required":["workspace","admin","student","group","subgroup","member","instructor","organization","curriculum","tag"]}},"required":["id","name","slug","isPersonal","profilePictureKey","whitelabelEnabled","coursePublishingReviewsEnabled","whitelabelName","whitelabelLogoKey","whitelabelFaviconKey","whitelabelLoginImageKey","whitelabelLoginMessage","defaultTimezone","locale","terminology"]}},"required":["workspace"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/explore/sections-list":{"post":{"operationId":"explore_sections-list","summary":"List Explore sections + the master toggle state.","description":"List Explore sections + the master toggle state.","tags":["explore"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"exploreEnabled":{"type":"boolean","enum":[false,true]},"exploreOnHome":{"type":"boolean","enum":[false,true]},"sections":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"title":{"type":"string"},"subtitle":{"type":"string","nullable":true},"tag":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"color":{"type":"string","nullable":true},"layout":{"type":"string"},"position":{"type":"number"},"isActive":{"type":"boolean","enum":[false,true]},"courseIds":{"type":"array","items":{"type":"string"}},"courses":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"coverImage":{"type":"string"},"isPublished":{"type":"boolean","enum":[false,true]}},"required":["id","title","isPublished"]}},"source":{"type":"string","enum":["MANUAL","CURRICULUM","CATALOG"]},"catalogId":{"type":"string","nullable":true},"curriculumId":{"type":"string","nullable":true},"curriculumTitle":{"type":"string","nullable":true},"visibleToGroupIds":{"type":"array","items":{"type":"string"}},"hiddenFromGroupIds":{"type":"array","items":{"type":"string"}},"updatedAt":{"type":"string"}},"required":["id","slug","title","subtitle","tag","description","color","layout","position","isActive","courseIds","courses","source","catalogId","curriculumId","curriculumTitle","visibleToGroupIds","hiddenFromGroupIds","updatedAt"]}},"totalCount":{"type":"number"}},"required":["exploreEnabled","exploreOnHome","sections","totalCount"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/explore/candidate-courses":{"post":{"operationId":"explore_candidate-courses","summary":"List courses eligible to feature on Explore.","description":"List courses eligible to feature on Explore.","tags":["explore"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"courses":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"coverImage":{"type":"string"},"categories":{"type":"array","items":{"type":"string"}}},"required":["id","title","description","categories"]}},"totalCount":{"type":"number"}},"required":["courses","totalCount"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/explore/candidate-catalogs":{"post":{"operationId":"explore_candidate-catalogs","summary":"List catalogs eligible as live Explore sources.","description":"List catalogs eligible as live Explore sources.","tags":["explore"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"object","properties":{"enabled":{"type":"boolean","enum":[false,true]},"id":{"type":"string"},"name":{"type":"string"},"visibility":{"type":"string","enum":["WORKSPACE","PUBLIC"]}},"required":["enabled","id","name","visibility"]}}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/explore/toggle":{"post":{"operationId":"explore_toggle","summary":"Show or hide the Explore page for learners.","description":"Show or hide the Explore page for learners.","tags":["explore"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"exploreEnabled":{"type":"boolean"}},"required":["exploreEnabled"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"exploreEnabled":{"type":"boolean","enum":[false,true]}},"required":["exploreEnabled"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/explore/toggle-home":{"post":{"operationId":"explore_toggle-home","summary":"Also show the Explore rows on the learner home page.","description":"Also show the Explore rows on the learner home page.","tags":["explore"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"exploreOnHome":{"type":"boolean"}},"required":["exploreOnHome"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"exploreOnHome":{"type":"boolean","enum":[false,true]}},"required":["exploreOnHome"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/explore/set-courses":{"post":{"operationId":"explore_set-courses","summary":"Replace a section's course list, in order.","description":"Replace a section's course list, in order.","tags":["explore"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sectionId":{"type":"string"},"courseIds":{"type":"array","items":{"type":"string"}}},"required":["sectionId","courseIds"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"courseIds":{"type":"array","items":{"type":"string"}}},"required":["courseIds"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/explore/set-audience":{"post":{"operationId":"explore_set-audience","summary":"Limit a section to groups, or hide it from groups.","description":"Limit a section to groups, or hide it from groups.","tags":["explore"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sectionId":{"type":"string"},"visibleToGroupIds":{"type":"array","items":{"type":"string"}},"hiddenFromGroupIds":{"type":"array","items":{"type":"string"}}},"required":["sectionId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"visibleToGroupIds":{"type":"array","items":{"type":"string"}},"hiddenFromGroupIds":{"type":"array","items":{"type":"string"}}},"required":["id","title","visibleToGroupIds","hiddenFromGroupIds"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/explore/create-section":{"post":{"operationId":"explore_create-section","summary":"Create an Explore section.","description":"Create an Explore section.","tags":["explore"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string"},"title":{"type":"string"},"subtitle":{"type":"string"},"tag":{"type":"string"},"description":{"type":"string"},"color":{"type":"string","nullable":true,"maxLength":100},"layout":{"type":"string","enum":["heading","row","featured","trending","path","path-vertical"]},"position":{"type":"integer","minimum":0},"isActive":{"type":"boolean"},"curriculumId":{"type":"string","nullable":true},"catalogId":{"type":"string","nullable":true},"source":{"type":"string","enum":["MANUAL","CURRICULUM","CATALOG"]},"courseIds":{"type":"array","items":{"type":"string"}},"visibleToGroupIds":{"type":"array","items":{"type":"string"}},"hiddenFromGroupIds":{"type":"array","items":{"type":"string"}}},"required":["slug","title"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"title":{"type":"string"},"subtitle":{"type":"string","nullable":true},"tag":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"color":{"type":"string","nullable":true},"layout":{"type":"string"},"position":{"type":"number"},"isActive":{"type":"boolean","enum":[false,true]},"courseIds":{"type":"array","items":{"type":"string"}},"courses":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"coverImage":{"type":"string"},"isPublished":{"type":"boolean","enum":[false,true]}},"required":["id","title","isPublished"]}},"source":{"type":"string","enum":["MANUAL","CURRICULUM","CATALOG"]},"catalogId":{"type":"string","nullable":true},"curriculumId":{"type":"string","nullable":true},"curriculumTitle":{"type":"string","nullable":true},"visibleToGroupIds":{"type":"array","items":{"type":"string"}},"hiddenFromGroupIds":{"type":"array","items":{"type":"string"}},"updatedAt":{"type":"string"}},"required":["id","slug","title","subtitle","tag","description","color","layout","position","isActive","courseIds","courses","source","catalogId","curriculumId","curriculumTitle","visibleToGroupIds","hiddenFromGroupIds","updatedAt"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/explore/update-section":{"post":{"operationId":"explore_update-section","summary":"Update an Explore section.","description":"Update an Explore section.","tags":["explore"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sectionId":{"type":"string"},"slug":{"type":"string"},"title":{"type":"string"},"subtitle":{"type":"string"},"tag":{"type":"string"},"description":{"type":"string"},"color":{"type":"string","nullable":true,"maxLength":100},"layout":{"type":"string","enum":["heading","row","featured","trending","path","path-vertical"]},"position":{"type":"integer","minimum":0},"isActive":{"type":"boolean"},"curriculumId":{"type":"string","nullable":true},"catalogId":{"type":"string","nullable":true},"source":{"type":"string","enum":["MANUAL","CURRICULUM","CATALOG"]},"courseIds":{"type":"array","items":{"type":"string"}},"visibleToGroupIds":{"type":"array","items":{"type":"string"}},"hiddenFromGroupIds":{"type":"array","items":{"type":"string"}}},"required":["sectionId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"title":{"type":"string"},"subtitle":{"type":"string","nullable":true},"tag":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"color":{"type":"string","nullable":true},"layout":{"type":"string"},"position":{"type":"number"},"isActive":{"type":"boolean","enum":[false,true]},"courseIds":{"type":"array","items":{"type":"string"}},"courses":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"coverImage":{"type":"string"},"isPublished":{"type":"boolean","enum":[false,true]}},"required":["id","title","isPublished"]}},"source":{"type":"string","enum":["MANUAL","CURRICULUM","CATALOG"]},"catalogId":{"type":"string","nullable":true},"curriculumId":{"type":"string","nullable":true},"curriculumTitle":{"type":"string","nullable":true},"visibleToGroupIds":{"type":"array","items":{"type":"string"}},"hiddenFromGroupIds":{"type":"array","items":{"type":"string"}},"updatedAt":{"type":"string"}},"required":["id","slug","title","subtitle","tag","description","color","layout","position","isActive","courseIds","courses","source","catalogId","curriculumId","curriculumTitle","visibleToGroupIds","hiddenFromGroupIds","updatedAt"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/explore/delete-section":{"post":{"operationId":"explore_delete-section","summary":"Delete an Explore section.","description":"Delete an Explore section.","tags":["explore"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sectionId":{"type":"string"}},"required":["sectionId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"deleted":{"type":"boolean","enum":[false,true]}},"required":["deleted"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/explore/reorder":{"post":{"operationId":"explore_reorder","summary":"Reorder Explore sections top-to-bottom.","description":"Reorder Explore sections top-to-bottom.","tags":["explore"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"orderedIds":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["orderedIds"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"reordered":{"type":"number"}},"required":["reordered"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/explore/add-course":{"post":{"operationId":"explore_add-course","summary":"Add a course to an Explore section.","description":"Add a course to an Explore section.","tags":["explore"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sectionId":{"type":"string"},"courseId":{"type":"string"}},"required":["sectionId","courseId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"added":{"type":"boolean","enum":[false,true]},"courseIds":{"type":"array","items":{"type":"string"}}},"required":["added","courseIds"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/explore/remove-course":{"post":{"operationId":"explore_remove-course","summary":"Remove a course from an Explore section.","description":"Remove a course from an Explore section.","tags":["explore"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sectionId":{"type":"string"},"courseId":{"type":"string"}},"required":["sectionId","courseId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"removed":{"type":"boolean","enum":[false,true]},"courseIds":{"type":"array","items":{"type":"string"}}},"required":["removed","courseIds"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/tree":{"post":{"operationId":"kb_tree","summary":"List KB folders and documents.","description":"List KB folders and documents.","tags":["kb"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"parentId":{"type":"string","nullable":true,"pattern":"^[0-9a-fA-F]{24}$"},"includeDescendants":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"type":{"type":"string","enum":["FOLDER","DOCUMENT"]},"parentId":{"type":"string","nullable":true},"depth":{"type":"number"},"tags":{"type":"array","items":{"type":"string"}},"latestVersionId":{"type":"string","nullable":true},"isDeleted":{"type":"boolean","enum":[false,true]},"role":{"type":"string","enum":["ADMIN","VIEWER","EDITOR","MAINTAINER"]},"url":{"type":"string"},"href":{"type":"string"},"dashboardUrl":{"type":"string"},"updatedAt":{"type":"string"},"syncConnectionId":{"type":"string","nullable":true},"syncProvider":{"type":"string","enum":["GOOGLE_DRIVE","GRANOLA","WEB","YOUTUBE","NOTION","CONFLUENCE","SALESFORCE","DOCUMENT360","ONEDRIVE","SHAREPOINT","GITHUB"],"nullable":true},"syncStatus":{"type":"string","enum":["SYNCING","SYNCED","ERROR"],"nullable":true},"syncExternalUrl":{"type":"string","nullable":true},"syncedAt":{"type":"string","nullable":true},"syncErrorMessage":{"type":"string","nullable":true},"syncContentMode":{"type":"string","nullable":true},"source":{"type":"string","enum":["course"],"nullable":true},"sourcePath":{"type":"string","nullable":true},"readOnly":{"type":"boolean","enum":[false,true]}},"required":["id","title","type","parentId","depth","tags","latestVersionId","isDeleted","role","url","href","dashboardUrl","updatedAt","syncProvider","syncStatus","syncExternalUrl","syncedAt","syncErrorMessage","syncContentMode","source","sourcePath","readOnly"]}}},"required":["items"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/search":{"post":{"operationId":"kb_search","summary":"Keyword + vector search over the KB.","description":"Keyword + vector search over the KB.","tags":["kb"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string"},"limit":{"type":"integer","minimum":0,"exclusiveMinimum":true}},"required":["query"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"excerpt":{"type":"string","nullable":true},"id":{"type":"string"},"title":{"type":"string"},"type":{"type":"string","enum":["FOLDER","DOCUMENT"]},"parentId":{"type":"string","nullable":true},"depth":{"type":"number"},"tags":{"type":"array","items":{"type":"string"}},"latestVersionId":{"type":"string","nullable":true},"isDeleted":{"type":"boolean","enum":[false,true]},"role":{"type":"string","enum":["ADMIN","VIEWER","EDITOR","MAINTAINER"]},"url":{"type":"string"},"href":{"type":"string"},"dashboardUrl":{"type":"string"},"updatedAt":{"type":"string"},"syncConnectionId":{"type":"string","nullable":true},"syncProvider":{"type":"string","enum":["GOOGLE_DRIVE","GRANOLA","WEB","YOUTUBE","NOTION","CONFLUENCE","SALESFORCE","DOCUMENT360","ONEDRIVE","SHAREPOINT","GITHUB"],"nullable":true},"syncStatus":{"type":"string","enum":["SYNCING","SYNCED","ERROR"],"nullable":true},"syncExternalUrl":{"type":"string","nullable":true},"syncedAt":{"type":"string","nullable":true},"syncErrorMessage":{"type":"string","nullable":true},"syncContentMode":{"type":"string","nullable":true},"source":{"type":"string","enum":["course"],"nullable":true},"sourcePath":{"type":"string","nullable":true},"readOnly":{"type":"boolean","enum":[false,true]}},"required":["excerpt","id","title","type","parentId","depth","tags","latestVersionId","isDeleted","role","url","href","dashboardUrl","updatedAt","syncProvider","syncStatus","syncExternalUrl","syncedAt","syncErrorMessage","syncContentMode","source","sourcePath","readOnly"]}},"degraded":{"type":"boolean","enum":[false,true]},"failedPasses":{"type":"array","items":{"type":"string","enum":["snapshot","items","vectors"]}}},"required":["results","degraded","failedPasses"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/read":{"post":{"operationId":"kb_read","summary":"Read a document's canonical HTML.","description":"Read a document's canonical HTML.","tags":["kb"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"itemId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["itemId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"itemId":{"type":"string"},"title":{"type":"string"},"type":{"type":"string","enum":["FOLDER","DOCUMENT"]},"role":{"type":"string","enum":["ADMIN","VIEWER","EDITOR","MAINTAINER"]},"url":{"type":"string"},"href":{"type":"string"},"dashboardUrl":{"type":"string"},"html":{"type":"string"},"previewHtml":{"type":"string"},"plainText":{"type":"string"},"versionId":{"type":"string"}},"required":["id","itemId","title","type","role","url","href","dashboardUrl","html","previewHtml","plainText","versionId"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/walkthrough-import-start":{"post":{"operationId":"kb_walkthrough-import-start","summary":"Create a walkthrough import and return a presigned video PUT URL.","description":"Create a walkthrough import and return a presigned video PUT URL.","tags":["kb"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"filename":{"type":"string","minLength":1,"maxLength":255},"mimeType":{"type":"string","enum":["video/mp4","video/webm","video/quicktime"]},"sizeBytes":{"type":"integer","minimum":0,"exclusiveMinimum":true},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"parentId":{"type":"string","nullable":true,"pattern":"^[0-9a-fA-F]{24}$"},"title":{"type":"string","minLength":1,"maxLength":200}},"required":["filename","mimeType","sizeBytes","sha256"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"jobId":{"type":"string"},"itemId":{"type":"string"},"gcsKey":{"type":"string"},"existed":{"type":"boolean","enum":[false,true]},"uploadUrl":{"type":"string"},"uploadExpiresAt":{"type":"string"},"resumable":{"type":"boolean","enum":[false,true]}},"required":["jobId","itemId","gcsKey","existed"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/import-dispatch":{"post":{"operationId":"kb_import-dispatch","summary":"Dispatch a completed presigned upload for processing.","description":"Start an asynchronous import job. The result contains jobId, itemId, and status. Poll kb/import-status with jobId until status is READY or FAILED. Poll every 5 seconds with backoff; visual walkthrough processing has a separate walkthroughStatus. This legacy command returns HTTP 200 even when processing continues.","tags":["kb"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"jobId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["jobId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"jobId":{"type":"string"},"itemId":{"type":"string"},"status":{"type":"string","enum":["PROCESSING","READY","FAILED"]}},"required":["jobId","itemId","status"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/import-status":{"post":{"operationId":"kb_import-status","summary":"Poll transcript and visual-analysis status for an import.","description":"Poll an existing asynchronous import job. READY and FAILED are terminal for the transcript. walkthroughStatus independently reports optional visual analysis. Only authorized workspace items are returned.","tags":["kb"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"jobId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["jobId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"jobId":{"type":"string"},"itemId":{"type":"string"},"status":{"type":"string","enum":["PROCESSING","READY","FAILED"]},"errorMessage":{"type":"string","nullable":true},"filename":{"type":"string"},"walkthroughStatus":{"type":"string","enum":["NOT_APPLICABLE","QUEUED","PROCESSING","READY","FAILED"]},"walkthroughErrorMessage":{"type":"string","nullable":true}},"required":["jobId","itemId","status","errorMessage","filename","walkthroughStatus","walkthroughErrorMessage"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/walkthrough-read":{"post":{"operationId":"kb_walkthrough-read","summary":"Read structured walkthrough steps and short-lived media URLs.","description":"Read structured walkthrough steps and short-lived media URLs.","tags":["kb"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"jobId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["jobId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"jobId":{"type":"string"},"itemId":{"type":"string"},"filename":{"type":"string"},"importStatus":{"type":"string","enum":["FAILED","PROCESSING","READY"]},"importError":{"type":"string","nullable":true},"state":{"type":"string","enum":["FAILED","PROCESSING","READY"]},"generationError":{"type":"string","nullable":true},"sourceVideoUrl":{"type":"string","nullable":true},"walkthrough":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string","enum":["advanced"]},"description":{"type":"string"},"title":{"type":"string"},"steps":{"type":"array","items":{"type":"object","properties":{"step":{"type":"number"},"t":{"type":"number"},"frameKey":{"type":"string"},"caption":{"type":"string"},"notes":{"type":"string"},"endFrameKey":{"nullable":true}},"required":["step","t","frameKey","caption","notes"]}}},"required":["mode","description","title","steps"]},{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"aspectRatio":{"type":"number"},"frameWidth":{"type":"number"},"steps":{"type":"array","items":{"type":"object","properties":{"step":{"type":"number"},"type":{"type":"string","enum":["type","select","click","scroll","drag","hover","navigate","modal_open","modal_close"]},"t":{"type":"number","nullable":true},"tStart":{"type":"number","nullable":true},"tEnd":{"type":"number","nullable":true},"frameKey":{"type":"string"},"box_2d":{"type":"array","items":{"type":"number"},"minItems":4,"maxItems":4},"point":{"type":"array","items":{"type":"number"},"minItems":2,"maxItems":2},"zoom_box":{"type":"array","items":{"type":"number"},"minItems":4,"maxItems":4},"target_label":{"type":"string"},"what_changed":{"type":"string"},"caption":{"type":"string"},"chapter":{"type":"string"},"endFrameKey":{"type":"string","nullable":true}},"required":["step","type","t","tStart","tEnd","frameKey","box_2d","point","zoom_box","target_label","what_changed","caption","chapter"]}},"sourceVideoKey":{"type":"string","nullable":true},"sourceMaterialId":{"type":"string","nullable":true},"generationStep":{"type":"string","nullable":true},"generationError":{"type":"string","nullable":true}},"required":["title","description","aspectRatio","frameWidth","steps"]}],"nullable":true},"frames":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number"},"step":{"type":"number"},"frameUrl":{"type":"string"},"endFrameUrl":{"type":"string","nullable":true}},"required":["index","step","frameUrl","endFrameUrl"]}}},"required":["jobId","itemId","filename","importStatus","importError","state","generationError","sourceVideoUrl","walkthrough","frames"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/versions":{"post":{"operationId":"kb_versions","summary":"List document revision history.","description":"List document revision history.","tags":["kb"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"itemId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"limit":{"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":100},"offset":{"type":"integer","minimum":0}},"required":["itemId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"itemId":{"type":"string"},"currentVersionId":{"type":"string","nullable":true},"versions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"bytes":{"type":"number"},"htmlSha256":{"type":"string"},"artifactCommitSha":{"type":"string","nullable":true},"operationId":{"type":"string","nullable":true},"medium":{"type":"string"},"connectorId":{"type":"string","nullable":true},"source":{"type":"string","enum":["WEB","ASSISTANT","MCP","CLI","DEVELOPER_API"]},"reason":{"type":"string","nullable":true},"actorUser":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"}},"required":["id","name","email"],"nullable":true},"createdAt":{"type":"string"},"restoredFromVersionId":{"type":"string","nullable":true},"current":{"type":"boolean","enum":[false,true]}},"required":["id","bytes","htmlSha256","artifactCommitSha","operationId","medium","connectorId","source","reason","actorUser","createdAt","restoredFromVersionId","current"]}},"nextOffset":{"type":"number","nullable":true}},"required":["itemId","currentVersionId","versions","nextOffset"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/read-version":{"post":{"operationId":"kb_read-version","summary":"Read one historical document revision.","description":"Read one historical document revision.","tags":["kb"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"itemId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"versionId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["itemId","versionId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"itemId":{"type":"string"},"versionId":{"type":"string"},"html":{"type":"string"},"previewHtml":{"type":"string"},"plainText":{"type":"string"},"htmlSha256":{"type":"string"},"artifactCommitSha":{"type":"string","nullable":true}},"required":["itemId","versionId","html","previewHtml","plainText","htmlSha256","artifactCommitSha"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/artifact-branches":{"post":{"operationId":"kb_artifact-branches","summary":"List Git branches for a migrated document.","description":"List Git branches for a migrated document.","tags":["kb"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"itemId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["itemId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"workspaceId":{"type":"string"},"repositoryGeneration":{"type":"string"},"branches":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"branch":{"type":"string"},"type":{"type":"string","enum":["DRAFT","CANONICAL","AGENT","REVIEW","STAGING","MIGRATION"]},"status":{"type":"string","enum":["ACTIVE","READY","MERGING","CONFLICTED","MERGED","CLOSED","EXPIRED"]},"baseCommitSha":{"type":"string","nullable":true},"commitSha":{"type":"string","nullable":true},"scopeRootItemIds":{"type":"array","items":{"type":"string"}},"expiresAt":{"type":"string","nullable":true}},"required":["id","branch","type","status","baseCommitSha","commitSha","scopeRootItemIds","expiresAt"]}}},"required":["workspaceId","repositoryGeneration","branches"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/artifact-files":{"post":{"operationId":"kb_artifact-files","summary":"List files on an ACL-scoped Knowledge Base branch.","description":"List files on an ACL-scoped Knowledge Base branch.","tags":["kb"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"branchId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["branchId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"anyOf":[{"type":"object","properties":{"branchId":{"type":"string"},"files":{"type":"array","items":{}},"branch":{}},"required":["branchId","files"]},{"type":"object","properties":{"branchId":{"type":"string"},"branch":{"type":"string"},"files":{"type":"array","items":{"type":"string"}}},"required":["branchId","branch","files"]}]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/artifact-read-file":{"post":{"operationId":"kb_artifact-read-file","summary":"Read one file from an ACL-scoped Knowledge Base branch.","description":"Read one file from an ACL-scoped Knowledge Base branch.","tags":["kb"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"branchId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"path":{"type":"string"}},"required":["branchId","path"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"branchId":{"type":"string"},"branch":{"type":"string"},"path":{"type":"string"},"content":{"type":"string"},"bytes":{"type":"number"}},"required":["branchId","branch","path","content","bytes"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/artifact-diff":{"post":{"operationId":"kb_artifact-diff","summary":"Compare an ACL-scoped branch with its base commit.","description":"Compare an ACL-scoped branch with its base commit.","tags":["kb"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"branchId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["branchId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"anyOf":[{"type":"object","properties":{"branchId":{"type":"string"},"changes":{"type":"array","items":{}},"branch":{}},"required":["branchId","changes"]},{"type":"object","properties":{"branchId":{"type":"string"},"branch":{"type":"string"},"changes":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"status":{"type":"string","enum":["added","modified","deleted"]},"beforeOid":{"type":"string","nullable":true},"afterOid":{"type":"string","nullable":true}},"required":["path","status","beforeOid","afterOid"]}}},"required":["branchId","branch","changes"]}]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/permissions":{"post":{"operationId":"kb_permissions","summary":"List permission grants on an item.","description":"List permission grants on an item.","tags":["kb"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"itemId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["itemId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"grants":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"principalType":{"type":"string","enum":["WORKSPACE","GROUP","USER","API_KEY"]},"role":{"type":"string","enum":["ADMIN","VIEWER","EDITOR","MAINTAINER"]},"user":{"type":"object","properties":{"email":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"avatarUrl":{"type":"string","nullable":true}},"required":["email","id","name","avatarUrl"],"nullable":true},"group":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"parentId":{"type":"string","nullable":true},"depth":{"type":"number"}},"required":["id","name","parentId","depth"],"nullable":true},"createdAt":{"type":"string"}},"required":["id","principalType","role","user","group","createdAt"]}},"url":{"type":"string"},"href":{"type":"string"},"dashboardUrl":{"type":"string"},"itemId":{"type":"string"}},"required":["grants","url","href","dashboardUrl","itemId"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/public-link-get":{"post":{"operationId":"kb_public-link-get","summary":"Get a document's public link status.","description":"Get a document's public link status.","tags":["kb"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"itemId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["itemId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"link":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"url":{"type":"string","nullable":true},"enabledAt":{"type":"string","nullable":true},"enabledById":{"type":"string","nullable":true}},"required":["slug","path","url","enabledAt","enabledById"]}},"required":["link"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/write":{"post":{"operationId":"kb_write","summary":"Overwrite a document's HTML.","description":"Overwrite a document's HTML.","tags":["kb"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"itemId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"html":{"type":"string"}},"required":["itemId","html"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"itemId":{"type":"string"},"title":{"type":"string"},"type":{"type":"string","enum":["FOLDER","DOCUMENT"]},"role":{"type":"string","enum":["ADMIN","VIEWER","EDITOR","MAINTAINER"]},"url":{"type":"string"},"href":{"type":"string"},"dashboardUrl":{"type":"string"},"versionId":{"type":"string"},"gcsKey":{"type":"string","nullable":true},"artifactCommitSha":{"type":"string","nullable":true},"artifactPath":{"type":"string","nullable":true},"bytes":{"type":"number"},"unchanged":{"type":"boolean","enum":[false,true]}},"required":["id","itemId","title","type","role","url","href","dashboardUrl","versionId","gcsKey","artifactCommitSha","artifactPath","bytes","unchanged"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/str-replace":{"post":{"operationId":"kb_str-replace","summary":"Surgical exact-match HTML edit.","description":"Surgical exact-match HTML edit.","tags":["kb"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"itemId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"oldString":{"type":"string","minLength":1},"newString":{"type":"string"},"replaceAll":{"type":"boolean"},"expectedReplacements":{"type":"integer","minimum":0,"exclusiveMinimum":true}},"required":["itemId","oldString","newString"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"itemId":{"type":"string"},"title":{"type":"string"},"type":{"type":"string","enum":["FOLDER","DOCUMENT"]},"role":{"type":"string","enum":["ADMIN","VIEWER","EDITOR","MAINTAINER"]},"url":{"type":"string"},"href":{"type":"string"},"dashboardUrl":{"type":"string"},"versionId":{"type":"string"},"previousVersionId":{"type":"string"},"gcsKey":{"type":"string","nullable":true},"artifactCommitSha":{"type":"string","nullable":true},"artifactPath":{"type":"string","nullable":true},"bytes":{"type":"number"},"unchanged":{"type":"boolean","enum":[false,true]},"matches":{"type":"number"},"replacements":{"type":"number"}},"required":["id","itemId","title","type","role","url","href","dashboardUrl","versionId","previousVersionId","gcsKey","artifactCommitSha","artifactPath","bytes","unchanged","matches","replacements"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/create":{"post":{"operationId":"kb_create","summary":"Create a document or folder.","description":"Create a document or folder.","tags":["kb"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"itemType":{"type":"string","enum":["FOLDER","DOCUMENT"],"default":"DOCUMENT"},"html":{"type":"string"},"parentId":{"type":"string","nullable":true,"pattern":"^[0-9a-fA-F]{24}$"},"tags":{"type":"array","items":{"type":"string"}}},"required":["title"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"item":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"type":{"type":"string","enum":["FOLDER","DOCUMENT"]},"parentId":{"type":"string","nullable":true},"depth":{"type":"number"},"tags":{"type":"array","items":{"type":"string"}},"latestVersionId":{"type":"string","nullable":true},"isDeleted":{"type":"boolean","enum":[false,true]},"role":{"type":"string","enum":["ADMIN","VIEWER","EDITOR","MAINTAINER"]},"url":{"type":"string"},"href":{"type":"string"},"dashboardUrl":{"type":"string"},"updatedAt":{"type":"string"},"syncConnectionId":{"type":"string","nullable":true},"syncProvider":{"type":"string","enum":["GOOGLE_DRIVE","GRANOLA","WEB","YOUTUBE","NOTION","CONFLUENCE","SALESFORCE","DOCUMENT360","ONEDRIVE","SHAREPOINT","GITHUB"],"nullable":true},"syncStatus":{"type":"string","enum":["SYNCING","SYNCED","ERROR"],"nullable":true},"syncExternalUrl":{"type":"string","nullable":true},"syncedAt":{"type":"string","nullable":true},"syncErrorMessage":{"type":"string","nullable":true},"syncContentMode":{"type":"string","nullable":true},"source":{"type":"string","enum":["course"],"nullable":true},"sourcePath":{"type":"string","nullable":true},"readOnly":{"type":"boolean","enum":[false,true]}},"required":["id","title","type","parentId","depth","tags","latestVersionId","isDeleted","role","url","href","dashboardUrl","updatedAt","syncProvider","syncStatus","syncExternalUrl","syncedAt","syncErrorMessage","syncContentMode","source","sourcePath","readOnly"]}},"required":["item"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/update":{"post":{"operationId":"kb_update","summary":"Rename and/or retag an item.","description":"Rename and/or retag an item.","tags":["kb"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"itemId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"title":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}}},"required":["itemId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"item":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"type":{"type":"string","enum":["FOLDER","DOCUMENT"]},"parentId":{"type":"string","nullable":true},"depth":{"type":"number"},"tags":{"type":"array","items":{"type":"string"}},"latestVersionId":{"type":"string","nullable":true},"isDeleted":{"type":"boolean","enum":[false,true]},"role":{"type":"string","enum":["ADMIN","VIEWER","EDITOR","MAINTAINER"]},"url":{"type":"string"},"href":{"type":"string"},"dashboardUrl":{"type":"string"},"updatedAt":{"type":"string"},"syncConnectionId":{"type":"string","nullable":true},"syncProvider":{"type":"string","enum":["GOOGLE_DRIVE","GRANOLA","WEB","YOUTUBE","NOTION","CONFLUENCE","SALESFORCE","DOCUMENT360","ONEDRIVE","SHAREPOINT","GITHUB"],"nullable":true},"syncStatus":{"type":"string","enum":["SYNCING","SYNCED","ERROR"],"nullable":true},"syncExternalUrl":{"type":"string","nullable":true},"syncedAt":{"type":"string","nullable":true},"syncErrorMessage":{"type":"string","nullable":true},"syncContentMode":{"type":"string","nullable":true},"source":{"type":"string","enum":["course"],"nullable":true},"sourcePath":{"type":"string","nullable":true},"readOnly":{"type":"boolean","enum":[false,true]}},"required":["id","title","type","parentId","depth","tags","latestVersionId","isDeleted","role","url","href","dashboardUrl","updatedAt","syncProvider","syncStatus","syncExternalUrl","syncedAt","syncErrorMessage","syncContentMode","source","sourcePath","readOnly"]}},"required":["item"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/move":{"post":{"operationId":"kb_move","summary":"Move an item under a folder (or to root).","description":"Move an item under a folder (or to root).","tags":["kb"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"itemId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"parentId":{"type":"string","nullable":true,"pattern":"^[0-9a-fA-F]{24}$"}},"required":["itemId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"item":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"type":{"type":"string","enum":["FOLDER","DOCUMENT"]},"parentId":{"type":"string","nullable":true},"depth":{"type":"number"},"tags":{"type":"array","items":{"type":"string"}},"latestVersionId":{"type":"string","nullable":true},"isDeleted":{"type":"boolean","enum":[false,true]},"role":{"type":"string","enum":["ADMIN","VIEWER","EDITOR","MAINTAINER"]},"url":{"type":"string"},"href":{"type":"string"},"dashboardUrl":{"type":"string"},"updatedAt":{"type":"string"},"syncConnectionId":{"type":"string","nullable":true},"syncProvider":{"type":"string","enum":["GOOGLE_DRIVE","GRANOLA","WEB","YOUTUBE","NOTION","CONFLUENCE","SALESFORCE","DOCUMENT360","ONEDRIVE","SHAREPOINT","GITHUB"],"nullable":true},"syncStatus":{"type":"string","enum":["SYNCING","SYNCED","ERROR"],"nullable":true},"syncExternalUrl":{"type":"string","nullable":true},"syncedAt":{"type":"string","nullable":true},"syncErrorMessage":{"type":"string","nullable":true},"syncContentMode":{"type":"string","nullable":true},"source":{"type":"string","enum":["course"],"nullable":true},"sourcePath":{"type":"string","nullable":true},"readOnly":{"type":"boolean","enum":[false,true]}},"required":["id","title","type","parentId","depth","tags","latestVersionId","isDeleted","role","url","href","dashboardUrl","updatedAt","syncProvider","syncStatus","syncExternalUrl","syncedAt","syncErrorMessage","syncContentMode","source","sourcePath","readOnly"]}},"required":["item"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/delete":{"post":{"operationId":"kb_delete","summary":"Soft-delete (or permanently delete) an item.","description":"Soft-delete (or permanently delete) an item.","tags":["kb"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"itemId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"permanent":{"type":"boolean"}},"required":["itemId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"deleted":{"type":"number"}},"required":["deleted"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/restore":{"post":{"operationId":"kb_restore","summary":"Restore a soft-deleted item.","description":"Restore a soft-deleted item.","tags":["kb"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"itemId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["itemId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"restored":{"type":"number"}},"required":["restored"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/restore-version":{"post":{"operationId":"kb_restore-version","summary":"Restore a historical revision as a new current version.","description":"Restore a historical revision as a new current version.","tags":["kb"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"itemId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"versionId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["itemId","versionId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"itemId":{"type":"string"},"title":{"type":"string"},"type":{"type":"string","enum":["FOLDER","DOCUMENT"]},"role":{"type":"string","enum":["ADMIN","VIEWER","EDITOR","MAINTAINER"]},"url":{"type":"string"},"href":{"type":"string"},"dashboardUrl":{"type":"string"},"versionId":{"type":"string"}},"required":["id","itemId","title","type","role","url","href","dashboardUrl","versionId"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/artifact-create-branch":{"post":{"operationId":"kb_artifact-create-branch","summary":"Create an isolated Git draft/agent/review branch.","description":"Create an isolated Git draft/agent/review branch.","tags":["kb"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"itemId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"branch":{"type":"string"}},"required":["itemId","branch"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"itemId":{"type":"string"},"branchId":{"type":"string"},"branch":{"type":"string"},"fromCommitSha":{"type":"string","nullable":true},"expiresAt":{"type":"string","nullable":true}},"required":["itemId","branchId","branch","fromCommitSha","expiresAt"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/artifact-write-file":{"post":{"operationId":"kb_artifact-write-file","summary":"Commit one UTF-8 file to an ACL-scoped branch.","description":"Commit one UTF-8 file to an ACL-scoped branch.","tags":["kb"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"branchId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"path":{"type":"string"},"content":{"type":"string"},"reason":{"type":"string","maxLength":500}},"required":["branchId","path","content"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"branchId":{"type":"string"},"branch":{"type":"string"},"commitSha":{"type":"string"},"path":{"type":"string"}},"required":["branchId","branch","commitSha","path"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/artifact-merge":{"post":{"operationId":"kb_artifact-merge","summary":"Merge an ACL-scoped branch into canonical main.","description":"Merge an ACL-scoped branch into canonical main.","tags":["kb"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"branchId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"reason":{"type":"string","maxLength":500}},"required":["branchId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"branchId":{"type":"string"},"branch":{"type":"string"},"commitSha":{"type":"string"},"changedItems":{"type":"array","items":{"type":"string"}}},"required":["branchId","branch","commitSha","changedItems"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/artifact-move":{"post":{"operationId":"kb_artifact-move","summary":"Move an item on an ACL-scoped branch.","description":"Move an item on an ACL-scoped branch.","tags":["kb"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"branchId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"itemId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"parentId":{"type":"string","nullable":true,"pattern":"^[0-9a-fA-F]{24}$"},"reason":{"type":"string","maxLength":500}},"required":["branchId","itemId","parentId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"branchId":{"type":"string"},"branch":{"type":"string"},"commitSha":{"type":"string"},"itemId":{"type":"string"},"path":{"type":"string"}},"required":["branchId","branch","commitSha","itemId","path"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/artifact-delete":{"post":{"operationId":"kb_artifact-delete","summary":"Delete an item on an ACL-scoped branch.","description":"Delete an item on an ACL-scoped branch.","tags":["kb"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"branchId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"itemId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"reason":{"type":"string","maxLength":500}},"required":["branchId","itemId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"branchId":{"type":"string"},"branch":{"type":"string"},"commitSha":{"type":"string"},"deletedItemIds":{"type":"array","items":{"type":"string"}}},"required":["branchId","branch","commitSha","deletedItemIds"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/share":{"post":{"operationId":"kb_share","summary":"Grant a permission on an item.","description":"Grant a permission on an item.","tags":["kb"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"itemId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"principalType":{"type":"string","enum":["WORKSPACE","GROUP","USER","API_KEY"]},"role":{"type":"string","enum":["VIEWER","EDITOR","MAINTAINER","ADMIN"]},"userId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"groupId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"integrationKeyId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["itemId","principalType","role"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"grant":{"type":"object","properties":{"id":{"type":"string"},"workspaceId":{"type":"string"},"userId":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"groupId":{"type":"string","nullable":true},"itemId":{"type":"string"},"principalType":{"type":"string","enum":["WORKSPACE","GROUP","USER","API_KEY"]},"role":{"type":"string","enum":["ADMIN","VIEWER","EDITOR","MAINTAINER"]},"integrationKeyId":{"type":"string","nullable":true},"grantedById":{"type":"string","nullable":true}},"required":["id","workspaceId","userId","createdAt","updatedAt","groupId","itemId","principalType","role","integrationKeyId","grantedById"]},"url":{"type":"string"},"href":{"type":"string"},"dashboardUrl":{"type":"string"},"itemId":{"type":"string"}},"required":["grant","url","href","dashboardUrl","itemId"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/revoke-share":{"post":{"operationId":"kb_revoke-share","summary":"Revoke a permission grant.","description":"Revoke a permission grant.","tags":["kb"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"itemId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"grantId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["itemId","grantId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"ok":{"type":"boolean","enum":[false,true]},"url":{"type":"string"},"href":{"type":"string"},"dashboardUrl":{"type":"string"},"itemId":{"type":"string"}},"required":["ok","url","href","dashboardUrl","itemId"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/upload-image":{"post":{"operationId":"kb_upload-image","summary":"Upload an image (base64) and get an embeddable public URL.","description":"Upload an image (base64) and get an embeddable public URL.","tags":["kb"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"itemId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"imageContentType":{"type":"string"},"imageBase64":{"type":"string"},"imageFilename":{"type":"string","maxLength":200}},"required":["itemId","imageContentType","imageBase64"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"imageId":{"type":"string"},"gcsPath":{"type":"string"},"publicUrl":{"type":"string"},"contentType":{"type":"string"},"sizeBytes":{"type":"number"},"description":{"type":"string"},"artifactCommitSha":{"type":"string","nullable":true},"artifactPath":{"type":"string","nullable":true}},"required":["imageId","gcsPath","publicUrl","contentType","sizeBytes","description"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/sign-image-upload":{"post":{"operationId":"kb_sign-image-upload","summary":"Get a presigned PUT URL for a client-side image upload.","description":"Get a presigned PUT URL for a client-side image upload.","tags":["kb"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"itemId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"imageContentType":{"type":"string"},"imageFilename":{"type":"string","maxLength":200},"imageSizeBytes":{"type":"integer","minimum":0}},"required":["itemId","imageContentType"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"imageId":{"type":"string"},"gcsPath":{"type":"string"},"uploadUrl":{"type":"string"},"expiresAt":{"type":"string"},"publicUrl":{"type":"string"},"contentType":{"type":"string"}},"required":["imageId","gcsPath","uploadUrl","expiresAt","publicUrl","contentType"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/confirm-image-upload":{"post":{"operationId":"kb_confirm-image-upload","summary":"Finalize a presigned image PUT (downloads bytes + indexes).","description":"Finalize a presigned image PUT (downloads bytes + indexes).","tags":["kb"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"itemId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"imageId":{"type":"string"},"imageContentType":{"type":"string"}},"required":["itemId","imageId","imageContentType"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"imageId":{"type":"string"},"gcsPath":{"type":"string"},"publicUrl":{"type":"string"},"contentType":{"type":"string"},"sizeBytes":{"type":"number"},"description":{"type":"string"},"artifactCommitSha":{"type":"string","nullable":true},"artifactPath":{"type":"string","nullable":true}},"required":["imageId","gcsPath","publicUrl","contentType","sizeBytes","description"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/public-link-enable":{"post":{"operationId":"kb_public-link-enable","summary":"Publish a document's public /p/{slug} link.","description":"Publish a document's public /p/{slug} link.","tags":["kb"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"itemId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["itemId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"link":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"url":{"type":"string","nullable":true},"enabledAt":{"type":"string","nullable":true},"enabledById":{"type":"string","nullable":true}},"required":["slug","path","url","enabledAt","enabledById"]}},"required":["link"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/kb/public-link-disable":{"post":{"operationId":"kb_public-link-disable","summary":"Disable a document's public link.","description":"Disable a document's public link.","tags":["kb"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"itemId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"}},"required":["itemId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"link":{"type":"object","properties":{"slug":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"url":{"type":"string","nullable":true},"enabledAt":{"type":"string","nullable":true},"enabledById":{"type":"string","nullable":true}},"required":["slug","path","url","enabledAt","enabledById"]}},"required":["link"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/workspace-assistant/run":{"post":{"operationId":"workspace-assistant_run","summary":"Run a bash script in the Workspace Assistant sandbox.","description":"Same just-bash environment, fetch-*/do-* commands, and /skills/*.md as the in-app assistant. Pass sessionId to persist /data across calls.","tags":["workspace-assistant"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"script":{"type":"string","minLength":1},"sessionId":{"type":"string"}},"required":["script"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"sessionId":{"type":"string","nullable":true},"exitCode":{"type":"number"},"stdout":{"type":"string"},"stderr":{"type":"string"},"navigateIntents":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["navigate"]},"href":{"type":"string"},"label":{"type":"string"}},"required":["kind","href","label"]}},"dataFiles":{"type":"array","items":{"type":"string"}},"snapshotReport":{"type":"string"},"dataSnapshotMaxBytes":{"type":"number"}},"required":["sessionId","exitCode","stdout","stderr","navigateIntents","dataFiles","snapshotReport","dataSnapshotMaxBytes"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/course-editor/run":{"post":{"operationId":"course-editor_run","summary":"Run a bash script against a course revision filesystem.","description":"Run a bash script against a course revision filesystem.","tags":["course-editor"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"courseId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"script":{"type":"string","minLength":1},"sessionId":{"type":"string"}},"required":["courseId","script"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"text":{"type":"string"},"isError":{"type":"boolean","enum":[false,true]}},"required":["text"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/courses/view-image":{"post":{"operationId":"courses_view-image","summary":"Fetch a course image asset as base64 + metadata.","description":"Fetch a course image asset as base64 + metadata.","tags":["courses"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"courseId":{"type":"string","pattern":"^[0-9a-fA-F]{24}$"},"target":{"type":"string","minLength":1}},"required":["courseId","target"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"role":{"type":"string","enum":["thumbnail","slide-image","panel-image","cover-image","audio","generated-audio","music","video","generated-video","character-portrait","scene-image","reference-image","walkthrough-frame","read-inline-image","read-inline-video","item-media","brand-logo","lecture-outline","lecture-pdf","comic-outline","podcast-script","podcast-cover","jam-cover","jam-lyrics","video-script","video-transcript","video-thumbnail","explainer-source-media","chat-context"]},"path":{"type":"string"},"assetId":{"type":"string"},"mediaType":{"type":"string"},"bytes":{"type":"number"},"base64":{"type":"string"}},"required":["role","path","assetId","mediaType","bytes","base64"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/agents/run":{"post":{"operationId":"agents_run","summary":"Run an Agent with JSON and uploaded files.","description":"Returns runId immediately. Poll agents.run-get for the validated JSON output and file IDs. Uses the selected Agent's capabilities. Idempotency-Key avoids duplicate runs.","tags":["agents"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agentId":{"type":"string","pattern":"^[a-f0-9]{24}$"},"input":{"nullable":true},"files":{"type":"object","additionalProperties":{"type":"string","pattern":"^[a-f0-9]{24}$"},"default":{}},"mode":{"type":"string","enum":["PREVIEW","LIVE"],"default":"LIVE"}},"required":["agentId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"runId":{"type":"string"},"agentRunId":{"type":"string","nullable":true},"agentId":{"type":"string"},"status":{"type":"string"},"mode":{"type":"string"},"createdAt":{"type":"string"},"completedAt":{"type":"string","nullable":true},"input":{"description":"Arbitrary JSON value."},"output":{"description":"Arbitrary JSON value."},"summary":{"type":"string","nullable":true},"errorMessage":{"type":"string","nullable":true},"files":{"type":"object","additionalProperties":{"type":"object","properties":{"fileId":{"type":"string"},"filename":{"type":"string"},"mimeType":{"type":"string"},"size":{"type":"number"},"url":{"type":"string"},"expiresAt":{"type":"string"}},"required":["fileId","filename","mimeType","size"]}},"evaluation":{"description":"Arbitrary JSON value."},"evaluationScore":{"description":"Arbitrary JSON value."}},"required":["runId","agentId","status","mode","createdAt","completedAt","input","output","summary","errorMessage","files","evaluation","evaluationScore"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/agents/run-get":{"post":{"operationId":"agents_run-get","summary":"Read an Agent run and its results.","description":"Read an Agent run and its results.","tags":["agents"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"runId":{"type":"string","pattern":"^[a-f0-9]{24}$"}},"required":["runId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"runId":{"type":"string"},"agentRunId":{"type":"string","nullable":true},"agentId":{"type":"string"},"status":{"type":"string"},"mode":{"type":"string"},"createdAt":{"type":"string"},"completedAt":{"type":"string","nullable":true},"input":{"description":"Arbitrary JSON value."},"output":{"description":"Arbitrary JSON value."},"summary":{"type":"string","nullable":true},"errorMessage":{"type":"string","nullable":true},"files":{"type":"object","additionalProperties":{"type":"object","properties":{"fileId":{"type":"string"},"filename":{"type":"string"},"mimeType":{"type":"string"},"size":{"type":"number"},"url":{"type":"string"},"expiresAt":{"type":"string"}},"required":["fileId","filename","mimeType","size"]}},"evaluation":{"description":"Arbitrary JSON value."},"evaluationScore":{"description":"Arbitrary JSON value."}},"required":["runId","agentId","status","mode","createdAt","completedAt","input","output","summary","errorMessage","files","evaluation","evaluationScore"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/agents/run-cancel":{"post":{"operationId":"agents_run-cancel","summary":"Cancel an Agent run.","description":"Cancel an Agent run.","tags":["agents"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"runId":{"type":"string","pattern":"^[a-f0-9]{24}$"}},"required":["runId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"runId":{"type":"string"},"agentRunId":{"type":"string","nullable":true},"agentId":{"type":"string"},"status":{"type":"string"},"mode":{"type":"string"},"createdAt":{"type":"string"},"completedAt":{"type":"string","nullable":true},"input":{"description":"Arbitrary JSON value."},"output":{"description":"Arbitrary JSON value."},"summary":{"type":"string","nullable":true},"errorMessage":{"type":"string","nullable":true},"files":{"type":"object","additionalProperties":{"type":"object","properties":{"fileId":{"type":"string"},"filename":{"type":"string"},"mimeType":{"type":"string"},"size":{"type":"number"},"url":{"type":"string"},"expiresAt":{"type":"string"}},"required":["fileId","filename","mimeType","size"]}},"evaluation":{"description":"Arbitrary JSON value."},"evaluationScore":{"description":"Arbitrary JSON value."}},"required":["runId","agentId","status","mode","createdAt","completedAt","input","output","summary","errorMessage","files","evaluation","evaluationScore"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/agents/file-upload":{"post":{"operationId":"agents_file-upload","summary":"Get a signed PUT URL for an Agent input file.","description":"Get a signed PUT URL for an Agent input file.","tags":["agents"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agentId":{"type":"string","pattern":"^[a-f0-9]{24}$"},"filename":{"type":"string","minLength":1,"maxLength":200},"mimeType":{"type":"string","maxLength":150},"size":{"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":26214400}},"required":["agentId","filename","mimeType","size"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"fileId":{"type":"string"},"uploadUrl":{"type":"string"},"expiresAt":{"type":"string"}},"required":["fileId","uploadUrl","expiresAt"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/agents/file-complete":{"post":{"operationId":"agents_file-complete","summary":"Validate and seal an uploaded Agent file.","description":"Validate and seal an uploaded Agent file.","tags":["agents"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409."},"required":false,"description":"Unique retry key. Reusing it with the same body replays the original successful response; different input returns 409.","name":"Idempotency-Key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"fileId":{"type":"string","pattern":"^[a-f0-9]{24}$"}},"required":["fileId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"fileId":{"type":"string"},"ready":{"type":"boolean","enum":[false,true]}},"required":["fileId","ready"]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency key is reused, in progress, or belongs to a failed request.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/agents/file-download":{"post":{"operationId":"agents_file-download","summary":"Get a short-lived download URL for an Agent file.","description":"Get a short-lived download URL for an Agent file.","tags":["agents"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"fileId":{"type":"string","pattern":"^[a-f0-9]{24}$"}},"required":["fileId"]}}}},"responses":{"200":{"description":"Command result.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"anyOf":[{"type":"object","properties":{"url":{"type":"string"},"expiresAt":{"type":"string"},"fileId":{"type":"string"},"filename":{"type":"string"}},"required":["url","expiresAt","fileId","filename"]},{"type":"object","properties":{"fileId":{"type":"string"},"filename":{"type":"string"},"url":{"type":"string"}},"required":["fileId","filename","url"]}]}},"required":["success","data"]}}}},"400":{"description":"Malformed JSON request body.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid Connector credentials.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Connector policy does not permit this command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown command.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Input validation error.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Request quota exhausted. Wait for Retry-After seconds before retrying, with jitter. Reuse Idempotency-Key for mutations.","headers":{"RateLimit":{"description":"Current quota: policy name, remaining requests (r), seconds until reset (t).","schema":{"type":"string","example":"\"connector-api\";r=599;t=42"}},"RateLimit-Policy":{"description":"Quota policy: requests per window (q), window length in seconds (w). Authenticated calls share 600 requests per 60 seconds per Connector; unauthenticated calls have 60 per 60 seconds per client IP.","schema":{"type":"string","example":"\"connector-api\";q=600;w=60"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed per window.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Compatibility field: seconds until reset, not a Unix timestamp.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Minimum seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"externalDocs":{"description":"Honen documentation","url":"https://honen.com/docs"}}