{"openapi":"3.0.0","info":{"title":"Purple Suite Manager Experience API","description":"Source system for the Manager Hub plugins: a manager's Teams chats/channels, Outlook mail, Jira sprint health & issues, Workday learning & certifications, SAP SuccessFactors certifications, and ServiceNow HR profile/org lookups for their direct reports. The data layer (chats, messages, issues, enrollments, certifications) is Purple-native CRUD+OData; the contract layer reproduces each real vendor's exact wire format so an agent built against Manager Experience works unchanged against the live vendor.\n\n---\n\n**Acting as a user (`X-PS-Impersonate-User`).** Every endpoint accepts an optional `X-PS-Impersonate-User` request header whose value is the email of the instance user to act as. The effective user resolves in this order: the header if present, else the instance's configured default MCP user, else none. User-scoped paths additionally accept the literal `me` in place of an email, and Graph-style apps also serve `/me/…` twins of their `/users/{email}/…` paths that resolve the same way. This header is honored by all operations but is intentionally omitted from each operation's parameter list so it is not surfaced as a per-tool argument by MCP clients; see the `ImpersonateUser` entry under `components.parameters`.","version":"1.0.0"},"servers":[{"url":"https://marketplace.moveworks.com/api/purple-suite/manager-experience"}],"security":[{"patAuth":[]}],"components":{"securitySchemes":{"patAuth":{"type":"http","scheme":"bearer"}},"parameters":{"InstanceId":{"in":"header","name":"X-Instance-ID","required":true,"schema":{"type":"string"}},"ImpersonateUser":{"in":"header","name":"X-PS-Impersonate-User","required":false,"schema":{"type":"string","format":"email"},"description":"Optional. Act as a specific user in the target instance — the value is that user's email (must exist in the instance). Resolution order for the effective user: (1) this header, if set; (2) the instance's configured default MCP user; (3) otherwise no user is bound. User-scoped paths (e.g. /users/{email}/…) also accept the literal \"me\", and Graph-style apps serve /me/… twins of those paths (Graph: /me ≡ /users/{signed-in-user}) — both resolve to whatever this header (or the default MCP user) points at. An explicit path email always wins over the header. The unified MCP server does not send this header — it relies on the per-instance default — so it is primarily for direct REST/HTTP callers."}},"schemas":{"TeamMembership":{"type":"object","description":"MEA-local team overlay. When present, the ServiceNow/Workday/SFSF directReports+reportees endpoints derive the manager→reports relationship from these rows instead of the shared roster's roster-wide `managerEmail` — so this app can present 2 realistic-sized teams even though the shared roster's random assignments would give sparser results. Not read by other Purple Suite apps.","properties":{"id":{"type":"string","readOnly":true,"example":"TEAM-A"},"team_name":{"type":"string","example":"Engineering"},"manager_email":{"type":"string","format":"email"},"depth":{"type":"integer","description":"The manager's level from the org root (root = 1). Backs manager_context /resolve depth.","example":3},"member_emails":{"type":"array","description":"Direct reports of this manager.","items":{"type":"string","format":"email"}},"skip_level_emails":{"type":"array","description":"Skip-level reports (report to this manager's direct reports).","items":{"type":"string","format":"email"}},"secondary_member_emails":{"type":"array","description":"Secondary / dotted-line reports for whom this manager is the secondary manager.","items":{"type":"string","format":"email"}},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"Chat":{"type":"object","properties":{"id":{"type":"string","readOnly":true,"example":"CHAT-0001"},"chatType":{"type":"string","enum":["oneOnOne","group"],"example":"oneOnOne"},"topic":{"type":"string","nullable":true,"example":"Q3 roadmap sync"},"member_emails":{"type":"array","items":{"type":"string","format":"email"},"example":["alice.smith0@acme.com","bob.jones1@acme.com"]},"createdDateTime":{"type":"string","format":"date-time"},"lastUpdatedDateTime":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"ChatMessage":{"type":"object","properties":{"id":{"type":"string","readOnly":true,"example":"CMSG-0001"},"chat_id":{"type":"string","example":"CHAT-0001"},"from_email":{"type":"string","format":"email"},"from_name":{"type":"string"},"body_content":{"type":"string"},"body_content_type":{"type":"string","enum":["text","html"],"example":"text"},"createdDateTime":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"Team":{"type":"object","properties":{"id":{"type":"string","readOnly":true,"example":"TEAM-0001"},"displayName":{"type":"string","example":"Engineering"},"description":{"type":"string","nullable":true},"member_emails":{"type":"array","items":{"type":"string","format":"email"}},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"Channel":{"type":"object","properties":{"id":{"type":"string","readOnly":true,"example":"CHAN-0001"},"team_id":{"type":"string","example":"TEAM-0001"},"displayName":{"type":"string","example":"General"},"description":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"ChannelMessage":{"type":"object","properties":{"id":{"type":"string","readOnly":true,"example":"CHMSG-0001"},"team_id":{"type":"string"},"channel_id":{"type":"string"},"from_email":{"type":"string","format":"email"},"from_name":{"type":"string"},"body_content":{"type":"string"},"body_content_type":{"type":"string","enum":["text","html"]},"createdDateTime":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"MailMessage":{"type":"object","properties":{"id":{"type":"string","readOnly":true,"example":"MAIL-0001"},"owner_email":{"type":"string","format":"email","description":"Mailbox owner (the caller of GET /v1.0/me/messages)."},"from_email":{"type":"string","format":"email"},"from_name":{"type":"string"},"to_emails":{"type":"array","items":{"type":"string","format":"email"}},"subject":{"type":"string"},"body_content":{"type":"string"},"body_content_type":{"type":"string","enum":["text","html"]},"importance":{"type":"string","enum":["low","normal","high"],"default":"normal"},"receivedDateTime":{"type":"string","format":"date-time"},"isRead":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"JiraProject":{"type":"object","properties":{"id":{"type":"string","readOnly":true,"example":"JPROJ-0001"},"key":{"type":"string","example":"ENG"},"name":{"type":"string","example":"Engineering"},"lead_email":{"type":"string","format":"email"},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"JiraSprint":{"type":"object","properties":{"id":{"type":"string","readOnly":true,"example":"SPR-0001"},"name":{"type":"string","example":"Sprint 24"},"state":{"type":"string","enum":["active","closed","future"]},"project_key":{"type":"string","example":"ENG"},"startDate":{"type":"string","format":"date"},"endDate":{"type":"string","format":"date"},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"JiraIssue":{"type":"object","description":"Data-layer storage shape. The /rest/api/3/search/jql contract response re-shapes this into real Jira issue JSON (fields.customfield_10020 for sprint, fields.assignee without emailAddress, etc.) — see contract.ts.","properties":{"id":{"type":"string","readOnly":true,"example":"JISS-0001"},"key":{"type":"string","example":"ENG-142"},"project_key":{"type":"string","example":"ENG"},"project_name":{"type":"string","example":"Engineering"},"sprint_id":{"type":"string","nullable":true,"example":"SPR-0001"},"summary":{"type":"string"},"status":{"type":"string","enum":["To Do","In Progress","Done"]},"assignee":{"type":"string","format":"email","nullable":true,"description":"Internal only — the real Jira response omits assignee email (privacy masking)."},"assignee_display_name":{"type":"string","nullable":true},"issuetype":{"type":"string","enum":["Story","Bug","Task"]},"priority":{"type":"string","enum":["Highest","High","Medium","Low"]},"duedate":{"type":"string","format":"date","nullable":true},"labels":{"type":"array","items":{"type":"string"},"example":["backend"]},"updated":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"Story":{"type":"object","description":"Data-layer storage shape for a ServiceNow Agile Development (rm_story) record. The /api/now/table/rm_story contract response re-shapes this into the real captured field set — reference fields (assigned_to, assignment_group) as {display_value, link}, and sprint fields dot-walked as flat literal keys (sprint.start_date, sprint.committed_points, …), matching this app's existing sys_user org-chain convention — see contract.ts.","properties":{"id":{"type":"string","readOnly":true,"example":"STORY-0001"},"number":{"type":"string","example":"STRY0010021"},"short_description":{"type":"string"},"description":{"type":"string"},"acceptance_criteria":{"type":"string"},"assigned_to":{"type":"string","format":"email","description":"Internal only — the contract response resolves this to the real Table API {display_value, link} reference shape."},"assignment_group":{"type":"string","example":"Engineering"},"state_id":{"type":"string","enum":["1","2","3","4"],"description":"Raw rm_story choice-list value the real sysparm_query filters on (1=Draft, 2=Work in Progress, 3=Complete, 4=Cancelled)."},"state":{"type":"string","example":"Work in Progress"},"blocked":{"type":"boolean","example":false,"description":"Whether the story is currently blocked (e.g. waiting on a dependency). stories-only, not on Defect."},"blocked_reason":{"type":"string","nullable":true,"example":null,"description":"Why the story is blocked. null when blocked is false. stories-only, not on Defect."},"priority":{"type":"string","example":"2 - High"},"story_points":{"type":"number","example":8},"end_date":{"type":"string","format":"date"},"project":{"type":"string","nullable":true,"description":"Internal only — the SPM (pm_project) project this story rolls up to. The contract response resolves this to a {display_value, link} reference, matching assigned_to/assignment_group's convention."},"epic":{"type":"string","nullable":true},"sprint_name":{"type":"string","nullable":true},"sprint_start_date":{"type":"string","format":"date","nullable":true},"sprint_end_date":{"type":"string","format":"date","nullable":true},"sprint_committed_points":{"type":"number","nullable":true},"sprint_story_points":{"type":"number","nullable":true},"sprint_actual_points":{"type":"number","nullable":true},"sys_updated_on":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"Defect":{"type":"object","description":"Data-layer storage shape for a ServiceNow Agile Development (rm_defect) record. The /api/now/table/rm_defect contract response re-shapes this the same way as Story — see contract.ts.","properties":{"id":{"type":"string","readOnly":true,"example":"DEFECT-0001"},"number":{"type":"string","example":"DFCT0010041"},"short_description":{"type":"string"},"description":{"type":"string"},"assigned_to":{"type":"string","format":"email","description":"Internal only — see Story.assigned_to."},"assignment_group":{"type":"string","example":"Engineering"},"state_id":{"type":"string","enum":["1","2","3","4","7"],"description":"Raw rm_defect choice-list value (1=Draft, 2=Work in Progress, 3=Complete, 4=Cancelled, 7=Deferred — defects carry this extra terminal state stories don't)."},"state":{"type":"string","example":"Work in Progress"},"priority":{"type":"string","example":"1 - Critical"},"end_date":{"type":"string","format":"date"},"sprint_name":{"type":"string","nullable":true},"sprint_start_date":{"type":"string","format":"date","nullable":true},"sprint_end_date":{"type":"string","format":"date","nullable":true},"sprint_committed_points":{"type":"number","nullable":true},"sys_updated_on":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"ResourceAllocation":{"type":"object","description":"Data-layer storage shape for one ServiceNow SPM resource_aggregate_weekly stats bucket (Servicenow_Get_Team_Project_Allocations, plugin Team_Project_Allocations). Every worker has an Availability and a Capacity row (no task); an allocated worker additionally has one Project/Demand Allocated row per active allocation. The /api/now/stats/resource_aggregate_weekly contract response re-shapes this into ServiceNow's real Stats API {stats, groupby_fields} envelope — see contract.ts.","properties":{"id":{"type":"string","readOnly":true,"example":"RALLOC-0001"},"worker_email":{"type":"string","format":"email","description":"Internal only — the contract response resolves this to the groupby 'user' field's display name (full name, not email)."},"category":{"type":"string","enum":["Availability","Capacity","Project Allocated","Demand Allocated"]},"task_number":{"type":"string","nullable":true,"example":"PRJ0010012","description":"The project/demand number. null for Availability/Capacity rows."},"task_short_description":{"type":"string","nullable":true},"task_state":{"type":"string","nullable":true,"example":"Work in Progress"},"task_sys_class_name":{"type":"string","nullable":true,"enum":["Project","Demand"]},"task_percent_complete":{"type":"number","nullable":true,"example":25},"sum_hours":{"type":"number","example":120},"sum_man_days":{"type":"number","example":15},"avg_fte":{"type":"number","example":0.057692},"avg_utilization":{"type":"number","nullable":true,"description":"Only meaningful on the Availability row; null on every other category."},"week_starts_on_min":{"type":"string","format":"date"},"week_starts_on_max":{"type":"string","format":"date"},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"WorkdayLearningEnrollment":{"type":"object","description":"Data-layer storage shape. The WQL contract response projects `contentURL` as `courseURL`, `course` as `Course`, `cf_LearningRegistrationDate` as `LearningRegistrationDate`, and `learningRecord` as `learningRecordlist` (Workday's own custom-report column-alias convention) — see contract.ts.","properties":{"id":{"type":"string","readOnly":true,"example":"WLE-0001"},"worker_email":{"type":"string","format":"email"},"course":{"type":"string","example":"Foundations of People Management"},"contentURL":{"type":"string","nullable":true,"example":"https://learning.example.com/courses/foundations-of-people-management"},"registrationStatus":{"type":"string","enum":["Registered","Waitlisted","Cancelled"]},"completionStatus":{"type":"string","enum":["Not Started","In Progress","Complete"]},"dueDate1":{"type":"string","format":"date"},"requiredLearningEnrollment":{"type":"boolean","nullable":true},"cf_LearningRegistrationDate":{"type":"string","format":"date","nullable":true},"completionDate":{"type":"string","format":"date","nullable":true},"expirationDate":{"type":"string","format":"date","nullable":true},"learningRecord":{"type":"array","nullable":true,"items":{"type":"object","properties":{"retrainingCompletionType":{"type":"string","nullable":true},"learningRecordContentType":{"type":"string","nullable":true}}}},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"WorkdayLearningAssignment":{"type":"object","description":"Data-layer storage shape for a Workday LMS learning *assignment* (what a worker was told to take), distinct from WorkdayLearningEnrollment (what a worker actually registered for). The WQL `indexedLearningAssignmentRecords` contract response projects `contentURL` as `courseURL`, `course` as `Course`, `worker_email`'s workdayID as `workdayID`, and the worker's workdayID + full name as the `learner` reference object — see contract.ts.","properties":{"id":{"type":"string","readOnly":true,"example":"WLA-0001"},"worker_email":{"type":"string","format":"email"},"course":{"type":"string","example":"Workplace Security Fundamentals"},"contentURL":{"type":"string","nullable":true,"example":"https://learning.example.com/courses/workplace-security-fundamentals"},"assignmentStatus":{"type":"string","enum":["Assigned","In Progress","Complete"]},"completionStatus":{"type":"string","nullable":true},"dueDate":{"type":"string","format":"date"},"required":{"type":"boolean","nullable":true},"assignedDate":{"type":"string","format":"date"},"assignedBy":{"type":"string","nullable":true,"example":"Learning Administration"},"overdue":{"type":"boolean","nullable":true},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"WorkdayCertification":{"type":"object","description":"Data-layer storage shape. The WQL contract response re-shapes `certification`/`certification_id` into Workday's real {id,descriptor} reference object — see contract.ts. The real capture has no certificationNumber field; the contract response returns it as null for callers that project it anyway.","properties":{"id":{"type":"string","readOnly":true,"example":"WCERT-0001"},"worker_email":{"type":"string","format":"email"},"certification":{"type":"string","example":"PMP","description":"Short code — becomes the reference object's `descriptor`."},"certification_id":{"type":"string","example":"CERT-PMP","description":"Becomes the reference object's `id`."},"certificationName":{"type":"string","example":"Project Management Professional"},"certifierOrIssuer":{"type":"string","example":"PMI"},"certificationNumber":{"type":"string","nullable":true,"description":"Not in the real Workday entity — always null. Present only so a WQL projection asking for it doesn't fail."},"expirationDate":{"type":"string","format":"date","nullable":true},"examDate":{"type":"string","format":"date","nullable":true},"issuedDate":{"type":"string","format":"date"},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"WorkdayLoa":{"type":"object","description":"Data-layer storage shape for a Workday leave of absence. The Absence Management REST contract response (contract.ts) wraps `worker`/`status_id`+`status`/`leaveType_id`+`leaveType` into Workday's real {id,descriptor} reference objects.","properties":{"id":{"type":"string","readOnly":true,"example":"WLOA-0001"},"worker_email":{"type":"string","format":"email"},"leaveType_id":{"type":"string","example":"MEDICAL_LOA","description":"Becomes the leaveType reference object's `id`."},"leaveType":{"type":"string","example":"Medical Leave of Absence","description":"Becomes the leaveType reference object's `descriptor`."},"status_id":{"type":"string","example":"e2d08afc53614c37b32b31270bb8bee3","description":"Becomes the status reference object's `id`; the In-Progress id the real action filters on."},"status":{"type":"string","example":"In Progress","description":"Becomes the status reference object's `descriptor`."},"businessProcessStepStatus":{"type":"string","example":"In Progress"},"firstDayOfLeave":{"type":"string","format":"date","example":"2026-06-01"},"lastDayOfWork":{"type":"string","format":"date","example":"2026-05-31"},"estimatedLastDayOfLeave":{"type":"string","format":"date","example":"2026-08-30"},"latestLeaveComment":{"type":"string","example":"Medical leave approved; return date is an estimate pending clearance."},"leaveImpactFields":{"type":"object","additionalProperties":{"type":"boolean"},"description":"Flat boolean map (schedulingEffect, absenceAccrualEffect, benefitEffect, payrollEffect, …)."},"additionalFields":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"descriptor":{"type":"string"},"name":{"type":"string"}}}},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"WorkdayTimeOff":{"type":"object","description":"Data-layer storage shape for a Workday time-off (PTO) entry. The Absence Management REST contract response (contract.ts) wraps `worker`/`status_id`+`status`/`timeOffType_id`+`timeOffType` into Workday's real {id,descriptor} reference objects.","properties":{"id":{"type":"string","readOnly":true,"example":"PTO-0001"},"worker_email":{"type":"string","format":"email"},"date":{"type":"string","format":"date","example":"2026-08-10"},"quantity":{"type":"number","example":8},"unitOfTime":{"type":"string","example":"HOURS"},"timeOffType_id":{"type":"string","example":"VACATION","description":"Becomes the timeOffType reference object's `id`."},"timeOffType":{"type":"string","example":"Vacation","description":"Becomes the timeOffType reference object's `descriptor`."},"status_id":{"type":"string","example":"APPROVED","description":"Becomes the status reference object's `id`."},"status":{"type":"string","example":"Approved","description":"Becomes the status reference object's `descriptor`; either 'Approved' or 'Submitted'."},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"SfsfCertification":{"type":"object","description":"Data-layer storage shape, field names matching the real Background_Certificates OData entity (licenseName/institution/licenseNumber — not certification/issuingOrg/certificationNumber).","properties":{"id":{"type":"string","readOnly":true,"example":"SFCERT-0001"},"worker_email":{"type":"string","format":"email"},"backgroundElementId":{"type":"integer","example":90000},"name":{"type":"string","example":"Certified ScrumMaster"},"description":{"type":"string"},"licenseName":{"type":"string","example":"Certified ScrumMaster"},"institution":{"type":"string","example":"Scrum Alliance"},"licenseNumber":{"type":"string","example":"CSM-5000"},"licenseCountry":{"type":"string","example":"USA"},"licenseState":{"type":"string"},"bgOrderPos":{"type":"string","example":"1"},"lastModifiedDate":{"type":"string","format":"date"},"startDate":{"type":"string","format":"date"},"endDate":{"type":"string","format":"date","nullable":true},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"HrProfileOverride":{"type":"object","description":"MEA-local overlay for the sn_hr_core_profile contract, seeded with one row per roster member (default date_of_birth = employment_start_date - 28y, employment_start_date = the roster's startDate) when the instance is created. Edit a row's date_of_birth/employment_start_date (e.g. via export → edit → import) to pin a specific birthday/anniversary for an eval — sn_hr_core_profile returns whatever is in this collection, falling back to the live-computed default only if a worker_email has no row at all (e.g. an instance created before this collection existed).","properties":{"id":{"type":"string","readOnly":true,"example":"HRP-alice.smith0"},"worker_email":{"type":"string","format":"email"},"date_of_birth":{"type":"string","format":"date","nullable":true},"employment_start_date":{"type":"string","format":"date","nullable":true},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"JourneyTask":{"type":"object","description":"Data-layer storage shape for one employee_tasks/manager_tasks row. The sn_jny contract response re-shapes this into ServiceNow's real task object ({task_type, ja_stage, journey_title, due_date_display_value, ...}) — see contract.ts.","properties":{"id":{"type":"string","readOnly":true,"example":"JNY-0001-T001"},"task_type":{"type":"string","enum":["Task","Approval"]},"ja_stage":{"type":"string","example":"Week 1"},"short_description":{"type":"string"},"due_date":{"type":"string","format":"date"},"is_over_due":{"type":"boolean"},"is_optional":{"type":"boolean"},"order":{"type":"string","example":"10"}}},"DiscussionRecord":{"type":"object","description":"Data-layer storage shape for one ServiceNow EGD Conversation Discussion (sn_egd_act_discussion) row — a manager-employee 1:1 discussion record that a saved meeting brief gets written onto. The sn_egd_act_discussion contract response re-shapes this into ServiceNow's real field set (discussion_series as a {value,link} reference, active as a string, etc.) — see contract.ts. Not every employee has one (sparse, like Journey) — that's what drives Update_1_1_Brief_on_Conversation_Record's 'no active discussion record found' branch.","properties":{"id":{"type":"string","readOnly":true,"example":"DISC-0001"},"employee_email":{"type":"string","format":"email"},"manager_email":{"type":"string","format":"email"},"u_agenda":{"type":"string","description":"The saved meeting brief/agenda text.","example":"Discussed Q3 goals and career growth plan."},"active":{"type":"boolean","example":true},"title":{"type":"string","example":"1:1 with Alex Smith"},"summary":{"type":"string"},"additional_details":{"type":"string"},"state":{"type":"string","example":"In Progress"},"calendar_provider":{"type":"string","nullable":true},"calendar_event_table":{"type":"string","nullable":true},"date":{"type":"string","format":"date"},"start_time":{"type":"string","format":"date-time"},"end_time":{"type":"string","format":"date-time"},"sys_mod_count":{"type":"integer","example":0},"sys_created_by":{"type":"string","example":"admin"},"sys_created_on":{"type":"string","format":"date-time"},"sys_updated_by":{"type":"string","example":"admin"},"sys_updated_on":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"TalkingPoint":{"type":"object","description":"Data-layer storage shape for one ServiceNow EGD Act Talking Point (sn_egd_act_talking_point) row — a manager's running agenda item to raise with a direct report in an upcoming 1:1, backing Manage_Discussion_Topics_for_an_Employee (talking_points_handler). added_by/u_added_for are Employee Profile sys_ids (sn_employee_profile), NOT sys_user sys_ids — see contract.ts's employeeProfileSysIdFor. Soft-deleted via active=false, never removed, so list_talking_points' active=true filter is the only thing that hides it.","properties":{"id":{"type":"string","readOnly":true,"example":"TP-0001"},"title":{"type":"string","example":"Discuss sprint velocity dip in Sprint 24"},"added_by":{"type":"string","description":"The manager's Employee Profile sys_id."},"u_added_for":{"type":"string","description":"The reportee's Employee Profile sys_id."},"active":{"type":"boolean","example":true},"sys_created_on":{"type":"string","format":"date-time"},"sys_updated_on":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"Journey":{"type":"object","description":"Data-layer storage shape for a ServiceNow Unified Journey (sn_jny) record — an employee's onboarding/career journey plan, backing Fetch_Journey_Details. The contract response re-shapes every scalar into ServiceNow's {value,displayValue} pair convention and nests employee_tasks/manager_tasks as managerTasks/employeeTasks — see contract.ts.","properties":{"id":{"type":"string","readOnly":true,"example":"JNY-0001"},"employee_email":{"type":"string","format":"email"},"manager_email":{"type":"string","format":"email"},"mentor_name":{"type":"string","nullable":true},"title":{"type":"string","example":"Alex's Engineering Onboarding"},"type":{"type":"string","enum":["Onboarding","Career Development"]},"status":{"type":"string","example":"In Progress"},"state":{"type":"string","enum":["active","closed"]},"config_type":{"type":"string","enum":["onboarding_plan","career_plan"]},"journey_config_name":{"type":"string","example":"Standard Engineering Onboarding Plan"},"created_on":{"type":"string","format":"date-time"},"published_on":{"type":"string","format":"date-time"},"sys_updated_on":{"type":"string","format":"date-time"},"progress_percentage":{"type":"integer","example":40},"employee_tasks":{"type":"array","items":{"$ref":"#/components/schemas/JourneyTask"}},"manager_tasks":{"type":"array","items":{"$ref":"#/components/schemas/JourneyTask"}},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"MicrosoftOoO":{"type":"object","description":"Per-worker out-of-office state shared by Reportees_MicrosoftGraph_OOO_Status and Employee_OOO_Status — both plugins call the identical real MS Graph routes (presence, mailboxSettings/automaticRepliesSetting, calendarView) for the same users, so one collection backs all of them (resolveOooOverride, contract.ts). One row per worker_email; scheduled_start/scheduled_end back presence and automaticRepliesSetting. calendarView uses calendar_start/calendar_end when set, otherwise falls back to scheduled_start/scheduled_end — set them separately when a person's calendar OOO block and mailbox auto-reply window genuinely end at different times. Event subject (and presence's outOfOfficeSettings.message/statusMessage) is derived from internal_reply_message (HTML-stripped). No row for a worker → Available / Disabled / no calendar events. auto_reply_status is matched case-insensitively against the real MS Graph lowercase values (disabled/alwaysEnabled/scheduled) — this PascalCase enum is documentation only.","properties":{"id":{"type":"string","readOnly":true,"example":"MSOOO-alice.smith0"},"worker_email":{"type":"string","format":"email"},"is_ooo":{"type":"boolean","example":true},"availability":{"type":"string","enum":["Available","Away","Busy","BeRightBack","DoNotDisturb","Offline","OutOfOffice"],"example":"Away"},"activity":{"type":"string","enum":["Available","Away","InACall","OutOfOffice","Presenting","DoNotDisturb","Busy","Offline"],"example":"OutOfOffice"},"auto_reply_status":{"type":"string","enum":["Disabled","AlwaysEnabled","Scheduled"],"example":"Scheduled"},"scheduled_start":{"type":"string","format":"date-time","nullable":true,"example":"2026-07-21T00:00:00"},"scheduled_end":{"type":"string","format":"date-time","nullable":true,"example":"2026-07-28T23:59:59"},"calendar_start":{"type":"string","format":"date-time","nullable":true,"example":"2026-07-21T08:00:00"},"calendar_end":{"type":"string","format":"date-time","nullable":true,"example":"2026-07-21T12:00:00"},"internal_reply_message":{"type":"string","example":"<html>I am out of office until July 28th. For urgent matters contact my manager.</html>"},"external_reply_message":{"type":"string","example":"I'm currently out of office with limited access to email. I'll respond when I'm back."},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"KbArticle":{"type":"object","description":"Data-layer storage shape for Manager_View_As_Reportee's search_articles_as_reportee action. The /api/sn_mgr_exp/manager_view_as/search contract response re-shapes this into the real captured field set (kbId, number, shortDescription, snippet, articles_markdown) — see contract.ts.","properties":{"id":{"type":"string","readOnly":true,"example":"KBART-0001"},"kbId":{"type":"string","example":"3f9c2a1e8b7d4650a1c2e3f4a5b6c7d8"},"number":{"type":"string","example":"KB1000001"},"title":{"type":"string","example":"Remote Work Guidelines"},"shortDescription":{"type":"string"},"text":{"type":"string"},"tags":{"type":"array","items":{"type":"string"},"example":["remote","policy"]},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"Employee":{"type":"object","description":"Eval-fixture roster override for Manager_View_As_Reportee / View_Holiday_List. Empty by default — when populated (via the generic bulk-import route), contract.ts's resolveEffectiveRoster (employeeOverride.ts) builds the effective roster from these rows instead of the random 20-person roster, so a scenario's exact named org chart (including a matrixManagerId dotted-line report) is what these 2 plugins answer against.","properties":{"id":{"type":"string","example":"EMP-101"},"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string","format":"email"},"managerId":{"type":"string","nullable":true,"example":"EMP-100"},"matrixManagerId":{"type":"string","nullable":true,"description":"Dotted-line manager id — counts as a direct report for orgDescendants alongside managerId."},"department":{"type":"string"},"title":{"type":"string"},"location":{"type":"string","example":"San Diego"},"country":{"type":"string","description":"Free text — not limited to the random roster's IN|AU|US.","example":"India"},"region":{"type":"string"},"businessUnit":{"type":"string"},"team":{"type":"string"},"employment_type":{"type":"string","description":"Free text (e.g. full_time, part_time, contractor, intern) — an eval fixture can set anything. Defaults to full_time if omitted.","example":"full_time"},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}},"Holiday":{"type":"object","description":"Both this app's built-in recurring calendar rows (seeded by default: country/month/day, no year) AND any imported eval-fixture one-off rows (start_date/end_date) live in this one collection — holidays.ts's resolveEffectiveHolidays merges the two per country: a one-off row only overrides the recurring calendar on the specific date it lands on, so the rest of that country's recurring holidays still show. The /api/sn_mgr_exp/mw_holiday_api/holiday_list contract response expands either shape into concrete, lookahead-windowed dates with is_today.","properties":{"id":{"type":"string","example":"HOL-0001"},"name":{"type":"string","example":"Diwali"},"country":{"type":"string","description":"IN|AU|US for built-in rows; free text for imported fixture rows.","example":"India"},"month":{"type":"integer","minimum":1,"maximum":12,"nullable":true,"description":"Built-in recurring rows only."},"day":{"type":"integer","minimum":1,"maximum":31,"nullable":true,"description":"Built-in recurring rows only."},"start_date":{"type":"string","format":"date","nullable":true,"description":"Imported one-off fixture rows only."},"end_date":{"type":"string","format":"date","nullable":true,"description":"Imported one-off fixture rows only."},"date_display":{"type":"string","nullable":true,"example":"Sun, Nov 8 2026"},"createdAt":{"type":"string","format":"date-time","readOnly":true},"updatedAt":{"type":"string","format":"date-time","readOnly":true}}}}},"paths":{"/team_memberships":{"get":{"summary":"List team_memberships","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TeamMembership"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create team_membership","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamMembership"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamMembership"}}}}}}},"/team_memberships/{id}":{"get":{"summary":"Get team_membership","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamMembership"}}}},"404":{"description":"Not found"}}}},"/chats":{"get":{"summary":"List chats","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Chat"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create chat","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chat"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chat"}}}}}}},"/chats/{id}":{"get":{"summary":"Get chat","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chat"}}}},"404":{"description":"Not found"}}}},"/chat_messages":{"get":{"summary":"List chat_messages","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ChatMessage"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create chat_message","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatMessage"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatMessage"}}}}}}},"/chat_messages/{id}":{"get":{"summary":"Get chat_message","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatMessage"}}}},"404":{"description":"Not found"}}}},"/teams":{"get":{"summary":"List teams","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Team"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create team","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Team"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Team"}}}}}}},"/teams/{id}":{"get":{"summary":"Get team","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Team"}}}},"404":{"description":"Not found"}}}},"/channels":{"get":{"summary":"List channels","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Channel"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create channel","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Channel"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Channel"}}}}}}},"/channels/{id}":{"get":{"summary":"Get channel","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Channel"}}}},"404":{"description":"Not found"}}}},"/channel_messages":{"get":{"summary":"List channel_messages","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ChannelMessage"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create channel_message","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelMessage"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelMessage"}}}}}}},"/channel_messages/{id}":{"get":{"summary":"Get channel_message","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelMessage"}}}},"404":{"description":"Not found"}}}},"/mail_messages":{"get":{"summary":"List mail_messages","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MailMessage"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create mail_message","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailMessage"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailMessage"}}}}}}},"/mail_messages/{id}":{"get":{"summary":"Get mail_message","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailMessage"}}}},"404":{"description":"Not found"}}}},"/jira_projects":{"get":{"summary":"List jira_projects","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/JiraProject"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create jira_project","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JiraProject"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JiraProject"}}}}}}},"/jira_projects/{id}":{"get":{"summary":"Get jira_project","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JiraProject"}}}},"404":{"description":"Not found"}}}},"/jira_sprints":{"get":{"summary":"List jira_sprints","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/JiraSprint"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create jira_sprint","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JiraSprint"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JiraSprint"}}}}}}},"/jira_sprints/{id}":{"get":{"summary":"Get jira_sprint","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JiraSprint"}}}},"404":{"description":"Not found"}}}},"/jira_issues":{"get":{"summary":"List jira_issues","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/JiraIssue"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create jira_issue","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JiraIssue"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JiraIssue"}}}}}}},"/jira_issues/{id}":{"get":{"summary":"Get jira_issue","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JiraIssue"}}}},"404":{"description":"Not found"}}}},"/stories":{"get":{"summary":"List stories","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Story"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create story","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Story"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Story"}}}}}}},"/stories/{id}":{"get":{"summary":"Get story","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Story"}}}},"404":{"description":"Not found"}}}},"/defects":{"get":{"summary":"List defects","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Defect"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create defect","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Defect"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Defect"}}}}}}},"/defects/{id}":{"get":{"summary":"Get defect","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Defect"}}}},"404":{"description":"Not found"}}}},"/resource_allocations":{"get":{"summary":"List resource_allocations","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ResourceAllocation"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create resource_allocation","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceAllocation"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceAllocation"}}}}}}},"/resource_allocations/{id}":{"get":{"summary":"Get resource_allocation","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceAllocation"}}}},"404":{"description":"Not found"}}}},"/workday_learning_enrollments":{"get":{"summary":"List workday_learning_enrollments","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WorkdayLearningEnrollment"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create workday_learning_enrollment","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkdayLearningEnrollment"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkdayLearningEnrollment"}}}}}}},"/workday_learning_enrollments/{id}":{"get":{"summary":"Get workday_learning_enrollment","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkdayLearningEnrollment"}}}},"404":{"description":"Not found"}}}},"/workday_learning_assignments":{"get":{"summary":"List workday_learning_assignments","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WorkdayLearningAssignment"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create workday_learning_assignment","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkdayLearningAssignment"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkdayLearningAssignment"}}}}}}},"/workday_learning_assignments/{id}":{"get":{"summary":"Get workday_learning_assignment","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkdayLearningAssignment"}}}},"404":{"description":"Not found"}}}},"/workday_certifications":{"get":{"summary":"List workday_certifications","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WorkdayCertification"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create workday_certification","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkdayCertification"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkdayCertification"}}}}}}},"/workday_certifications/{id}":{"get":{"summary":"Get workday_certification","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkdayCertification"}}}},"404":{"description":"Not found"}}}},"/workday_loa":{"get":{"summary":"List workday_loa","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WorkdayLoa"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create workday_loa","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkdayLoa"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkdayLoa"}}}}}}},"/workday_loa/{id}":{"get":{"summary":"Get workday_loa","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkdayLoa"}}}},"404":{"description":"Not found"}}}},"/workday_time_off":{"get":{"summary":"List workday_time_off","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WorkdayTimeOff"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create workday_time_off","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkdayTimeOff"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkdayTimeOff"}}}}}}},"/workday_time_off/{id}":{"get":{"summary":"Get workday_time_off","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkdayTimeOff"}}}},"404":{"description":"Not found"}}}},"/sfsf_certifications":{"get":{"summary":"List sfsf_certifications","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/SfsfCertification"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create sfsf_certification","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SfsfCertification"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SfsfCertification"}}}}}}},"/sfsf_certifications/{id}":{"get":{"summary":"Get sfsf_certification","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SfsfCertification"}}}},"404":{"description":"Not found"}}}},"/hr_profiles":{"get":{"summary":"List hr_profiles","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/HrProfileOverride"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create hr_profile_override","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrProfileOverride"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrProfileOverride"}}}}}}},"/hr_profiles/{id}":{"get":{"summary":"Get hr_profile_override","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrProfileOverride"}}}},"404":{"description":"Not found"}}}},"/journeys":{"get":{"summary":"List journeys","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Journey"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create journey","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Journey"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Journey"}}}}}}},"/journeys/{id}":{"get":{"summary":"Get journey","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Journey"}}}},"404":{"description":"Not found"}}}},"/discussion_records":{"get":{"summary":"List discussion_records","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DiscussionRecord"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create discussion_record","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscussionRecord"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscussionRecord"}}}}}}},"/discussion_records/{id}":{"get":{"summary":"Get discussion_record","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscussionRecord"}}}},"404":{"description":"Not found"}}}},"/talking_points":{"get":{"summary":"List talking_points","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TalkingPoint"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create talking_point","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TalkingPoint"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TalkingPoint"}}}}}}},"/talking_points/{id}":{"get":{"summary":"Get talking_point","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TalkingPoint"}}}},"404":{"description":"Not found"}}}},"/microsoft_ooo":{"get":{"summary":"List microsoft_ooo","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MicrosoftOoO"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create microsoft_ooo","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftOoO"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftOoO"}}}}}}},"/microsoft_ooo/{id}":{"get":{"summary":"Get microsoft_ooo","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MicrosoftOoO"}}}},"404":{"description":"Not found"}}}},"/kb_articles":{"get":{"summary":"List kb_articles","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/KbArticle"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create kb_article","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KbArticle"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KbArticle"}}}}}}},"/kb_articles/{id}":{"get":{"summary":"Get kb_article","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KbArticle"}}}},"404":{"description":"Not found"}}}},"/employees":{"get":{"summary":"List employees","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Employee"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create employee","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee"}}}}}}},"/employees/{id}":{"get":{"summary":"Get employee","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Employee"}}}},"404":{"description":"Not found"}}}},"/holidays":{"get":{"summary":"List holidays","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"limit","schema":{"type":"integer","default":50},"description":"Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."},{"in":"query","name":"cursor","schema":{"type":"string"},"description":"Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."},{"in":"query","name":"$filter","schema":{"type":"string"},"description":"OData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: \"status eq 'active'\"; \"salary gt 50000 and department eq 'Engineering'\"; \"contains(tolower(name),'acme')\"; \"closeDate gt 2026-01-01\"."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Comma-separated list of fields to return, e.g. \"id,firstName,email\". Nested fields via slash (\"pto_balance/vacation_days\"). The id field is always included."},{"in":"query","name":"$orderby","schema":{"type":"string"},"description":"Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."},{"in":"query","name":"$search","schema":{"type":"string"},"description":"Free-text, case-insensitive substring match across the resource's searchable fields."},{"in":"query","name":"$top","schema":{"type":"integer"},"description":"Maximum number of items to return (page size)."},{"in":"query","name":"$skip","schema":{"type":"integer"},"description":"Number of matching items to skip before returning results (offset paging). Combine with $top."},{"in":"query","name":"$count","schema":{"type":"boolean"},"description":"When true, include @odata.count (total matches after $filter/$search, before paging) in the response."}],"responses":{"200":{"description":"Paginated list","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Holiday"}},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."},"total":{"type":"integer","description":"Total documents in the collection."},"@odata.count":{"type":"integer","description":"Present only when $count=true: total matches after $filter/$search."},"@odata.truncated":{"type":"boolean","description":"Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."}}}}}},"400":{"description":"Invalid OData query (e.g. malformed $filter)"}}},"post":{"summary":"Create holiday","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Holiday"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Holiday"}}}}}}},"/holidays/{id}":{"get":{"summary":"Get holiday","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Holiday"}}}},"404":{"description":"Not found"}}}},"/v1.0/me/chats":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"MS Graph — list the caller's Teams chats","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"responses":{"200":{"description":"{value:[...]}"}}}},"/v1.0/chats":{"post":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"MS Graph — create or return the existing 1:1 Teams chat (idempotent)","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"chatType":{"type":"string","enum":["oneOnOne","group"]},"members":{"type":"array","items":{"type":"object"}}}}}}},"responses":{"200":{"description":"Existing chat returned"},"201":{"description":"New chat created"}}}},"/v1.0/chats/{chatId}/messages":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"MS Graph — list messages in a Teams chat","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"chatId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{value:[...]}"}}},"post":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"MS Graph — post a message to a Teams chat (stores in chat_messages)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"chatId","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"body":{"type":"object","properties":{"content":{"type":"string"},"contentType":{"type":"string","enum":["text","html"]}}}}}}}},"responses":{"201":{"description":"Message posted; retrievable via GET /v1.0/chats/{chatId}/messages"}}}},"/v1.0/me/joinedTeams":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"MS Graph — list the caller's joined Teams","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"responses":{"200":{"description":"{value:[...]}"}}}},"/v1.0/teams/{teamId}/channels":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"MS Graph — list a team's channels","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"teamId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{value:[...]}"}}}},"/v1.0/teams/{teamId}/channels/{channelId}/messages":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"MS Graph — list messages in a Teams channel","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"teamId","required":true,"schema":{"type":"string"}},{"in":"path","name":"channelId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{value:[...]}"}}}},"/v1.0/me/messages":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"MS Graph — list the caller's Outlook mail","description":"Supports `$search=\"participants:<email>\"` to narrow to messages the given address sent or received within the mailbox being listed.","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"$top","schema":{"type":"integer"}},{"in":"query","name":"$search","schema":{"type":"string"},"example":"\"participants:alice.chen@acme.com\"","description":"Only `participants:<email>` is recognized; other values are ignored."},{"in":"query","name":"$select","schema":{"type":"string"},"description":"Accepted for Graph parity; the response always includes id, subject, from, toRecipients, receivedDateTime, bodyPreview, body, importance, isRead, hasAttachments, webLink."}],"responses":{"200":{"description":"{value:[...]}"}}}},"/v1.0/users/{email}/sendMail":{"post":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"MS Graph — send mail from a user's mailbox (stores sent item in mail_messages)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["message"],"properties":{"message":{"type":"object","required":["subject","body","toRecipients"],"properties":{"subject":{"type":"string"},"body":{"type":"object","properties":{"contentType":{"type":"string","enum":["Text","HTML"]},"content":{"type":"string"}}},"toRecipients":{"type":"array","items":{"type":"object","properties":{"emailAddress":{"type":"object","properties":{"address":{"type":"string","format":"email"}}}}}}}},"saveToSentItems":{"type":"string","enum":["true","false"]}}}}}},"responses":{"202":{"description":"Accepted — sent item stored in mail_messages; retrievable via GET /v1.0/me/messages"}}}},"/v1.0/users/{identifier}":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"MS Graph — look up a user by email or GUID (ms_graph_get_user_by_email)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"identifier","required":true,"schema":{"type":"string"},"example":"alice.smith0@acme.com"}],"responses":{"200":{"description":"{id, displayName, mail, userPrincipalName, givenName, surname, jobTitle, department}"},"404":{"description":"User not found"}}}},"/v1.0/users/{userId}/presence":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"MS Graph — real-time presence + OOO settings (MS_Graph_Get_User_Presence). State from microsoft_ooo; default → Available.","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"userId","required":true,"schema":{"type":"string"},"example":"d567639d-2a18-4c48-a7ce-442438c1732e"}],"responses":{"200":{"description":"{id, availability, activity, outOfOfficeSettings, statusMessage}"}}}},"/v1.0/users/{email}/mailboxSettings/automaticRepliesSetting":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"MS Graph — mailbox automatic-reply settings (MS_Graph_Get_Automatic_Replies). State from microsoft_ooo; default → Disabled.","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"}}],"responses":{"200":{"description":"{status, scheduledStartDateTime, scheduledEndDateTime, internalReplyMessage}"}}}},"/v1.0/users/{email}/calendarView":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"MS Graph — that user's Out-of-Office calendar block in a date range (Get_Employee_OOO_Status, Get_Reportees_OOO_Status). Synthesized entirely from microsoft_ooo (is_ooo + calendar_start/calendar_end, falling back to scheduled_start/scheduled_end + internal_reply_message) — no dependency on the Calendar app.","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string","format":"email"}},{"in":"query","name":"startDateTime","required":true,"schema":{"type":"string","format":"date-time"}},{"in":"query","name":"endDateTime","required":true,"schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"{value:[...]}"},"400":{"description":"startDateTime/endDateTime missing"}}}},"/rest/api/3/search/jql":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"Jira Cloud — search issues by JQL","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"jql","required":true,"schema":{"type":"string"},"example":"sprint ~ 'Sprint 24' AND project = 'ENG'"}],"responses":{"200":{"description":"{issues:[...], nextPageToken, isLast}"},"400":{"description":"Unsupported JQL clause for this mock"}}},"post":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"Jira Cloud — search issues by JQL (POST body)","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"jql":{"type":"string"}}}}}},"responses":{"200":{"description":"{issues:[...], nextPageToken, isLast}"}}}},"/api/now/table/sn_hr_core_profile":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"ServiceNow Table API — HR profile lookup","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"sysparm_query","required":true,"schema":{"type":"string"},"example":"user.emailIN{{{user_email}}}"}],"responses":{"200":{"description":"{result:[...]}"}}}},"/api/now/table/sys_user":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"ServiceNow Table API — sys_user lookup by email or manager.email","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"sysparm_query","required":true,"schema":{"type":"string"},"example":"manager.email={{{manager_email}}}^active=true"}],"responses":{"200":{"description":"{result:[...]}"}}}},"/api/now/table/rm_story":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"ServiceNow Table API — rm_story lookup for a manager's direct reports (Snow_Get_Reportee_Stories, Servicenow_get_work_items_of_my_reportees)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"sysparm_query","required":true,"schema":{"type":"string"},"example":"assigned_to.manager.email=alice.smith0@acme.com^state=2"},{"in":"query","name":"sysparm_fields","schema":{"type":"string"}},{"in":"query","name":"sysparm_display_value","schema":{"type":"string"}},{"in":"query","name":"sysparm_limit","schema":{"type":"integer"}}],"responses":{"200":{"description":"{result:[{number, short_description, description, acceptance_criteria, assigned_to:{display_value,link}, assignment_group:{display_value,link}, project:{display_value,link}, state, blocked, blocked_reason, priority, story_points, end_date, epic, sprint, \"sprint.start_date\", \"sprint.end_date\", \"sprint.committed_points\", \"sprint.story_points\", \"sprint.actual_points\", sys_id, sys_updated_on}]}"}}}},"/api/now/table/rm_defect":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"ServiceNow Table API — rm_defect lookup for a manager's direct reports (Snow_Get_Reportee_Defects, Servicenow_get_work_items_of_my_reportees)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"sysparm_query","required":true,"schema":{"type":"string"},"example":"assigned_to.manager.email=alice.smith0@acme.com^end_date<2026-08-11^stateNOT IN3,4,7"},{"in":"query","name":"sysparm_fields","schema":{"type":"string"}},{"in":"query","name":"sysparm_display_value","schema":{"type":"string"}},{"in":"query","name":"sysparm_limit","schema":{"type":"integer"}}],"responses":{"200":{"description":"{result:[{number, short_description, description, assigned_to:{display_value,link}, assignment_group:{display_value,link}, state, priority, end_date, sprint, \"sprint.start_date\", \"sprint.end_date\", \"sprint.committed_points\", sys_id, sys_updated_on}]}"}}}},"/api/now/stats/resource_aggregate_weekly":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"ServiceNow Stats API — per-person, per-project resource allocation aggregates for a manager's direct reports (Servicenow_Get_Team_Project_Allocations, plugin Team_Project_Allocations)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"sysparm_query","required":true,"schema":{"type":"string"},"example":"user.manager.email=alice.smith0@acme.com^taskISNOTEMPTY^task.active=true"},{"in":"query","name":"sysparm_group_by","schema":{"type":"string"}},{"in":"query","name":"sysparm_sum_fields","schema":{"type":"string"}},{"in":"query","name":"sysparm_avg_fields","schema":{"type":"string"}},{"in":"query","name":"sysparm_min_fields","schema":{"type":"string"}},{"in":"query","name":"sysparm_max_fields","schema":{"type":"string"}},{"in":"query","name":"sysparm_display_value","schema":{"type":"string"}}],"responses":{"200":{"description":"{result:[{stats:{max:{week_starts_on}, avg:{fte, utilization}, min:{week_starts_on}, sum:{hours, man_days}}, groupby_fields:[{field:'category',value}, {field:'task',value}, {field:'task.percent_complete', value?}, {field:'task.short_description',value}, {field:'task.state',value}, {field:'task.sys_class_name',value}, {field:'user',value}]}]} — this is ServiceNow's aggregate Stats API (/api/now/stats/{table}), NOT the Table API rm_story/rm_defect use — a different real envelope, grouped rows with sum/avg/min/max, not raw records. 'category' and 'utilization' are returned by the real endpoint even though sysparm_group_by/sysparm_avg_fields don't request them. A dot-walked groupby field (e.g. task.percent_complete) omits its 'value' key entirely when null, rather than returning value:'' — only the non-dot-walked 'task' field gets an explicit empty string."}}}},"/api/snc/manager_hub/reportees/{email}":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"ServiceNow Custom API — a manager's direct reports","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"email","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"{result:[...]}"}}}},"/api/sn_mgr_exp/manager_view_as/users":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"ServiceNow Custom API — resolve a reportee by name (direct + skip-level + matrix) (Resolve_Reportee)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"mwUserEmail","required":true,"schema":{"type":"string"},"example":"alice.smith0@acme.com"},{"in":"query","name":"name","required":true,"schema":{"type":"string"},"example":"Bob"}],"responses":{"200":{"description":"{result:{success, count, users:[{user_name, display_name, title, department, email, sys_id, location}]}}"}}}},"/api/sn_mgr_exp/manager_context/resolve":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"ServiceNow Custom API — the caller's depth, persona and direct/skip/total + secondary report counts (resolve)","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"responses":{"200":{"description":"{result:{depth, persona, primary_count:{direct, skip, total}, secondary_manager, secondary_count:{total}}}"}}}},"/api/sn_mgr_exp/manager_context/lookupTeam":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"ServiceNow Custom API — paginated direct or secondary (dotted-line) reportees of a manager (lookupTeam)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"manager_email","required":true,"schema":{"type":"string"},"example":"alice.smith0@acme.com"},{"in":"query","name":"team_type","required":false,"schema":{"type":"string","enum":["direct","secondary"],"default":"direct"}},{"in":"query","name":"page_num","required":false,"schema":{"type":"integer","default":1}}],"responses":{"200":{"description":"{result:{users:[{name, email}], page, total_pages}}"}}}},"/api/sn_mgr_exp/manager_context/lookupReportee":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"ServiceNow Custom API — search the caller's team by name; each match tagged direct/skip/secondary (lookupReportee)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"employee_name","required":true,"schema":{"type":"string"},"example":"Bob"}],"responses":{"200":{"description":"{result:{users:[{sys_id, name, email, type}]}}"}}}},"/api/sn_mgr_exp/manager_view_as/search":{"post":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"ServiceNow Custom API — search knowledge articles as a reportee (Manager_View_As_Reportee)","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mwUserEmail":{"type":"string"},"view_as_user_id":{"type":"string"},"query":{"type":"string"}}},"example":{"mwUserEmail":"alice.smith0@acme.com","view_as_user_id":"3f9c2a1e8b7d4650a1c2e3f4a5b6c7d8","query":"remote work"}}}},"responses":{"200":{"description":"{result:{total_count, view_as_user_id, view_as_user_name, articles_markdown, articles:[...]}}"}}}},"/api/sn_mgr_exp/mw_holiday_api/holiday_list":{"post":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"ServiceNow Custom API — a reportee's or team's upcoming public holidays (View_Holiday_List)","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"moveworks_user_email":{"type":"string"},"employee_sys_id":{"type":"string"},"lookahead_days":{"type":"string"},"filter_country":{"type":"string"},"team_view":{"type":"string"},"current_date":{"type":"string","description":"Optional. Unix epoch seconds (the expected form — e.g. Bender's TIME()) or an ISO date/datetime the caller considers 'today', used instead of the server's own clock. The calendar day is extracted in UTC — a datetime with a non-UTC offset near midnight can land on a different day than intended; prefer epoch seconds or a date-only string (YYYY-MM-DD). Falls back to the real current time if omitted, empty, or unparseable."}}},"example":{"moveworks_user_email":"alice.smith0@acme.com","employee_sys_id":"9a3f2b1c4d5e6f708192a3b4c5d6e7f8","lookahead_days":"365","filter_country":"US","team_view":"false"}}}},"responses":{"200":{"description":"{result:{success, team_size, count, searched_as, error, error_code, results:{holiday:[...]}}}"}}}},"/ccx/api/wql/v1/{tenant}/data":{"post":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"Workday WQL — allWorkers / allActiveAndTerminatedWorkers / learningEnrollments / indexedLearningAssignmentRecords","description":"A `WHERE` clause may AND multiple conditions (`field = '...'`, `field IN (...)`, `field >= \"...\"`) — e.g. `learner IN (...) AND cf_LearningRegistrationDate >= \"2026-01-01\"`.","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"tenant","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string"}},"example":{"query":"SELECT workdayID, fullName, email_PrimaryWork, employeeID, supervisoryOrganization FROM allWorkers WHERE email_PrimaryWork = 'alice.smith0@acme.com'"}}}}},"responses":{"200":{"description":"{data:[...], total}"},"400":{"description":"Unsupported WQL query for this mock"}}}},"/api/v1/{tenant}/workers/{workerId}/directReports":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"Workday REST — a worker's direct reports","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"tenant","required":true,"schema":{"type":"string"}},{"in":"path","name":"workerId","required":true,"schema":{"type":"string"},"example":"WD-0001"}],"responses":{"200":{"description":"{total, directReports:[...]}"}}}},"/api/absenceManagement/v5/{tenant}/workers/{workerId}/leavesOfAbsence":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"Workday Absence Management REST — a worker's in-progress (active or upcoming) leaves of absence (Workday_Get_Worker_LOA)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"tenant","required":true,"schema":{"type":"string"},"example":"bcone_gms1"},{"in":"path","name":"workerId","required":true,"schema":{"type":"string"},"example":"WD-0004"},{"in":"query","name":"status","schema":{"type":"string"},"example":"e2d08afc53614c37b32b31270bb8bee3"},{"in":"query","name":"fromDate","schema":{"type":"string","format":"date"},"example":"2026-01-01"},{"in":"query","name":"toDate","schema":{"type":"string","format":"date"},"example":"2026-06-06"},{"in":"query","name":"limit","schema":{"type":"integer"}},{"in":"query","name":"offset","schema":{"type":"integer"}}],"responses":{"200":{"description":"{total, data:[{id, worker:{id,descriptor}, leaveType:{id,descriptor}, status:{id,descriptor}, firstDayOfLeave, lastDayOfWork, estimatedLastDayOfLeave, leaveImpactFields, additionalFields, ...}]}"},"404":{"description":"No worker found for id"}}}},"/ccx/api/absenceManagement/v1/{tenant}/workers/{workerId}/timeOffDetails":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"Workday Absence Management REST — a worker's individual time-off (PTO) entries (Workday_Get_Worker_PTO)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"tenant","required":true,"schema":{"type":"string"},"example":"bcone_gms1"},{"in":"path","name":"workerId","required":true,"schema":{"type":"string"},"example":"WD-0001"},{"in":"query","name":"fromDate","schema":{"type":"string","format":"date"},"example":"2026-01-01"},{"in":"query","name":"toDate","schema":{"type":"string","format":"date"},"example":"2026-01-08"},{"in":"query","name":"limit","schema":{"type":"integer"},"example":50}],"responses":{"200":{"description":"{total, data:[{id, date, quantity, unitOfTime, timeOffType:{id,descriptor}, status:{id,descriptor}, worker:{id,descriptor}}]}"},"404":{"description":"No worker found for id"}}}},"/odata/v2/User":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"SAP SuccessFactors OData v2 — User entity","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"$filter","schema":{"type":"string"},"example":"manager eq 'alice.smith0@acme.com'"}],"responses":{"200":{"description":"{d:{results:[...]}}"}}}},"/odata/v2/Background_Certificates":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"SAP SuccessFactors OData v2 — Background_Certificates entity","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"$filter","schema":{"type":"string"},"example":"userId eq 'SF0001'"}],"responses":{"200":{"description":"{d:{results:[...]}}"}}}},"/api/now/table/sn_egd_act_discussion":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"ServiceNow Table API — find the active 1:1 discussion record for an employee (Fetch_sys_id_of_the_Discussion_record)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"sysparm_query","required":true,"schema":{"type":"string"},"example":"discussion_series.employee.user.sys_id={{{employee_sysid}}}^active=true"},{"in":"query","name":"sysparm_fields","schema":{"type":"string"},"example":"sys_id"},{"in":"query","name":"sysparm_limit","schema":{"type":"string"},"example":"1"},{"in":"query","name":"sysparm_display_value","schema":{"type":"string"},"example":"true"}],"responses":{"200":{"description":"{result:[...]}"},"400":{"description":"sysparm_query missing the required employee sys_id clause"}}}},"/api/now/table/sn_egd_act_discussion/{sys_id}":{"patch":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"ServiceNow Table API — save a generated brief onto a discussion record's u_agenda field (Servicenow_Save_Brief_on_Conversation_Record)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"sys_id","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"u_agenda":{"type":"string"}}},"example":{"u_agenda":"Discussed Q3 goals and career growth plan."}}}},"responses":{"200":{"description":"{result:{...full DiscussionRecord wire shape}}"},"404":{"description":"No record with that sys_id"}}}},"/api/now/table/sn_employee_profile":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"ServiceNow Table API — resolve a user's Employee Profile sys_id (get_employee_profile_details)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"sysparm_query","required":true,"schema":{"type":"string"},"example":"user={{{user_id}}}"},{"in":"query","name":"sysparm_limit","schema":{"type":"string"},"example":"1"},{"in":"query","name":"sysparm_fields","schema":{"type":"string"},"example":"number, sys_id, hr_profile"}],"responses":{"200":{"description":"{result:[{number, sys_id, hr_profile}]}"},"400":{"description":"sysparm_query missing the required user=<sys_id> clause"}}}},"/api/now/table/sn_egd_act_talking_point":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"ServiceNow Table API — list a manager's open talking points for a reportee (list_talking_points)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"sysparm_query","required":true,"schema":{"type":"string"},"example":"added_by={{{added_by}}}^u_added_for={{{u_added_for}}}^active=true"},{"in":"query","name":"sysparm_fields","schema":{"type":"string"},"example":"sys_id,title,sys_created_on"},{"in":"query","name":"sysparm_limit","schema":{"type":"string"},"example":"100"}],"responses":{"200":{"description":"{result:[...]}"},"400":{"description":"sysparm_query missing added_by=<x>^u_added_for=<y>"}}},"post":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"ServiceNow Table API — create a new talking point (create_talking_point)","parameters":[{"$ref":"#/components/parameters/InstanceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title","added_by","u_added_for"],"properties":{"title":{"type":"string"},"added_by":{"type":"string"},"u_added_for":{"type":"string"},"active":{"type":"string"}}},"example":{"title":"Discuss sprint velocity dip in Sprint 24","added_by":"976865a397ff095020dbbdc3f153af78","u_added_for":"f714756f97ff095020dbbdc3f153afb4","active":"true"}}}},"responses":{"201":{"description":"{result:{...full TalkingPoint wire shape}}"}}}},"/api/now/table/sn_egd_act_talking_point/{sys_id}":{"patch":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"ServiceNow Table API — edit a talking point's title, or soft-delete it via active=false (update_talking_point / delete_talking_point share this route)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"sys_id","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"active":{"type":"string"}}},"example":{"title":"Discuss updated sprint plan"}}}},"responses":{"200":{"description":"{result:{...full TalkingPoint wire shape}}"},"404":{"description":"No record with that sys_id"}}}},"/api/sn_jny/unified_journey/sn_mx/users/{user_id}/journeys":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"ServiceNow Unified Journey (sn_jny) — a user's onboarding/career journeys (Fetch_Journey_Details)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"path","name":"user_id","required":true,"schema":{"type":"string"},"description":"ServiceNow sys_id of the employee."}],"responses":{"200":{"description":"{result:{status, journeys:[...]}}"}}}},"/retrieve_contents":{"get":{"x-odata":{"enabled":false,"reason":"Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."},"summary":"Galileo_Manager_Coaching_Server MCP tool — retrieve Josh Bersin Company manager-coaching research chunks by natural-language query (retrieve_contents)","parameters":[{"$ref":"#/components/parameters/InstanceId"},{"in":"query","name":"search","required":true,"schema":{"type":"string"},"example":"how to give feedback about missed deadlines"},{"in":"query","name":"limit","schema":{"type":"integer"},"example":5,"description":"Max chunks to return (default 5, capped at 20)."}],"responses":{"200":{"description":"{chunks:[{id, doc_id, chunk_id, text, title, doc_title, year, relevance, arm, matched_question, citation_ref, parent_id, labels, secondary_concepts, expressed_relations}], citations:[{ref, doc_id, source, title, year, url, file_type, file_name, concept, label}], count, concept} — shape grounded in a captured real retrieve_contents response, not invented; the JSON-RPC envelope + content[].text double-encoding are added by the shared MCP transport, not this handler.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true},"example":{"chunks":[{"id":"giving_effective_feedback_managers_guide#c_0001","doc_id":"giving_effective_feedback_managers_guide","chunk_id":"c_0001","text":"Effective feedback is specific, timely, and behavior-focused...","title":"Giving Effective Feedback: A Manager's Guide","doc_title":"Giving Effective Feedback: A Manager's Guide","year":null,"relevance":0.82,"arm":"hyqe","matched_question":{"question_id":"giving_effective_feedback_managers_guide#c_0001#q1","text":"How should a manager approach specific and timely feedback delivery?"},"citation_ref":1,"parent_id":null,"labels":{"content_type":"recommendation","evidence_type":"expert_consensus","semantic_role":"recommendation_directive","domains":["dom_03","dom_05"],"domain_names":["Performance Management","Employee Experience"],"applies_to":{"company_size":["any"],"role":["line_manager","hrbp"],"industry":["any"],"maturity_stage":["any"]},"primary_concept":"specific and timely feedback delivery","confidence":0.86,"needs_review":false,"schema_version":"arc-label-v3-backfill"},"secondary_concepts":["behavior-focused feedback","feedback timing"],"expressed_relations":[["effective feedback","requires","specific and timely delivery"]]}],"citations":[{"ref":1,"doc_id":"giving_effective_feedback_managers_guide","source":"Josh Bersin Company","title":"Giving Effective Feedback: A Manager's Guide","year":null,"url":"https://galileo-mcp-v1.azurewebsites.net/source/giving_effective_feedback_managers_guide?exp=1789489750&sig=deadbeef41c6ce57deadbeef41c6ce57","file_type":"html","file_name":"giving_effective_feedback_managers_guide.html","concept":null,"label":"[1] [Josh Bersin Company] [Giving Effective Feedback: A Manager's Guide]"}],"count":1,"concept":"concept.jbc.specific_and_timely_feedback_delivery"}}}},"400":{"description":"search is required"}}}}}}