@epilot/sdk 2.19.3 → 2.19.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/definitions/access-token-runtime.json +1 -0
- package/definitions/access-token.json +835 -0
- package/definitions/address-runtime.json +1 -0
- package/definitions/address-suggestions-runtime.json +1 -0
- package/definitions/address-suggestions.json +582 -0
- package/definitions/address.json +578 -0
- package/definitions/ai-agents-runtime.json +1 -0
- package/definitions/ai-agents.json +2863 -0
- package/definitions/app-runtime.json +1 -0
- package/definitions/app.json +5743 -0
- package/definitions/audit-logs-runtime.json +1 -0
- package/definitions/audit-logs.json +305 -0
- package/definitions/automation-runtime.json +1 -0
- package/definitions/automation.json +5557 -0
- package/definitions/billing-runtime.json +1 -0
- package/definitions/billing.json +2386 -0
- package/definitions/blueprint-manifest-runtime.json +1 -0
- package/definitions/blueprint-manifest.json +7718 -0
- package/definitions/calendar-runtime.json +1 -0
- package/definitions/calendar.json +2904 -0
- package/definitions/configuration-hub-runtime.json +1 -0
- package/definitions/configuration-hub.json +2250 -0
- package/definitions/consent-runtime.json +1 -0
- package/definitions/consent.json +344 -0
- package/definitions/customer-portal-runtime.json +1 -0
- package/definitions/customer-portal.json +19919 -0
- package/definitions/dashboard-runtime.json +1 -0
- package/definitions/dashboard.json +1355 -0
- package/definitions/data-governance-runtime.json +1 -0
- package/definitions/data-governance.json +1126 -0
- package/definitions/deduplication-runtime.json +1 -0
- package/definitions/deduplication.json +782 -0
- package/definitions/design-runtime.json +1 -0
- package/definitions/design.json +1827 -0
- package/definitions/document-runtime.json +1 -0
- package/definitions/document.json +758 -0
- package/definitions/email-settings-runtime.json +1 -0
- package/definitions/email-settings.json +3736 -0
- package/definitions/email-template-runtime.json +1 -0
- package/definitions/email-template.json +1441 -0
- package/definitions/entity-mapping-runtime.json +1 -0
- package/definitions/entity-mapping.json +1642 -0
- package/definitions/entity-runtime.json +1 -0
- package/definitions/entity.json +11517 -0
- package/definitions/environments-runtime.json +1 -0
- package/definitions/environments.json +539 -0
- package/definitions/event-catalog-runtime.json +1 -0
- package/definitions/event-catalog.json +1524 -0
- package/definitions/file-runtime.json +1 -0
- package/definitions/file.json +3905 -0
- package/definitions/iban-runtime.json +1 -0
- package/definitions/iban.json +132 -0
- package/definitions/integration-toolkit-runtime.json +1 -0
- package/definitions/integration-toolkit.json +12769 -0
- package/definitions/journey-runtime.json +1 -0
- package/definitions/journey.json +2640 -0
- package/definitions/kanban-runtime.json +1 -0
- package/definitions/kanban.json +1506 -0
- package/definitions/message-runtime.json +1 -0
- package/definitions/message.json +3667 -0
- package/definitions/metering-runtime.json +1 -0
- package/definitions/metering.json +3132 -0
- package/definitions/notes-runtime.json +1 -0
- package/definitions/notes.json +1698 -0
- package/definitions/notification-runtime.json +1 -0
- package/definitions/notification.json +1439 -0
- package/definitions/organization-runtime.json +1 -0
- package/definitions/organization.json +1192 -0
- package/definitions/partner-directory-runtime.json +1 -0
- package/definitions/partner-directory.json +2284 -0
- package/definitions/permissions-runtime.json +1 -0
- package/definitions/permissions.json +1598 -0
- package/definitions/pricing-runtime.json +1 -0
- package/definitions/pricing-tier-runtime.json +1 -0
- package/definitions/pricing-tier.json +105 -0
- package/definitions/pricing.json +11569 -0
- package/definitions/purpose-runtime.json +1 -0
- package/definitions/purpose.json +524 -0
- package/definitions/query-runtime.json +1 -0
- package/definitions/query.json +3178 -0
- package/definitions/sandbox-runtime.json +1 -0
- package/definitions/sandbox.json +453 -0
- package/definitions/sharing-runtime.json +1 -0
- package/definitions/sharing.json +956 -0
- package/definitions/snapshot-runtime.json +1 -0
- package/definitions/snapshot.json +1103 -0
- package/definitions/submission-runtime.json +1 -0
- package/definitions/submission.json +313 -0
- package/definitions/targeting-runtime.json +1 -0
- package/definitions/targeting.json +2222 -0
- package/definitions/template-variables-runtime.json +1 -0
- package/definitions/template-variables.json +1416 -0
- package/definitions/user-runtime.json +1 -0
- package/definitions/user.json +3051 -0
- package/definitions/validation-rules-runtime.json +1 -0
- package/definitions/validation-rules.json +2365 -0
- package/definitions/webhooks-runtime.json +1 -0
- package/definitions/webhooks.json +1875 -0
- package/definitions/workflow-definition-runtime.json +1 -0
- package/definitions/workflow-definition.json +3592 -0
- package/definitions/workflow-runtime.json +1 -0
- package/definitions/workflow.json +4669 -0
- package/dist/apis/access-token.cjs +6 -6
- package/dist/apis/access-token.js +1 -1
- package/dist/apis/address-suggestions.cjs +6 -6
- package/dist/apis/address-suggestions.js +1 -1
- package/dist/apis/address.cjs +6 -6
- package/dist/apis/address.js +1 -1
- package/dist/apis/ai-agents.cjs +6 -6
- package/dist/apis/ai-agents.js +1 -1
- package/dist/apis/app.cjs +6 -6
- package/dist/apis/app.js +1 -1
- package/dist/apis/audit-logs.cjs +6 -6
- package/dist/apis/audit-logs.js +1 -1
- package/dist/apis/automation.cjs +6 -6
- package/dist/apis/automation.js +1 -1
- package/dist/apis/billing.cjs +6 -6
- package/dist/apis/billing.js +1 -1
- package/dist/apis/blueprint-manifest.cjs +6 -6
- package/dist/apis/blueprint-manifest.js +1 -1
- package/dist/apis/calendar.cjs +6 -6
- package/dist/apis/calendar.js +1 -1
- package/dist/apis/configuration-hub.cjs +6 -6
- package/dist/apis/configuration-hub.js +1 -1
- package/dist/apis/consent.cjs +6 -6
- package/dist/apis/consent.js +1 -1
- package/dist/apis/customer-portal.cjs +6 -6
- package/dist/apis/customer-portal.js +1 -1
- package/dist/apis/dashboard.cjs +6 -6
- package/dist/apis/dashboard.js +1 -1
- package/dist/apis/data-governance.cjs +6 -6
- package/dist/apis/data-governance.js +1 -1
- package/dist/apis/deduplication.cjs +6 -6
- package/dist/apis/deduplication.js +1 -1
- package/dist/apis/design.cjs +6 -6
- package/dist/apis/design.js +1 -1
- package/dist/apis/document.cjs +6 -6
- package/dist/apis/document.js +1 -1
- package/dist/apis/email-settings.cjs +6 -6
- package/dist/apis/email-settings.js +1 -1
- package/dist/apis/email-template.cjs +6 -6
- package/dist/apis/email-template.js +1 -1
- package/dist/apis/entity-mapping.cjs +6 -6
- package/dist/apis/entity-mapping.js +1 -1
- package/dist/apis/entity.cjs +6 -6
- package/dist/apis/entity.js +1 -1
- package/dist/apis/environments.cjs +6 -6
- package/dist/apis/environments.js +1 -1
- package/dist/apis/event-catalog.cjs +6 -6
- package/dist/apis/event-catalog.js +1 -1
- package/dist/apis/file.cjs +6 -6
- package/dist/apis/file.js +1 -1
- package/dist/apis/iban.cjs +6 -6
- package/dist/apis/iban.js +1 -1
- package/dist/apis/integration-toolkit.cjs +6 -6
- package/dist/apis/integration-toolkit.js +1 -1
- package/dist/apis/journey.cjs +6 -6
- package/dist/apis/journey.js +1 -1
- package/dist/apis/kanban.cjs +6 -6
- package/dist/apis/kanban.js +1 -1
- package/dist/apis/message.cjs +6 -6
- package/dist/apis/message.js +1 -1
- package/dist/apis/metering.cjs +6 -6
- package/dist/apis/metering.js +1 -1
- package/dist/apis/notes.cjs +6 -6
- package/dist/apis/notes.js +1 -1
- package/dist/apis/notification.cjs +6 -6
- package/dist/apis/notification.js +1 -1
- package/dist/apis/organization.cjs +6 -6
- package/dist/apis/organization.js +1 -1
- package/dist/apis/partner-directory.cjs +6 -6
- package/dist/apis/partner-directory.js +1 -1
- package/dist/apis/permissions.cjs +6 -6
- package/dist/apis/permissions.js +1 -1
- package/dist/apis/pricing-tier.cjs +6 -6
- package/dist/apis/pricing-tier.js +1 -1
- package/dist/apis/pricing.cjs +6 -6
- package/dist/apis/pricing.js +1 -1
- package/dist/apis/purpose.cjs +6 -6
- package/dist/apis/purpose.js +1 -1
- package/dist/apis/query.cjs +6 -6
- package/dist/apis/query.js +1 -1
- package/dist/apis/sandbox.cjs +6 -6
- package/dist/apis/sandbox.js +1 -1
- package/dist/apis/sharing.cjs +6 -6
- package/dist/apis/sharing.js +1 -1
- package/dist/apis/snapshot.cjs +6 -6
- package/dist/apis/snapshot.js +1 -1
- package/dist/apis/submission.cjs +6 -6
- package/dist/apis/submission.js +1 -1
- package/dist/apis/target.cjs +6 -6
- package/dist/apis/target.js +1 -1
- package/dist/apis/targeting.cjs +6 -6
- package/dist/apis/targeting.d.cts +2 -2
- package/dist/apis/targeting.d.ts +2 -2
- package/dist/apis/targeting.js +1 -1
- package/dist/apis/template-variables.cjs +6 -6
- package/dist/apis/template-variables.js +1 -1
- package/dist/apis/user.cjs +6 -6
- package/dist/apis/user.js +1 -1
- package/dist/apis/validation-rules.cjs +6 -6
- package/dist/apis/validation-rules.js +1 -1
- package/dist/apis/webhooks.cjs +6 -6
- package/dist/apis/webhooks.js +1 -1
- package/dist/apis/workflow-definition.cjs +6 -6
- package/dist/apis/workflow-definition.js +1 -1
- package/dist/apis/workflow.cjs +6 -6
- package/dist/apis/workflow.js +1 -1
- package/dist/{chunk-QWWGJOYR.cjs → chunk-AD5FK5LK.cjs} +1 -1
- package/dist/{chunk-UC3IKFHD.js → chunk-PHOP6DMJ.js} +1 -1
- package/dist/index.cjs +8 -8
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/targeting-5U4XGOXY.cjs +7 -0
- package/dist/targeting-R3G32HI4.js +7 -0
- package/dist/{targeting.d-16SvPyj4.d.cts → targeting.d-KcawmWBB.d.cts} +8 -0
- package/dist/{targeting.d-16SvPyj4.d.ts → targeting.d-KcawmWBB.d.ts} +8 -0
- package/docs/targeting.md +9 -1
- package/package.json +1 -1
- package/dist/targeting-BTVCLYFW.cjs +0 -7
- package/dist/targeting-NWYDE3E7.js +0 -7
|
@@ -0,0 +1,2904 @@
|
|
|
1
|
+
{
|
|
2
|
+
"openapi": "3.0.3",
|
|
3
|
+
"info": {
|
|
4
|
+
"title": "Calendar API",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"description": "epilot's calendar API.\n\nExposes calendars and events as first-class epilot resources."
|
|
7
|
+
},
|
|
8
|
+
"tags": [
|
|
9
|
+
{
|
|
10
|
+
"name": "Absence",
|
|
11
|
+
"description": "User absence from calendar events and absence adjustments"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"name": "Calendars",
|
|
15
|
+
"description": "User and organization calendars"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "Calendar Events",
|
|
19
|
+
"description": "Calendar events"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"name": "Working Hours",
|
|
23
|
+
"description": "Recurring weekly working hours of users"
|
|
24
|
+
}
|
|
25
|
+
],
|
|
26
|
+
"servers": [
|
|
27
|
+
{
|
|
28
|
+
"url": "https://calendar.sls.epilot.io"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"security": [
|
|
32
|
+
{
|
|
33
|
+
"EpilotAuth": []
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"EpilotOrg": []
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
"paths": {
|
|
40
|
+
"/v1/calendar/absence/users": {
|
|
41
|
+
"get": {
|
|
42
|
+
"operationId": "listUsersAbsence",
|
|
43
|
+
"summary": "listUsersAbsence",
|
|
44
|
+
"description": "List organization users with known absence metadata in the requested time window.",
|
|
45
|
+
"tags": [
|
|
46
|
+
"Absence"
|
|
47
|
+
],
|
|
48
|
+
"parameters": [
|
|
49
|
+
{
|
|
50
|
+
"in": "query",
|
|
51
|
+
"name": "from",
|
|
52
|
+
"description": "Start of the time window (inclusive). Maximum window: 31 days.",
|
|
53
|
+
"schema": {
|
|
54
|
+
"type": "string",
|
|
55
|
+
"format": "date-time",
|
|
56
|
+
"description": "Start of the time window (inclusive). Maximum window: 31 days."
|
|
57
|
+
},
|
|
58
|
+
"required": true
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"in": "query",
|
|
62
|
+
"name": "to",
|
|
63
|
+
"description": "End of the time window (exclusive). Must be after from.",
|
|
64
|
+
"schema": {
|
|
65
|
+
"type": "string",
|
|
66
|
+
"format": "date-time",
|
|
67
|
+
"description": "End of the time window (exclusive). Must be after from."
|
|
68
|
+
},
|
|
69
|
+
"required": true
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"in": "query",
|
|
73
|
+
"name": "include_busy",
|
|
74
|
+
"description": "Include busy inputs in addition to out-of-office absence. Defaults to false.",
|
|
75
|
+
"schema": {
|
|
76
|
+
"type": "boolean",
|
|
77
|
+
"description": "Include busy inputs in addition to out-of-office absence. Defaults to false.",
|
|
78
|
+
"default": false
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"in": "query",
|
|
83
|
+
"name": "working_hours_granularity",
|
|
84
|
+
"description": "At what granularity working hours contribute to absence. \"time\" (default): all time outside a user's working windows counts as absent. \"day\": only full days with no working windows count as absent (whole-day granularity, used by thread assignment). Users without a working-hours record never produce working-hours intervals.",
|
|
85
|
+
"schema": {
|
|
86
|
+
"type": "string",
|
|
87
|
+
"enum": [
|
|
88
|
+
"time",
|
|
89
|
+
"day"
|
|
90
|
+
],
|
|
91
|
+
"description": "At what granularity working hours contribute to absence. \"time\" (default): all time outside a user's working windows counts as absent. \"day\": only full days with no working windows count as absent (whole-day granularity, used by thread assignment). Users without a working-hours record never produce working-hours intervals.",
|
|
92
|
+
"default": "time"
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"in": "query",
|
|
97
|
+
"name": "query",
|
|
98
|
+
"description": "Optional user directory search query.",
|
|
99
|
+
"schema": {
|
|
100
|
+
"type": "string",
|
|
101
|
+
"description": "Optional user directory search query."
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"in": "query",
|
|
106
|
+
"name": "limit",
|
|
107
|
+
"description": "Maximum users to return.",
|
|
108
|
+
"schema": {
|
|
109
|
+
"type": "integer",
|
|
110
|
+
"minimum": 1,
|
|
111
|
+
"maximum": 100,
|
|
112
|
+
"description": "Maximum users to return."
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"in": "query",
|
|
117
|
+
"name": "offset",
|
|
118
|
+
"description": "User directory offset.",
|
|
119
|
+
"schema": {
|
|
120
|
+
"type": "integer",
|
|
121
|
+
"minimum": 0,
|
|
122
|
+
"description": "User directory offset."
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
],
|
|
126
|
+
"responses": {
|
|
127
|
+
"200": {
|
|
128
|
+
"description": "Organization users absence",
|
|
129
|
+
"content": {
|
|
130
|
+
"application/json": {
|
|
131
|
+
"schema": {
|
|
132
|
+
"type": "object",
|
|
133
|
+
"properties": {
|
|
134
|
+
"from": {
|
|
135
|
+
"type": "string",
|
|
136
|
+
"format": "date-time"
|
|
137
|
+
},
|
|
138
|
+
"to": {
|
|
139
|
+
"type": "string",
|
|
140
|
+
"format": "date-time"
|
|
141
|
+
},
|
|
142
|
+
"hits": {
|
|
143
|
+
"type": "integer",
|
|
144
|
+
"minimum": 0
|
|
145
|
+
},
|
|
146
|
+
"results": {
|
|
147
|
+
"type": "array",
|
|
148
|
+
"items": {
|
|
149
|
+
"type": "object",
|
|
150
|
+
"properties": {
|
|
151
|
+
"absent": {
|
|
152
|
+
"type": "boolean"
|
|
153
|
+
},
|
|
154
|
+
"absence_intervals": {
|
|
155
|
+
"type": "array",
|
|
156
|
+
"items": {
|
|
157
|
+
"$ref": "#/components/schemas/AbsenceInterval"
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
"user_id": {
|
|
161
|
+
"type": "string"
|
|
162
|
+
},
|
|
163
|
+
"display_name": {
|
|
164
|
+
"type": "string",
|
|
165
|
+
"nullable": true
|
|
166
|
+
},
|
|
167
|
+
"email": {
|
|
168
|
+
"type": "string",
|
|
169
|
+
"nullable": true,
|
|
170
|
+
"format": "email"
|
|
171
|
+
},
|
|
172
|
+
"status": {
|
|
173
|
+
"type": "string",
|
|
174
|
+
"nullable": true
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
"required": [
|
|
178
|
+
"absent",
|
|
179
|
+
"absence_intervals",
|
|
180
|
+
"user_id"
|
|
181
|
+
]
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
"required": [
|
|
186
|
+
"from",
|
|
187
|
+
"to",
|
|
188
|
+
"hits",
|
|
189
|
+
"results"
|
|
190
|
+
]
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
"400": {
|
|
196
|
+
"description": "Invalid request",
|
|
197
|
+
"content": {
|
|
198
|
+
"application/json": {
|
|
199
|
+
"schema": {
|
|
200
|
+
"$ref": "#/components/schemas/Error"
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
"/v1/calendar/absence:search": {
|
|
209
|
+
"post": {
|
|
210
|
+
"operationId": "searchAbsence",
|
|
211
|
+
"summary": "searchAbsence",
|
|
212
|
+
"description": "Search known absence for candidate users in the requested time window.",
|
|
213
|
+
"tags": [
|
|
214
|
+
"Absence"
|
|
215
|
+
],
|
|
216
|
+
"requestBody": {
|
|
217
|
+
"required": true,
|
|
218
|
+
"content": {
|
|
219
|
+
"application/json": {
|
|
220
|
+
"schema": {
|
|
221
|
+
"$ref": "#/components/schemas/SearchAbsenceBody"
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
"responses": {
|
|
227
|
+
"200": {
|
|
228
|
+
"description": "Users absence",
|
|
229
|
+
"content": {
|
|
230
|
+
"application/json": {
|
|
231
|
+
"schema": {
|
|
232
|
+
"type": "object",
|
|
233
|
+
"properties": {
|
|
234
|
+
"from": {
|
|
235
|
+
"type": "string",
|
|
236
|
+
"format": "date-time"
|
|
237
|
+
},
|
|
238
|
+
"to": {
|
|
239
|
+
"type": "string",
|
|
240
|
+
"format": "date-time"
|
|
241
|
+
},
|
|
242
|
+
"users": {
|
|
243
|
+
"type": "object",
|
|
244
|
+
"additionalProperties": {
|
|
245
|
+
"type": "object",
|
|
246
|
+
"properties": {
|
|
247
|
+
"absent": {
|
|
248
|
+
"type": "boolean"
|
|
249
|
+
},
|
|
250
|
+
"absence_intervals": {
|
|
251
|
+
"type": "array",
|
|
252
|
+
"items": {
|
|
253
|
+
"$ref": "#/components/schemas/AbsenceInterval"
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
},
|
|
257
|
+
"required": [
|
|
258
|
+
"absent",
|
|
259
|
+
"absence_intervals"
|
|
260
|
+
]
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
},
|
|
264
|
+
"required": [
|
|
265
|
+
"from",
|
|
266
|
+
"to",
|
|
267
|
+
"users"
|
|
268
|
+
]
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
"400": {
|
|
274
|
+
"description": "Invalid request body",
|
|
275
|
+
"content": {
|
|
276
|
+
"application/json": {
|
|
277
|
+
"schema": {
|
|
278
|
+
"$ref": "#/components/schemas/Error"
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
},
|
|
286
|
+
"/v1/calendar/absence:search-now": {
|
|
287
|
+
"post": {
|
|
288
|
+
"operationId": "searchNowAbsence",
|
|
289
|
+
"summary": "searchNowAbsence",
|
|
290
|
+
"description": "Search known absence for candidate users at the current server time.",
|
|
291
|
+
"tags": [
|
|
292
|
+
"Absence"
|
|
293
|
+
],
|
|
294
|
+
"requestBody": {
|
|
295
|
+
"required": true,
|
|
296
|
+
"content": {
|
|
297
|
+
"application/json": {
|
|
298
|
+
"schema": {
|
|
299
|
+
"$ref": "#/components/schemas/SearchNowAbsenceBody"
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
},
|
|
304
|
+
"responses": {
|
|
305
|
+
"200": {
|
|
306
|
+
"description": "Users current absence",
|
|
307
|
+
"content": {
|
|
308
|
+
"application/json": {
|
|
309
|
+
"schema": {
|
|
310
|
+
"type": "object",
|
|
311
|
+
"properties": {
|
|
312
|
+
"from": {
|
|
313
|
+
"type": "string",
|
|
314
|
+
"format": "date-time"
|
|
315
|
+
},
|
|
316
|
+
"to": {
|
|
317
|
+
"type": "string",
|
|
318
|
+
"format": "date-time"
|
|
319
|
+
},
|
|
320
|
+
"users": {
|
|
321
|
+
"type": "object",
|
|
322
|
+
"additionalProperties": {
|
|
323
|
+
"type": "object",
|
|
324
|
+
"properties": {
|
|
325
|
+
"absent": {
|
|
326
|
+
"type": "boolean"
|
|
327
|
+
},
|
|
328
|
+
"absence_intervals": {
|
|
329
|
+
"type": "array",
|
|
330
|
+
"items": {
|
|
331
|
+
"$ref": "#/components/schemas/AbsenceInterval"
|
|
332
|
+
}
|
|
333
|
+
},
|
|
334
|
+
"absent_until": {
|
|
335
|
+
"type": "string",
|
|
336
|
+
"nullable": true,
|
|
337
|
+
"format": "date-time",
|
|
338
|
+
"description": "End of the currently active absence interval, or null when the user is not absent."
|
|
339
|
+
}
|
|
340
|
+
},
|
|
341
|
+
"required": [
|
|
342
|
+
"absent",
|
|
343
|
+
"absence_intervals",
|
|
344
|
+
"absent_until"
|
|
345
|
+
]
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
},
|
|
349
|
+
"required": [
|
|
350
|
+
"from",
|
|
351
|
+
"to",
|
|
352
|
+
"users"
|
|
353
|
+
]
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
},
|
|
358
|
+
"400": {
|
|
359
|
+
"description": "Invalid request body",
|
|
360
|
+
"content": {
|
|
361
|
+
"application/json": {
|
|
362
|
+
"schema": {
|
|
363
|
+
"$ref": "#/components/schemas/Error"
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
},
|
|
371
|
+
"/v1/calendar/absence/users/{user_id}/adjustments": {
|
|
372
|
+
"get": {
|
|
373
|
+
"operationId": "listAbsenceAdjustments",
|
|
374
|
+
"summary": "listAbsenceAdjustments",
|
|
375
|
+
"description": "List absence adjustments for a user in a time window.",
|
|
376
|
+
"tags": [
|
|
377
|
+
"Absence"
|
|
378
|
+
],
|
|
379
|
+
"parameters": [
|
|
380
|
+
{
|
|
381
|
+
"in": "path",
|
|
382
|
+
"name": "user_id",
|
|
383
|
+
"schema": {
|
|
384
|
+
"type": "string",
|
|
385
|
+
"minLength": 1
|
|
386
|
+
},
|
|
387
|
+
"required": true
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
"in": "query",
|
|
391
|
+
"name": "from",
|
|
392
|
+
"description": "Start of the time window (inclusive). Maximum window: 90 days.",
|
|
393
|
+
"schema": {
|
|
394
|
+
"type": "string",
|
|
395
|
+
"format": "date-time",
|
|
396
|
+
"description": "Start of the time window (inclusive). Maximum window: 90 days."
|
|
397
|
+
},
|
|
398
|
+
"required": true
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
"in": "query",
|
|
402
|
+
"name": "to",
|
|
403
|
+
"description": "End of the time window (exclusive). Must be after from.",
|
|
404
|
+
"schema": {
|
|
405
|
+
"type": "string",
|
|
406
|
+
"format": "date-time",
|
|
407
|
+
"description": "End of the time window (exclusive). Must be after from."
|
|
408
|
+
},
|
|
409
|
+
"required": true
|
|
410
|
+
}
|
|
411
|
+
],
|
|
412
|
+
"responses": {
|
|
413
|
+
"200": {
|
|
414
|
+
"description": "Absence adjustments",
|
|
415
|
+
"content": {
|
|
416
|
+
"application/json": {
|
|
417
|
+
"schema": {
|
|
418
|
+
"type": "object",
|
|
419
|
+
"properties": {
|
|
420
|
+
"from": {
|
|
421
|
+
"type": "string",
|
|
422
|
+
"format": "date-time"
|
|
423
|
+
},
|
|
424
|
+
"to": {
|
|
425
|
+
"type": "string",
|
|
426
|
+
"format": "date-time"
|
|
427
|
+
},
|
|
428
|
+
"results": {
|
|
429
|
+
"type": "array",
|
|
430
|
+
"items": {
|
|
431
|
+
"$ref": "#/components/schemas/AbsenceAdjustment"
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
},
|
|
435
|
+
"required": [
|
|
436
|
+
"from",
|
|
437
|
+
"to",
|
|
438
|
+
"results"
|
|
439
|
+
]
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
},
|
|
444
|
+
"400": {
|
|
445
|
+
"description": "Invalid request",
|
|
446
|
+
"content": {
|
|
447
|
+
"application/json": {
|
|
448
|
+
"schema": {
|
|
449
|
+
"$ref": "#/components/schemas/Error"
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
},
|
|
456
|
+
"post": {
|
|
457
|
+
"operationId": "createAbsenceAdjustment",
|
|
458
|
+
"summary": "createAbsenceAdjustment",
|
|
459
|
+
"description": "Create a time-bound absence adjustment for a user in the caller organization.",
|
|
460
|
+
"tags": [
|
|
461
|
+
"Absence"
|
|
462
|
+
],
|
|
463
|
+
"parameters": [
|
|
464
|
+
{
|
|
465
|
+
"in": "path",
|
|
466
|
+
"name": "user_id",
|
|
467
|
+
"schema": {
|
|
468
|
+
"type": "string",
|
|
469
|
+
"minLength": 1
|
|
470
|
+
},
|
|
471
|
+
"required": true
|
|
472
|
+
}
|
|
473
|
+
],
|
|
474
|
+
"requestBody": {
|
|
475
|
+
"required": true,
|
|
476
|
+
"content": {
|
|
477
|
+
"application/json": {
|
|
478
|
+
"schema": {
|
|
479
|
+
"$ref": "#/components/schemas/CreateAbsenceAdjustmentBody"
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
},
|
|
484
|
+
"responses": {
|
|
485
|
+
"201": {
|
|
486
|
+
"description": "Created absence adjustment",
|
|
487
|
+
"content": {
|
|
488
|
+
"application/json": {
|
|
489
|
+
"schema": {
|
|
490
|
+
"$ref": "#/components/schemas/AbsenceAdjustment"
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
},
|
|
495
|
+
"400": {
|
|
496
|
+
"description": "Invalid request body",
|
|
497
|
+
"content": {
|
|
498
|
+
"application/json": {
|
|
499
|
+
"schema": {
|
|
500
|
+
"$ref": "#/components/schemas/Error"
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
},
|
|
508
|
+
"/v1/calendar/absence/users/{user_id}/adjustments/{adjustment_id}": {
|
|
509
|
+
"get": {
|
|
510
|
+
"operationId": "getAbsenceAdjustment",
|
|
511
|
+
"summary": "getAbsenceAdjustment",
|
|
512
|
+
"description": "Get an absence adjustment by ID.",
|
|
513
|
+
"tags": [
|
|
514
|
+
"Absence"
|
|
515
|
+
],
|
|
516
|
+
"parameters": [
|
|
517
|
+
{
|
|
518
|
+
"in": "path",
|
|
519
|
+
"name": "user_id",
|
|
520
|
+
"schema": {
|
|
521
|
+
"type": "string",
|
|
522
|
+
"minLength": 1
|
|
523
|
+
},
|
|
524
|
+
"required": true
|
|
525
|
+
},
|
|
526
|
+
{
|
|
527
|
+
"in": "path",
|
|
528
|
+
"name": "adjustment_id",
|
|
529
|
+
"schema": {
|
|
530
|
+
"type": "string",
|
|
531
|
+
"minLength": 1
|
|
532
|
+
},
|
|
533
|
+
"required": true
|
|
534
|
+
}
|
|
535
|
+
],
|
|
536
|
+
"responses": {
|
|
537
|
+
"200": {
|
|
538
|
+
"description": "Absence adjustment",
|
|
539
|
+
"content": {
|
|
540
|
+
"application/json": {
|
|
541
|
+
"schema": {
|
|
542
|
+
"$ref": "#/components/schemas/AbsenceAdjustment"
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
},
|
|
547
|
+
"404": {
|
|
548
|
+
"description": "Not found",
|
|
549
|
+
"content": {
|
|
550
|
+
"application/json": {
|
|
551
|
+
"schema": {
|
|
552
|
+
"$ref": "#/components/schemas/Error"
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
},
|
|
559
|
+
"patch": {
|
|
560
|
+
"operationId": "patchAbsenceAdjustment",
|
|
561
|
+
"summary": "patchAbsenceAdjustment",
|
|
562
|
+
"description": "Update an absence adjustment in the caller organization.",
|
|
563
|
+
"tags": [
|
|
564
|
+
"Absence"
|
|
565
|
+
],
|
|
566
|
+
"parameters": [
|
|
567
|
+
{
|
|
568
|
+
"in": "path",
|
|
569
|
+
"name": "user_id",
|
|
570
|
+
"schema": {
|
|
571
|
+
"type": "string",
|
|
572
|
+
"minLength": 1
|
|
573
|
+
},
|
|
574
|
+
"required": true
|
|
575
|
+
},
|
|
576
|
+
{
|
|
577
|
+
"in": "path",
|
|
578
|
+
"name": "adjustment_id",
|
|
579
|
+
"schema": {
|
|
580
|
+
"type": "string",
|
|
581
|
+
"minLength": 1
|
|
582
|
+
},
|
|
583
|
+
"required": true
|
|
584
|
+
}
|
|
585
|
+
],
|
|
586
|
+
"requestBody": {
|
|
587
|
+
"required": true,
|
|
588
|
+
"content": {
|
|
589
|
+
"application/json": {
|
|
590
|
+
"schema": {
|
|
591
|
+
"$ref": "#/components/schemas/PatchAbsenceAdjustmentBody"
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
},
|
|
596
|
+
"responses": {
|
|
597
|
+
"200": {
|
|
598
|
+
"description": "Updated absence adjustment",
|
|
599
|
+
"content": {
|
|
600
|
+
"application/json": {
|
|
601
|
+
"schema": {
|
|
602
|
+
"$ref": "#/components/schemas/AbsenceAdjustment"
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
},
|
|
607
|
+
"400": {
|
|
608
|
+
"description": "Invalid request body",
|
|
609
|
+
"content": {
|
|
610
|
+
"application/json": {
|
|
611
|
+
"schema": {
|
|
612
|
+
"$ref": "#/components/schemas/Error"
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
},
|
|
617
|
+
"404": {
|
|
618
|
+
"description": "Not found",
|
|
619
|
+
"content": {
|
|
620
|
+
"application/json": {
|
|
621
|
+
"schema": {
|
|
622
|
+
"$ref": "#/components/schemas/Error"
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
},
|
|
629
|
+
"delete": {
|
|
630
|
+
"operationId": "deleteAbsenceAdjustment",
|
|
631
|
+
"summary": "deleteAbsenceAdjustment",
|
|
632
|
+
"description": "Delete an absence adjustment.",
|
|
633
|
+
"tags": [
|
|
634
|
+
"Absence"
|
|
635
|
+
],
|
|
636
|
+
"parameters": [
|
|
637
|
+
{
|
|
638
|
+
"in": "path",
|
|
639
|
+
"name": "user_id",
|
|
640
|
+
"schema": {
|
|
641
|
+
"type": "string",
|
|
642
|
+
"minLength": 1
|
|
643
|
+
},
|
|
644
|
+
"required": true
|
|
645
|
+
},
|
|
646
|
+
{
|
|
647
|
+
"in": "path",
|
|
648
|
+
"name": "adjustment_id",
|
|
649
|
+
"schema": {
|
|
650
|
+
"type": "string",
|
|
651
|
+
"minLength": 1
|
|
652
|
+
},
|
|
653
|
+
"required": true
|
|
654
|
+
}
|
|
655
|
+
],
|
|
656
|
+
"responses": {
|
|
657
|
+
"204": {
|
|
658
|
+
"description": "Absence adjustment deleted"
|
|
659
|
+
},
|
|
660
|
+
"404": {
|
|
661
|
+
"description": "Not found",
|
|
662
|
+
"content": {
|
|
663
|
+
"application/json": {
|
|
664
|
+
"schema": {
|
|
665
|
+
"$ref": "#/components/schemas/Error"
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
},
|
|
673
|
+
"/v1/calendar/absence/users/{user_id}": {
|
|
674
|
+
"get": {
|
|
675
|
+
"operationId": "getUserAbsence",
|
|
676
|
+
"summary": "getUserAbsence",
|
|
677
|
+
"description": "Get known absence for a user in a time window. absent=false means no known absence, not guaranteed availability.",
|
|
678
|
+
"tags": [
|
|
679
|
+
"Absence"
|
|
680
|
+
],
|
|
681
|
+
"parameters": [
|
|
682
|
+
{
|
|
683
|
+
"in": "path",
|
|
684
|
+
"name": "user_id",
|
|
685
|
+
"schema": {
|
|
686
|
+
"type": "string",
|
|
687
|
+
"minLength": 1
|
|
688
|
+
},
|
|
689
|
+
"required": true
|
|
690
|
+
},
|
|
691
|
+
{
|
|
692
|
+
"in": "query",
|
|
693
|
+
"name": "from",
|
|
694
|
+
"description": "Start of the time window (inclusive). Maximum window: 31 days.",
|
|
695
|
+
"schema": {
|
|
696
|
+
"type": "string",
|
|
697
|
+
"format": "date-time",
|
|
698
|
+
"description": "Start of the time window (inclusive). Maximum window: 31 days."
|
|
699
|
+
},
|
|
700
|
+
"required": true
|
|
701
|
+
},
|
|
702
|
+
{
|
|
703
|
+
"in": "query",
|
|
704
|
+
"name": "to",
|
|
705
|
+
"description": "End of the time window (exclusive). Must be after from.",
|
|
706
|
+
"schema": {
|
|
707
|
+
"type": "string",
|
|
708
|
+
"format": "date-time",
|
|
709
|
+
"description": "End of the time window (exclusive). Must be after from."
|
|
710
|
+
},
|
|
711
|
+
"required": true
|
|
712
|
+
},
|
|
713
|
+
{
|
|
714
|
+
"in": "query",
|
|
715
|
+
"name": "include_busy",
|
|
716
|
+
"description": "Include busy inputs in addition to out-of-office absence. Defaults to false.",
|
|
717
|
+
"schema": {
|
|
718
|
+
"type": "boolean",
|
|
719
|
+
"description": "Include busy inputs in addition to out-of-office absence. Defaults to false.",
|
|
720
|
+
"default": false
|
|
721
|
+
}
|
|
722
|
+
},
|
|
723
|
+
{
|
|
724
|
+
"in": "query",
|
|
725
|
+
"name": "working_hours_granularity",
|
|
726
|
+
"description": "At what granularity working hours contribute to absence. \"time\" (default): all time outside a user's working windows counts as absent. \"day\": only full days with no working windows count as absent (whole-day granularity, used by thread assignment). Users without a working-hours record never produce working-hours intervals.",
|
|
727
|
+
"schema": {
|
|
728
|
+
"type": "string",
|
|
729
|
+
"enum": [
|
|
730
|
+
"time",
|
|
731
|
+
"day"
|
|
732
|
+
],
|
|
733
|
+
"description": "At what granularity working hours contribute to absence. \"time\" (default): all time outside a user's working windows counts as absent. \"day\": only full days with no working windows count as absent (whole-day granularity, used by thread assignment). Users without a working-hours record never produce working-hours intervals.",
|
|
734
|
+
"default": "time"
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
],
|
|
738
|
+
"responses": {
|
|
739
|
+
"200": {
|
|
740
|
+
"description": "User absence",
|
|
741
|
+
"content": {
|
|
742
|
+
"application/json": {
|
|
743
|
+
"schema": {
|
|
744
|
+
"type": "object",
|
|
745
|
+
"properties": {
|
|
746
|
+
"absent": {
|
|
747
|
+
"type": "boolean"
|
|
748
|
+
},
|
|
749
|
+
"absence_intervals": {
|
|
750
|
+
"type": "array",
|
|
751
|
+
"items": {
|
|
752
|
+
"$ref": "#/components/schemas/AbsenceInterval"
|
|
753
|
+
}
|
|
754
|
+
},
|
|
755
|
+
"from": {
|
|
756
|
+
"type": "string",
|
|
757
|
+
"format": "date-time"
|
|
758
|
+
},
|
|
759
|
+
"to": {
|
|
760
|
+
"type": "string",
|
|
761
|
+
"format": "date-time"
|
|
762
|
+
},
|
|
763
|
+
"user_id": {
|
|
764
|
+
"type": "string"
|
|
765
|
+
},
|
|
766
|
+
"external_calendars": {
|
|
767
|
+
"type": "array",
|
|
768
|
+
"items": {
|
|
769
|
+
"$ref": "#/components/schemas/ExternalCalendar"
|
|
770
|
+
},
|
|
771
|
+
"description": "The user's connected external calendars (Outlook/Google), if any."
|
|
772
|
+
}
|
|
773
|
+
},
|
|
774
|
+
"required": [
|
|
775
|
+
"absent",
|
|
776
|
+
"absence_intervals",
|
|
777
|
+
"from",
|
|
778
|
+
"to",
|
|
779
|
+
"user_id"
|
|
780
|
+
]
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
},
|
|
785
|
+
"400": {
|
|
786
|
+
"description": "Invalid request",
|
|
787
|
+
"content": {
|
|
788
|
+
"application/json": {
|
|
789
|
+
"schema": {
|
|
790
|
+
"$ref": "#/components/schemas/Error"
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
},
|
|
798
|
+
"/v1/calendar/working-hours/users/{user_id}": {
|
|
799
|
+
"get": {
|
|
800
|
+
"operationId": "getWorkingHours",
|
|
801
|
+
"summary": "getWorkingHours",
|
|
802
|
+
"description": "Get the recurring weekly working hours of a user. 404 means no record exists and the user is treated as always available.",
|
|
803
|
+
"tags": [
|
|
804
|
+
"Working Hours"
|
|
805
|
+
],
|
|
806
|
+
"parameters": [
|
|
807
|
+
{
|
|
808
|
+
"in": "path",
|
|
809
|
+
"name": "user_id",
|
|
810
|
+
"schema": {
|
|
811
|
+
"type": "string",
|
|
812
|
+
"minLength": 1
|
|
813
|
+
},
|
|
814
|
+
"required": true
|
|
815
|
+
}
|
|
816
|
+
],
|
|
817
|
+
"responses": {
|
|
818
|
+
"200": {
|
|
819
|
+
"description": "Working hours",
|
|
820
|
+
"content": {
|
|
821
|
+
"application/json": {
|
|
822
|
+
"schema": {
|
|
823
|
+
"$ref": "#/components/schemas/WorkingHours"
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
},
|
|
828
|
+
"404": {
|
|
829
|
+
"description": "Not found",
|
|
830
|
+
"content": {
|
|
831
|
+
"application/json": {
|
|
832
|
+
"schema": {
|
|
833
|
+
"$ref": "#/components/schemas/Error"
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
},
|
|
840
|
+
"put": {
|
|
841
|
+
"operationId": "putWorkingHours",
|
|
842
|
+
"summary": "putWorkingHours",
|
|
843
|
+
"description": "Create or fully replace the working hours of a user in the caller organization. This is a full replace, not a merge.",
|
|
844
|
+
"tags": [
|
|
845
|
+
"Working Hours"
|
|
846
|
+
],
|
|
847
|
+
"parameters": [
|
|
848
|
+
{
|
|
849
|
+
"in": "path",
|
|
850
|
+
"name": "user_id",
|
|
851
|
+
"schema": {
|
|
852
|
+
"type": "string",
|
|
853
|
+
"minLength": 1
|
|
854
|
+
},
|
|
855
|
+
"required": true
|
|
856
|
+
}
|
|
857
|
+
],
|
|
858
|
+
"requestBody": {
|
|
859
|
+
"required": true,
|
|
860
|
+
"content": {
|
|
861
|
+
"application/json": {
|
|
862
|
+
"schema": {
|
|
863
|
+
"$ref": "#/components/schemas/UpsertWorkingHoursBody"
|
|
864
|
+
}
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
},
|
|
868
|
+
"responses": {
|
|
869
|
+
"200": {
|
|
870
|
+
"description": "Stored working hours",
|
|
871
|
+
"content": {
|
|
872
|
+
"application/json": {
|
|
873
|
+
"schema": {
|
|
874
|
+
"$ref": "#/components/schemas/WorkingHours"
|
|
875
|
+
}
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
},
|
|
879
|
+
"400": {
|
|
880
|
+
"description": "Invalid request body",
|
|
881
|
+
"content": {
|
|
882
|
+
"application/json": {
|
|
883
|
+
"schema": {
|
|
884
|
+
"$ref": "#/components/schemas/Error"
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
}
|
|
890
|
+
},
|
|
891
|
+
"delete": {
|
|
892
|
+
"operationId": "deleteWorkingHours",
|
|
893
|
+
"summary": "deleteWorkingHours",
|
|
894
|
+
"description": "Delete the working hours of a user. The user is then treated as always available again.",
|
|
895
|
+
"tags": [
|
|
896
|
+
"Working Hours"
|
|
897
|
+
],
|
|
898
|
+
"parameters": [
|
|
899
|
+
{
|
|
900
|
+
"in": "path",
|
|
901
|
+
"name": "user_id",
|
|
902
|
+
"schema": {
|
|
903
|
+
"type": "string",
|
|
904
|
+
"minLength": 1
|
|
905
|
+
},
|
|
906
|
+
"required": true
|
|
907
|
+
}
|
|
908
|
+
],
|
|
909
|
+
"responses": {
|
|
910
|
+
"204": {
|
|
911
|
+
"description": "Working hours deleted"
|
|
912
|
+
},
|
|
913
|
+
"404": {
|
|
914
|
+
"description": "Not found",
|
|
915
|
+
"content": {
|
|
916
|
+
"application/json": {
|
|
917
|
+
"schema": {
|
|
918
|
+
"$ref": "#/components/schemas/Error"
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
},
|
|
926
|
+
"/v1/calendar": {
|
|
927
|
+
"get": {
|
|
928
|
+
"operationId": "listCalendars",
|
|
929
|
+
"summary": "listCalendars",
|
|
930
|
+
"description": "List calendars visible to the caller.",
|
|
931
|
+
"tags": [
|
|
932
|
+
"Calendars"
|
|
933
|
+
],
|
|
934
|
+
"parameters": [
|
|
935
|
+
{
|
|
936
|
+
"in": "query",
|
|
937
|
+
"name": "size",
|
|
938
|
+
"schema": {
|
|
939
|
+
"type": "integer",
|
|
940
|
+
"minimum": 1,
|
|
941
|
+
"maximum": 250
|
|
942
|
+
}
|
|
943
|
+
},
|
|
944
|
+
{
|
|
945
|
+
"in": "query",
|
|
946
|
+
"name": "cursor",
|
|
947
|
+
"description": "Opaque cursor from a previous response",
|
|
948
|
+
"schema": {
|
|
949
|
+
"type": "string",
|
|
950
|
+
"description": "Opaque cursor from a previous response"
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
],
|
|
954
|
+
"responses": {
|
|
955
|
+
"200": {
|
|
956
|
+
"description": "List of calendars",
|
|
957
|
+
"content": {
|
|
958
|
+
"application/json": {
|
|
959
|
+
"schema": {
|
|
960
|
+
"type": "object",
|
|
961
|
+
"properties": {
|
|
962
|
+
"results": {
|
|
963
|
+
"type": "array",
|
|
964
|
+
"items": {
|
|
965
|
+
"$ref": "#/components/schemas/Calendar"
|
|
966
|
+
}
|
|
967
|
+
},
|
|
968
|
+
"next_cursor": {
|
|
969
|
+
"type": "string",
|
|
970
|
+
"nullable": true
|
|
971
|
+
}
|
|
972
|
+
},
|
|
973
|
+
"required": [
|
|
974
|
+
"results"
|
|
975
|
+
]
|
|
976
|
+
}
|
|
977
|
+
}
|
|
978
|
+
}
|
|
979
|
+
}
|
|
980
|
+
}
|
|
981
|
+
},
|
|
982
|
+
"post": {
|
|
983
|
+
"operationId": "createCalendar",
|
|
984
|
+
"summary": "createCalendar",
|
|
985
|
+
"description": "Create a native epilot calendar.",
|
|
986
|
+
"tags": [
|
|
987
|
+
"Calendars"
|
|
988
|
+
],
|
|
989
|
+
"requestBody": {
|
|
990
|
+
"required": true,
|
|
991
|
+
"content": {
|
|
992
|
+
"application/json": {
|
|
993
|
+
"schema": {
|
|
994
|
+
"$ref": "#/components/schemas/CalendarCreateBody"
|
|
995
|
+
}
|
|
996
|
+
}
|
|
997
|
+
}
|
|
998
|
+
},
|
|
999
|
+
"responses": {
|
|
1000
|
+
"201": {
|
|
1001
|
+
"description": "Calendar created",
|
|
1002
|
+
"content": {
|
|
1003
|
+
"application/json": {
|
|
1004
|
+
"schema": {
|
|
1005
|
+
"$ref": "#/components/schemas/Calendar"
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
}
|
|
1009
|
+
},
|
|
1010
|
+
"400": {
|
|
1011
|
+
"description": "Invalid request body",
|
|
1012
|
+
"content": {
|
|
1013
|
+
"application/json": {
|
|
1014
|
+
"schema": {
|
|
1015
|
+
"$ref": "#/components/schemas/Error"
|
|
1016
|
+
}
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
1019
|
+
}
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
},
|
|
1023
|
+
"/v1/calendar/sources/outlook": {
|
|
1024
|
+
"post": {
|
|
1025
|
+
"operationId": "addOutlookCalendar",
|
|
1026
|
+
"summary": "addOutlookCalendar",
|
|
1027
|
+
"description": "Registers one of the caller's Outlook calendars as an epilot calendar.\n\nThe returned calendar resource carries `source.provider=outlook` and the\nprovider calendar id, so subsequent reads through `GET /v1/calendar` /\n`GET /v1/calendar/events` route through the sync provider.",
|
|
1028
|
+
"tags": [
|
|
1029
|
+
"Calendars"
|
|
1030
|
+
],
|
|
1031
|
+
"requestBody": {
|
|
1032
|
+
"required": true,
|
|
1033
|
+
"content": {
|
|
1034
|
+
"application/json": {
|
|
1035
|
+
"schema": {
|
|
1036
|
+
"$ref": "#/components/schemas/AddOutlookCalendarRequest"
|
|
1037
|
+
}
|
|
1038
|
+
}
|
|
1039
|
+
}
|
|
1040
|
+
},
|
|
1041
|
+
"responses": {
|
|
1042
|
+
"201": {
|
|
1043
|
+
"description": "Calendar created",
|
|
1044
|
+
"content": {
|
|
1045
|
+
"application/json": {
|
|
1046
|
+
"schema": {
|
|
1047
|
+
"$ref": "#/components/schemas/Calendar"
|
|
1048
|
+
}
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
},
|
|
1052
|
+
"400": {
|
|
1053
|
+
"description": "Invalid request body",
|
|
1054
|
+
"content": {
|
|
1055
|
+
"application/json": {
|
|
1056
|
+
"schema": {
|
|
1057
|
+
"$ref": "#/components/schemas/Error"
|
|
1058
|
+
}
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
},
|
|
1062
|
+
"404": {
|
|
1063
|
+
"description": "Caller has not connected their personal Outlook calendar yet",
|
|
1064
|
+
"content": {
|
|
1065
|
+
"application/json": {
|
|
1066
|
+
"schema": {
|
|
1067
|
+
"$ref": "#/components/schemas/Error"
|
|
1068
|
+
}
|
|
1069
|
+
}
|
|
1070
|
+
}
|
|
1071
|
+
}
|
|
1072
|
+
}
|
|
1073
|
+
}
|
|
1074
|
+
},
|
|
1075
|
+
"/v1/calendar/sources/outlook/available": {
|
|
1076
|
+
"get": {
|
|
1077
|
+
"operationId": "listOutlookCalendars",
|
|
1078
|
+
"summary": "listOutlookCalendars",
|
|
1079
|
+
"description": "Lists the calling user's Outlook calendars available to import as epilot calendars.\n\nRequires the caller to have a personal Outlook calendar connection (created via the\nOAuth flow on email-settings: `POST /v2/outlook/connect { \"calendar\": true }`).",
|
|
1080
|
+
"tags": [
|
|
1081
|
+
"Calendars"
|
|
1082
|
+
],
|
|
1083
|
+
"responses": {
|
|
1084
|
+
"200": {
|
|
1085
|
+
"description": "List of available Outlook calendars",
|
|
1086
|
+
"content": {
|
|
1087
|
+
"application/json": {
|
|
1088
|
+
"schema": {
|
|
1089
|
+
"type": "object",
|
|
1090
|
+
"properties": {
|
|
1091
|
+
"calendars": {
|
|
1092
|
+
"type": "array",
|
|
1093
|
+
"items": {
|
|
1094
|
+
"$ref": "#/components/schemas/AvailableOutlookCalendar"
|
|
1095
|
+
}
|
|
1096
|
+
}
|
|
1097
|
+
},
|
|
1098
|
+
"required": [
|
|
1099
|
+
"calendars"
|
|
1100
|
+
]
|
|
1101
|
+
}
|
|
1102
|
+
}
|
|
1103
|
+
}
|
|
1104
|
+
},
|
|
1105
|
+
"404": {
|
|
1106
|
+
"description": "Caller has not connected their personal Outlook calendar yet",
|
|
1107
|
+
"content": {
|
|
1108
|
+
"application/json": {
|
|
1109
|
+
"schema": {
|
|
1110
|
+
"$ref": "#/components/schemas/Error"
|
|
1111
|
+
}
|
|
1112
|
+
}
|
|
1113
|
+
}
|
|
1114
|
+
}
|
|
1115
|
+
}
|
|
1116
|
+
}
|
|
1117
|
+
},
|
|
1118
|
+
"/v1/calendar/sources/outlook/{calendar_id}": {
|
|
1119
|
+
"delete": {
|
|
1120
|
+
"operationId": "deleteOutlookCalendar",
|
|
1121
|
+
"summary": "deleteOutlookCalendar",
|
|
1122
|
+
"description": "Disconnects a previously registered Outlook calendar.\n\nDeletes the Microsoft Graph subscription, removes the backing `calendar`\nentity, and drops the local subscription record. Idempotent: a 404 from\nGraph (subscription already gone) is treated as success.",
|
|
1123
|
+
"tags": [
|
|
1124
|
+
"Calendars"
|
|
1125
|
+
],
|
|
1126
|
+
"parameters": [
|
|
1127
|
+
{
|
|
1128
|
+
"in": "path",
|
|
1129
|
+
"name": "calendar_id",
|
|
1130
|
+
"schema": {
|
|
1131
|
+
"type": "string"
|
|
1132
|
+
},
|
|
1133
|
+
"required": true
|
|
1134
|
+
}
|
|
1135
|
+
],
|
|
1136
|
+
"responses": {
|
|
1137
|
+
"204": {
|
|
1138
|
+
"description": "Outlook calendar disconnected"
|
|
1139
|
+
},
|
|
1140
|
+
"404": {
|
|
1141
|
+
"description": "No Outlook calendar registration found for this id",
|
|
1142
|
+
"content": {
|
|
1143
|
+
"application/json": {
|
|
1144
|
+
"schema": {
|
|
1145
|
+
"$ref": "#/components/schemas/Error"
|
|
1146
|
+
}
|
|
1147
|
+
}
|
|
1148
|
+
}
|
|
1149
|
+
},
|
|
1150
|
+
"502": {
|
|
1151
|
+
"description": "Microsoft Graph subscription deletion failed",
|
|
1152
|
+
"content": {
|
|
1153
|
+
"application/json": {
|
|
1154
|
+
"schema": {
|
|
1155
|
+
"$ref": "#/components/schemas/Error"
|
|
1156
|
+
}
|
|
1157
|
+
}
|
|
1158
|
+
}
|
|
1159
|
+
}
|
|
1160
|
+
}
|
|
1161
|
+
}
|
|
1162
|
+
},
|
|
1163
|
+
"/v1/calendar/outlook/webhook": {
|
|
1164
|
+
"post": {
|
|
1165
|
+
"operationId": "outlookWebhook",
|
|
1166
|
+
"summary": "outlookWebhook",
|
|
1167
|
+
"description": "Public Microsoft Graph webhook receiver for per-user Outlook calendar\nsubscriptions. Unauthenticated by design (API Gateway `Authorizer: NONE`):\nGraph calls it with no epilot token.\n\nHandles both the subscription-validation handshake (echoes the\n`validationToken` query param as `text/plain`) and change notifications.\nEach notification is trusted only after its HMAC-signed `clientState` is\nverified and matched against the stored subscription – identity is never\nread from the request body.",
|
|
1168
|
+
"tags": [
|
|
1169
|
+
"Calendars"
|
|
1170
|
+
],
|
|
1171
|
+
"security": [],
|
|
1172
|
+
"parameters": [
|
|
1173
|
+
{
|
|
1174
|
+
"in": "query",
|
|
1175
|
+
"name": "validationToken",
|
|
1176
|
+
"description": "Set by Graph on the subscription-validation handshake; echoed back verbatim.",
|
|
1177
|
+
"schema": {
|
|
1178
|
+
"type": "string",
|
|
1179
|
+
"description": "Set by Graph on the subscription-validation handshake; echoed back verbatim."
|
|
1180
|
+
}
|
|
1181
|
+
}
|
|
1182
|
+
],
|
|
1183
|
+
"responses": {
|
|
1184
|
+
"200": {
|
|
1185
|
+
"description": "Validation handshake echo (text/plain)",
|
|
1186
|
+
"content": {
|
|
1187
|
+
"text/plain": {
|
|
1188
|
+
"schema": {
|
|
1189
|
+
"type": "string"
|
|
1190
|
+
}
|
|
1191
|
+
}
|
|
1192
|
+
}
|
|
1193
|
+
},
|
|
1194
|
+
"202": {
|
|
1195
|
+
"description": "Notification batch accepted"
|
|
1196
|
+
}
|
|
1197
|
+
}
|
|
1198
|
+
}
|
|
1199
|
+
},
|
|
1200
|
+
"/v1/calendar/{calendar_id}": {
|
|
1201
|
+
"get": {
|
|
1202
|
+
"operationId": "getCalendar",
|
|
1203
|
+
"summary": "getCalendar",
|
|
1204
|
+
"description": "Get a single calendar by its epilot ID.",
|
|
1205
|
+
"tags": [
|
|
1206
|
+
"Calendars"
|
|
1207
|
+
],
|
|
1208
|
+
"parameters": [
|
|
1209
|
+
{
|
|
1210
|
+
"in": "path",
|
|
1211
|
+
"name": "calendar_id",
|
|
1212
|
+
"schema": {
|
|
1213
|
+
"type": "string"
|
|
1214
|
+
},
|
|
1215
|
+
"required": true
|
|
1216
|
+
}
|
|
1217
|
+
],
|
|
1218
|
+
"responses": {
|
|
1219
|
+
"200": {
|
|
1220
|
+
"description": "Calendar",
|
|
1221
|
+
"content": {
|
|
1222
|
+
"application/json": {
|
|
1223
|
+
"schema": {
|
|
1224
|
+
"$ref": "#/components/schemas/Calendar"
|
|
1225
|
+
}
|
|
1226
|
+
}
|
|
1227
|
+
}
|
|
1228
|
+
},
|
|
1229
|
+
"404": {
|
|
1230
|
+
"description": "Resource not found",
|
|
1231
|
+
"content": {
|
|
1232
|
+
"application/json": {
|
|
1233
|
+
"schema": {
|
|
1234
|
+
"$ref": "#/components/schemas/Error"
|
|
1235
|
+
}
|
|
1236
|
+
}
|
|
1237
|
+
}
|
|
1238
|
+
}
|
|
1239
|
+
}
|
|
1240
|
+
},
|
|
1241
|
+
"patch": {
|
|
1242
|
+
"operationId": "updateCalendar",
|
|
1243
|
+
"summary": "updateCalendar",
|
|
1244
|
+
"description": "Update local calendar details. Changes to synced calendars do not modify the provider calendar.",
|
|
1245
|
+
"tags": [
|
|
1246
|
+
"Calendars"
|
|
1247
|
+
],
|
|
1248
|
+
"parameters": [
|
|
1249
|
+
{
|
|
1250
|
+
"in": "path",
|
|
1251
|
+
"name": "calendar_id",
|
|
1252
|
+
"schema": {
|
|
1253
|
+
"type": "string"
|
|
1254
|
+
},
|
|
1255
|
+
"required": true
|
|
1256
|
+
}
|
|
1257
|
+
],
|
|
1258
|
+
"requestBody": {
|
|
1259
|
+
"required": true,
|
|
1260
|
+
"content": {
|
|
1261
|
+
"application/json": {
|
|
1262
|
+
"schema": {
|
|
1263
|
+
"$ref": "#/components/schemas/CalendarPatchBody"
|
|
1264
|
+
}
|
|
1265
|
+
}
|
|
1266
|
+
}
|
|
1267
|
+
},
|
|
1268
|
+
"responses": {
|
|
1269
|
+
"200": {
|
|
1270
|
+
"description": "Calendar updated",
|
|
1271
|
+
"content": {
|
|
1272
|
+
"application/json": {
|
|
1273
|
+
"schema": {
|
|
1274
|
+
"$ref": "#/components/schemas/Calendar"
|
|
1275
|
+
}
|
|
1276
|
+
}
|
|
1277
|
+
}
|
|
1278
|
+
},
|
|
1279
|
+
"400": {
|
|
1280
|
+
"description": "Invalid request body",
|
|
1281
|
+
"content": {
|
|
1282
|
+
"application/json": {
|
|
1283
|
+
"schema": {
|
|
1284
|
+
"$ref": "#/components/schemas/Error"
|
|
1285
|
+
}
|
|
1286
|
+
}
|
|
1287
|
+
}
|
|
1288
|
+
},
|
|
1289
|
+
"404": {
|
|
1290
|
+
"description": "Resource not found",
|
|
1291
|
+
"content": {
|
|
1292
|
+
"application/json": {
|
|
1293
|
+
"schema": {
|
|
1294
|
+
"$ref": "#/components/schemas/Error"
|
|
1295
|
+
}
|
|
1296
|
+
}
|
|
1297
|
+
}
|
|
1298
|
+
}
|
|
1299
|
+
}
|
|
1300
|
+
},
|
|
1301
|
+
"delete": {
|
|
1302
|
+
"operationId": "deleteCalendar",
|
|
1303
|
+
"summary": "deleteCalendar",
|
|
1304
|
+
"description": "Delete a native epilot calendar or disconnect a synced calendar, including its locally stored events.",
|
|
1305
|
+
"tags": [
|
|
1306
|
+
"Calendars"
|
|
1307
|
+
],
|
|
1308
|
+
"parameters": [
|
|
1309
|
+
{
|
|
1310
|
+
"in": "path",
|
|
1311
|
+
"name": "calendar_id",
|
|
1312
|
+
"schema": {
|
|
1313
|
+
"type": "string"
|
|
1314
|
+
},
|
|
1315
|
+
"required": true
|
|
1316
|
+
}
|
|
1317
|
+
],
|
|
1318
|
+
"responses": {
|
|
1319
|
+
"204": {
|
|
1320
|
+
"description": "Calendar deleted or disconnected"
|
|
1321
|
+
},
|
|
1322
|
+
"404": {
|
|
1323
|
+
"description": "Resource not found",
|
|
1324
|
+
"content": {
|
|
1325
|
+
"application/json": {
|
|
1326
|
+
"schema": {
|
|
1327
|
+
"$ref": "#/components/schemas/Error"
|
|
1328
|
+
}
|
|
1329
|
+
}
|
|
1330
|
+
}
|
|
1331
|
+
},
|
|
1332
|
+
"409": {
|
|
1333
|
+
"description": "The epilot default calendar cannot be deleted",
|
|
1334
|
+
"content": {
|
|
1335
|
+
"application/json": {
|
|
1336
|
+
"schema": {
|
|
1337
|
+
"$ref": "#/components/schemas/Error"
|
|
1338
|
+
}
|
|
1339
|
+
}
|
|
1340
|
+
}
|
|
1341
|
+
}
|
|
1342
|
+
}
|
|
1343
|
+
}
|
|
1344
|
+
},
|
|
1345
|
+
"/v1/calendar/events": {
|
|
1346
|
+
"get": {
|
|
1347
|
+
"operationId": "listEvents",
|
|
1348
|
+
"summary": "listEvents",
|
|
1349
|
+
"description": "List events in a time window. Recurring events are returned as expanded occurrences – each instance appears as its own event.",
|
|
1350
|
+
"tags": [
|
|
1351
|
+
"Calendar Events"
|
|
1352
|
+
],
|
|
1353
|
+
"parameters": [
|
|
1354
|
+
{
|
|
1355
|
+
"in": "query",
|
|
1356
|
+
"name": "from",
|
|
1357
|
+
"description": "Start of the time window (inclusive)",
|
|
1358
|
+
"schema": {
|
|
1359
|
+
"type": "string",
|
|
1360
|
+
"format": "date-time",
|
|
1361
|
+
"description": "Start of the time window (inclusive)"
|
|
1362
|
+
},
|
|
1363
|
+
"required": true
|
|
1364
|
+
},
|
|
1365
|
+
{
|
|
1366
|
+
"in": "query",
|
|
1367
|
+
"name": "to",
|
|
1368
|
+
"description": "End of the time window (exclusive)",
|
|
1369
|
+
"schema": {
|
|
1370
|
+
"type": "string",
|
|
1371
|
+
"format": "date-time",
|
|
1372
|
+
"description": "End of the time window (exclusive)"
|
|
1373
|
+
},
|
|
1374
|
+
"required": true
|
|
1375
|
+
},
|
|
1376
|
+
{
|
|
1377
|
+
"in": "query",
|
|
1378
|
+
"name": "calendar_id",
|
|
1379
|
+
"description": "Filter to a single calendar. Omit to query across all accessible calendars.",
|
|
1380
|
+
"schema": {
|
|
1381
|
+
"type": "string",
|
|
1382
|
+
"description": "Filter to a single calendar. Omit to query across all accessible calendars."
|
|
1383
|
+
}
|
|
1384
|
+
},
|
|
1385
|
+
{
|
|
1386
|
+
"in": "query",
|
|
1387
|
+
"name": "size",
|
|
1388
|
+
"schema": {
|
|
1389
|
+
"type": "integer",
|
|
1390
|
+
"minimum": 1,
|
|
1391
|
+
"maximum": 250
|
|
1392
|
+
}
|
|
1393
|
+
},
|
|
1394
|
+
{
|
|
1395
|
+
"in": "query",
|
|
1396
|
+
"name": "cursor",
|
|
1397
|
+
"schema": {
|
|
1398
|
+
"type": "string"
|
|
1399
|
+
}
|
|
1400
|
+
}
|
|
1401
|
+
],
|
|
1402
|
+
"responses": {
|
|
1403
|
+
"200": {
|
|
1404
|
+
"description": "List of events",
|
|
1405
|
+
"content": {
|
|
1406
|
+
"application/json": {
|
|
1407
|
+
"schema": {
|
|
1408
|
+
"type": "object",
|
|
1409
|
+
"properties": {
|
|
1410
|
+
"results": {
|
|
1411
|
+
"type": "array",
|
|
1412
|
+
"items": {
|
|
1413
|
+
"$ref": "#/components/schemas/CalendarEvent"
|
|
1414
|
+
}
|
|
1415
|
+
},
|
|
1416
|
+
"next_cursor": {
|
|
1417
|
+
"type": "string",
|
|
1418
|
+
"nullable": true
|
|
1419
|
+
}
|
|
1420
|
+
},
|
|
1421
|
+
"required": [
|
|
1422
|
+
"results"
|
|
1423
|
+
]
|
|
1424
|
+
}
|
|
1425
|
+
}
|
|
1426
|
+
}
|
|
1427
|
+
},
|
|
1428
|
+
"400": {
|
|
1429
|
+
"description": "Invalid request",
|
|
1430
|
+
"content": {
|
|
1431
|
+
"application/json": {
|
|
1432
|
+
"schema": {
|
|
1433
|
+
"$ref": "#/components/schemas/Error"
|
|
1434
|
+
}
|
|
1435
|
+
}
|
|
1436
|
+
}
|
|
1437
|
+
}
|
|
1438
|
+
}
|
|
1439
|
+
},
|
|
1440
|
+
"post": {
|
|
1441
|
+
"operationId": "createEvent",
|
|
1442
|
+
"summary": "createEvent",
|
|
1443
|
+
"description": "Create a native epilot calendar event. Omit `calendar_id` to use the caller’s epilot default calendar.",
|
|
1444
|
+
"tags": [
|
|
1445
|
+
"Calendar Events"
|
|
1446
|
+
],
|
|
1447
|
+
"requestBody": {
|
|
1448
|
+
"required": true,
|
|
1449
|
+
"content": {
|
|
1450
|
+
"application/json": {
|
|
1451
|
+
"schema": {
|
|
1452
|
+
"$ref": "#/components/schemas/CalendarEventCreateBody"
|
|
1453
|
+
}
|
|
1454
|
+
}
|
|
1455
|
+
}
|
|
1456
|
+
},
|
|
1457
|
+
"responses": {
|
|
1458
|
+
"201": {
|
|
1459
|
+
"description": "Event created",
|
|
1460
|
+
"content": {
|
|
1461
|
+
"application/json": {
|
|
1462
|
+
"schema": {
|
|
1463
|
+
"$ref": "#/components/schemas/CalendarEvent"
|
|
1464
|
+
}
|
|
1465
|
+
}
|
|
1466
|
+
}
|
|
1467
|
+
},
|
|
1468
|
+
"400": {
|
|
1469
|
+
"description": "Invalid request body",
|
|
1470
|
+
"content": {
|
|
1471
|
+
"application/json": {
|
|
1472
|
+
"schema": {
|
|
1473
|
+
"$ref": "#/components/schemas/Error"
|
|
1474
|
+
}
|
|
1475
|
+
}
|
|
1476
|
+
}
|
|
1477
|
+
},
|
|
1478
|
+
"403": {
|
|
1479
|
+
"description": "Calendar is read-only",
|
|
1480
|
+
"content": {
|
|
1481
|
+
"application/json": {
|
|
1482
|
+
"schema": {
|
|
1483
|
+
"$ref": "#/components/schemas/Error"
|
|
1484
|
+
}
|
|
1485
|
+
}
|
|
1486
|
+
}
|
|
1487
|
+
},
|
|
1488
|
+
"404": {
|
|
1489
|
+
"description": "Calendar not found",
|
|
1490
|
+
"content": {
|
|
1491
|
+
"application/json": {
|
|
1492
|
+
"schema": {
|
|
1493
|
+
"$ref": "#/components/schemas/Error"
|
|
1494
|
+
}
|
|
1495
|
+
}
|
|
1496
|
+
}
|
|
1497
|
+
}
|
|
1498
|
+
}
|
|
1499
|
+
}
|
|
1500
|
+
},
|
|
1501
|
+
"/v1/calendar/events/{event_id}": {
|
|
1502
|
+
"get": {
|
|
1503
|
+
"operationId": "getEvent",
|
|
1504
|
+
"summary": "getEvent",
|
|
1505
|
+
"description": "Get a single event by its epilot ID.",
|
|
1506
|
+
"tags": [
|
|
1507
|
+
"Calendar Events"
|
|
1508
|
+
],
|
|
1509
|
+
"parameters": [
|
|
1510
|
+
{
|
|
1511
|
+
"in": "path",
|
|
1512
|
+
"name": "event_id",
|
|
1513
|
+
"schema": {
|
|
1514
|
+
"type": "string"
|
|
1515
|
+
},
|
|
1516
|
+
"required": true
|
|
1517
|
+
}
|
|
1518
|
+
],
|
|
1519
|
+
"responses": {
|
|
1520
|
+
"200": {
|
|
1521
|
+
"description": "Event",
|
|
1522
|
+
"content": {
|
|
1523
|
+
"application/json": {
|
|
1524
|
+
"schema": {
|
|
1525
|
+
"$ref": "#/components/schemas/CalendarEvent"
|
|
1526
|
+
}
|
|
1527
|
+
}
|
|
1528
|
+
}
|
|
1529
|
+
},
|
|
1530
|
+
"404": {
|
|
1531
|
+
"description": "Resource not found",
|
|
1532
|
+
"content": {
|
|
1533
|
+
"application/json": {
|
|
1534
|
+
"schema": {
|
|
1535
|
+
"$ref": "#/components/schemas/Error"
|
|
1536
|
+
}
|
|
1537
|
+
}
|
|
1538
|
+
}
|
|
1539
|
+
}
|
|
1540
|
+
}
|
|
1541
|
+
},
|
|
1542
|
+
"patch": {
|
|
1543
|
+
"operationId": "updateEvent",
|
|
1544
|
+
"summary": "updateEvent",
|
|
1545
|
+
"description": "Update a native epilot calendar event.",
|
|
1546
|
+
"tags": [
|
|
1547
|
+
"Calendar Events"
|
|
1548
|
+
],
|
|
1549
|
+
"parameters": [
|
|
1550
|
+
{
|
|
1551
|
+
"in": "path",
|
|
1552
|
+
"name": "event_id",
|
|
1553
|
+
"schema": {
|
|
1554
|
+
"type": "string"
|
|
1555
|
+
},
|
|
1556
|
+
"required": true
|
|
1557
|
+
}
|
|
1558
|
+
],
|
|
1559
|
+
"requestBody": {
|
|
1560
|
+
"required": true,
|
|
1561
|
+
"content": {
|
|
1562
|
+
"application/json": {
|
|
1563
|
+
"schema": {
|
|
1564
|
+
"$ref": "#/components/schemas/CalendarEventPatchBody"
|
|
1565
|
+
}
|
|
1566
|
+
}
|
|
1567
|
+
}
|
|
1568
|
+
},
|
|
1569
|
+
"responses": {
|
|
1570
|
+
"200": {
|
|
1571
|
+
"description": "Event updated",
|
|
1572
|
+
"content": {
|
|
1573
|
+
"application/json": {
|
|
1574
|
+
"schema": {
|
|
1575
|
+
"$ref": "#/components/schemas/CalendarEvent"
|
|
1576
|
+
}
|
|
1577
|
+
}
|
|
1578
|
+
}
|
|
1579
|
+
},
|
|
1580
|
+
"400": {
|
|
1581
|
+
"description": "Invalid request body",
|
|
1582
|
+
"content": {
|
|
1583
|
+
"application/json": {
|
|
1584
|
+
"schema": {
|
|
1585
|
+
"$ref": "#/components/schemas/Error"
|
|
1586
|
+
}
|
|
1587
|
+
}
|
|
1588
|
+
}
|
|
1589
|
+
},
|
|
1590
|
+
"403": {
|
|
1591
|
+
"description": "Event or calendar is read-only",
|
|
1592
|
+
"content": {
|
|
1593
|
+
"application/json": {
|
|
1594
|
+
"schema": {
|
|
1595
|
+
"$ref": "#/components/schemas/Error"
|
|
1596
|
+
}
|
|
1597
|
+
}
|
|
1598
|
+
}
|
|
1599
|
+
},
|
|
1600
|
+
"404": {
|
|
1601
|
+
"description": "Resource not found",
|
|
1602
|
+
"content": {
|
|
1603
|
+
"application/json": {
|
|
1604
|
+
"schema": {
|
|
1605
|
+
"$ref": "#/components/schemas/Error"
|
|
1606
|
+
}
|
|
1607
|
+
}
|
|
1608
|
+
}
|
|
1609
|
+
}
|
|
1610
|
+
}
|
|
1611
|
+
},
|
|
1612
|
+
"delete": {
|
|
1613
|
+
"operationId": "deleteEvent",
|
|
1614
|
+
"summary": "deleteEvent",
|
|
1615
|
+
"description": "Delete a native epilot calendar event.",
|
|
1616
|
+
"tags": [
|
|
1617
|
+
"Calendar Events"
|
|
1618
|
+
],
|
|
1619
|
+
"parameters": [
|
|
1620
|
+
{
|
|
1621
|
+
"in": "path",
|
|
1622
|
+
"name": "event_id",
|
|
1623
|
+
"schema": {
|
|
1624
|
+
"type": "string"
|
|
1625
|
+
},
|
|
1626
|
+
"required": true
|
|
1627
|
+
}
|
|
1628
|
+
],
|
|
1629
|
+
"responses": {
|
|
1630
|
+
"204": {
|
|
1631
|
+
"description": "Event deleted"
|
|
1632
|
+
},
|
|
1633
|
+
"403": {
|
|
1634
|
+
"description": "Event or calendar is read-only",
|
|
1635
|
+
"content": {
|
|
1636
|
+
"application/json": {
|
|
1637
|
+
"schema": {
|
|
1638
|
+
"$ref": "#/components/schemas/Error"
|
|
1639
|
+
}
|
|
1640
|
+
}
|
|
1641
|
+
}
|
|
1642
|
+
},
|
|
1643
|
+
"404": {
|
|
1644
|
+
"description": "Resource not found",
|
|
1645
|
+
"content": {
|
|
1646
|
+
"application/json": {
|
|
1647
|
+
"schema": {
|
|
1648
|
+
"$ref": "#/components/schemas/Error"
|
|
1649
|
+
}
|
|
1650
|
+
}
|
|
1651
|
+
}
|
|
1652
|
+
}
|
|
1653
|
+
}
|
|
1654
|
+
}
|
|
1655
|
+
},
|
|
1656
|
+
"/v1/calendar/events/{event_id}/share": {
|
|
1657
|
+
"post": {
|
|
1658
|
+
"operationId": "shareEvent",
|
|
1659
|
+
"summary": "shareEvent",
|
|
1660
|
+
"description": "Share a calendar event with another user of the same organization, view-only. Owner-only: recipients of a share cannot re-share. Sharing an already-shared event is a no-op.",
|
|
1661
|
+
"tags": [
|
|
1662
|
+
"Calendar Events"
|
|
1663
|
+
],
|
|
1664
|
+
"parameters": [
|
|
1665
|
+
{
|
|
1666
|
+
"in": "path",
|
|
1667
|
+
"name": "event_id",
|
|
1668
|
+
"schema": {
|
|
1669
|
+
"type": "string"
|
|
1670
|
+
},
|
|
1671
|
+
"required": true
|
|
1672
|
+
}
|
|
1673
|
+
],
|
|
1674
|
+
"requestBody": {
|
|
1675
|
+
"required": true,
|
|
1676
|
+
"content": {
|
|
1677
|
+
"application/json": {
|
|
1678
|
+
"schema": {
|
|
1679
|
+
"$ref": "#/components/schemas/ShareEventBody"
|
|
1680
|
+
}
|
|
1681
|
+
}
|
|
1682
|
+
}
|
|
1683
|
+
},
|
|
1684
|
+
"responses": {
|
|
1685
|
+
"204": {
|
|
1686
|
+
"description": "Event shared"
|
|
1687
|
+
},
|
|
1688
|
+
"400": {
|
|
1689
|
+
"description": "Invalid request body",
|
|
1690
|
+
"content": {
|
|
1691
|
+
"application/json": {
|
|
1692
|
+
"schema": {
|
|
1693
|
+
"$ref": "#/components/schemas/Error"
|
|
1694
|
+
}
|
|
1695
|
+
}
|
|
1696
|
+
}
|
|
1697
|
+
},
|
|
1698
|
+
"403": {
|
|
1699
|
+
"description": "Caller is not the event owner",
|
|
1700
|
+
"content": {
|
|
1701
|
+
"application/json": {
|
|
1702
|
+
"schema": {
|
|
1703
|
+
"$ref": "#/components/schemas/Error"
|
|
1704
|
+
}
|
|
1705
|
+
}
|
|
1706
|
+
}
|
|
1707
|
+
},
|
|
1708
|
+
"404": {
|
|
1709
|
+
"description": "Event or recipient not found",
|
|
1710
|
+
"content": {
|
|
1711
|
+
"application/json": {
|
|
1712
|
+
"schema": {
|
|
1713
|
+
"$ref": "#/components/schemas/Error"
|
|
1714
|
+
}
|
|
1715
|
+
}
|
|
1716
|
+
}
|
|
1717
|
+
}
|
|
1718
|
+
}
|
|
1719
|
+
}
|
|
1720
|
+
},
|
|
1721
|
+
"/v1/calendar/events/{event_id}/share/{user_id}": {
|
|
1722
|
+
"delete": {
|
|
1723
|
+
"operationId": "unshareEvent",
|
|
1724
|
+
"summary": "unshareEvent",
|
|
1725
|
+
"description": "Revoke a per-event share. The recipient loses access immediately. Owner-only.",
|
|
1726
|
+
"tags": [
|
|
1727
|
+
"Calendar Events"
|
|
1728
|
+
],
|
|
1729
|
+
"parameters": [
|
|
1730
|
+
{
|
|
1731
|
+
"in": "path",
|
|
1732
|
+
"name": "event_id",
|
|
1733
|
+
"schema": {
|
|
1734
|
+
"type": "string"
|
|
1735
|
+
},
|
|
1736
|
+
"required": true
|
|
1737
|
+
},
|
|
1738
|
+
{
|
|
1739
|
+
"in": "path",
|
|
1740
|
+
"name": "user_id",
|
|
1741
|
+
"schema": {
|
|
1742
|
+
"type": "string"
|
|
1743
|
+
},
|
|
1744
|
+
"required": true
|
|
1745
|
+
}
|
|
1746
|
+
],
|
|
1747
|
+
"responses": {
|
|
1748
|
+
"204": {
|
|
1749
|
+
"description": "Share revoked (or was not present)"
|
|
1750
|
+
},
|
|
1751
|
+
"403": {
|
|
1752
|
+
"description": "Caller is not the event owner",
|
|
1753
|
+
"content": {
|
|
1754
|
+
"application/json": {
|
|
1755
|
+
"schema": {
|
|
1756
|
+
"$ref": "#/components/schemas/Error"
|
|
1757
|
+
}
|
|
1758
|
+
}
|
|
1759
|
+
}
|
|
1760
|
+
},
|
|
1761
|
+
"404": {
|
|
1762
|
+
"description": "Event not found",
|
|
1763
|
+
"content": {
|
|
1764
|
+
"application/json": {
|
|
1765
|
+
"schema": {
|
|
1766
|
+
"$ref": "#/components/schemas/Error"
|
|
1767
|
+
}
|
|
1768
|
+
}
|
|
1769
|
+
}
|
|
1770
|
+
}
|
|
1771
|
+
}
|
|
1772
|
+
}
|
|
1773
|
+
}
|
|
1774
|
+
},
|
|
1775
|
+
"components": {
|
|
1776
|
+
"securitySchemes": {
|
|
1777
|
+
"EpilotAuth": {
|
|
1778
|
+
"type": "http",
|
|
1779
|
+
"scheme": "bearer",
|
|
1780
|
+
"description": "Authorization header with epilot OAuth2 bearer token",
|
|
1781
|
+
"bearerFormat": "JWT"
|
|
1782
|
+
},
|
|
1783
|
+
"EpilotOrg": {
|
|
1784
|
+
"type": "apiKey",
|
|
1785
|
+
"in": "header",
|
|
1786
|
+
"name": "x-epilot-org-id"
|
|
1787
|
+
}
|
|
1788
|
+
},
|
|
1789
|
+
"schemas": {
|
|
1790
|
+
"AbsenceInterval": {
|
|
1791
|
+
"type": "object",
|
|
1792
|
+
"properties": {
|
|
1793
|
+
"from": {
|
|
1794
|
+
"type": "string",
|
|
1795
|
+
"format": "date-time",
|
|
1796
|
+
"description": "Absence interval start clipped to the requested window."
|
|
1797
|
+
},
|
|
1798
|
+
"to": {
|
|
1799
|
+
"type": "string",
|
|
1800
|
+
"format": "date-time",
|
|
1801
|
+
"description": "Absence interval end clipped to the requested window."
|
|
1802
|
+
},
|
|
1803
|
+
"original_from": {
|
|
1804
|
+
"type": "string",
|
|
1805
|
+
"format": "date-time",
|
|
1806
|
+
"description": "Original absence interval start before clipping."
|
|
1807
|
+
},
|
|
1808
|
+
"original_to": {
|
|
1809
|
+
"type": "string",
|
|
1810
|
+
"format": "date-time",
|
|
1811
|
+
"description": "Original absence interval end before clipping."
|
|
1812
|
+
},
|
|
1813
|
+
"absent": {
|
|
1814
|
+
"type": "boolean",
|
|
1815
|
+
"description": "Effective absence state for this interval."
|
|
1816
|
+
},
|
|
1817
|
+
"source": {
|
|
1818
|
+
"$ref": "#/components/schemas/AbsenceIntervalSource"
|
|
1819
|
+
},
|
|
1820
|
+
"calendar_event_id": {
|
|
1821
|
+
"type": "string",
|
|
1822
|
+
"description": "calendar_event ID for calendar-derived intervals."
|
|
1823
|
+
},
|
|
1824
|
+
"absence_adjustment_id": {
|
|
1825
|
+
"type": "string",
|
|
1826
|
+
"description": "absence adjustment ID for manual intervals."
|
|
1827
|
+
},
|
|
1828
|
+
"reason": {
|
|
1829
|
+
"type": "string",
|
|
1830
|
+
"nullable": true
|
|
1831
|
+
}
|
|
1832
|
+
},
|
|
1833
|
+
"required": [
|
|
1834
|
+
"from",
|
|
1835
|
+
"to",
|
|
1836
|
+
"original_from",
|
|
1837
|
+
"original_to",
|
|
1838
|
+
"absent",
|
|
1839
|
+
"source"
|
|
1840
|
+
]
|
|
1841
|
+
},
|
|
1842
|
+
"AbsenceIntervalSource": {
|
|
1843
|
+
"type": "string",
|
|
1844
|
+
"enum": [
|
|
1845
|
+
"calendar_event",
|
|
1846
|
+
"absence_adjustment",
|
|
1847
|
+
"working_hours"
|
|
1848
|
+
]
|
|
1849
|
+
},
|
|
1850
|
+
"Error": {
|
|
1851
|
+
"type": "object",
|
|
1852
|
+
"properties": {
|
|
1853
|
+
"status": {
|
|
1854
|
+
"type": "integer"
|
|
1855
|
+
},
|
|
1856
|
+
"error": {
|
|
1857
|
+
"anyOf": [
|
|
1858
|
+
{
|
|
1859
|
+
"type": "string"
|
|
1860
|
+
},
|
|
1861
|
+
{
|
|
1862
|
+
"type": "array",
|
|
1863
|
+
"items": {}
|
|
1864
|
+
}
|
|
1865
|
+
]
|
|
1866
|
+
}
|
|
1867
|
+
},
|
|
1868
|
+
"required": [
|
|
1869
|
+
"status",
|
|
1870
|
+
"error"
|
|
1871
|
+
]
|
|
1872
|
+
},
|
|
1873
|
+
"SearchAbsenceBody": {
|
|
1874
|
+
"type": "object",
|
|
1875
|
+
"properties": {
|
|
1876
|
+
"from": {
|
|
1877
|
+
"type": "string",
|
|
1878
|
+
"format": "date-time",
|
|
1879
|
+
"description": "Start of the time window (inclusive). Maximum window: 31 days."
|
|
1880
|
+
},
|
|
1881
|
+
"to": {
|
|
1882
|
+
"type": "string",
|
|
1883
|
+
"format": "date-time",
|
|
1884
|
+
"description": "End of the time window (exclusive). Must be after from."
|
|
1885
|
+
},
|
|
1886
|
+
"user_ids": {
|
|
1887
|
+
"type": "array",
|
|
1888
|
+
"items": {
|
|
1889
|
+
"type": "string",
|
|
1890
|
+
"minLength": 1
|
|
1891
|
+
},
|
|
1892
|
+
"minItems": 1,
|
|
1893
|
+
"maxItems": 300,
|
|
1894
|
+
"description": "Candidate users to check for absence inside the caller organization."
|
|
1895
|
+
},
|
|
1896
|
+
"include_busy": {
|
|
1897
|
+
"type": "boolean",
|
|
1898
|
+
"description": "Include busy inputs in addition to out-of-office absence. Defaults to false.",
|
|
1899
|
+
"default": false
|
|
1900
|
+
},
|
|
1901
|
+
"working_hours_granularity": {
|
|
1902
|
+
"type": "string",
|
|
1903
|
+
"enum": [
|
|
1904
|
+
"time",
|
|
1905
|
+
"day"
|
|
1906
|
+
],
|
|
1907
|
+
"description": "At what granularity working hours contribute to absence. \"time\" (default): all time outside a user's working windows counts as absent. \"day\": only full days with no working windows count as absent (whole-day granularity, used by thread assignment). Users without a working-hours record never produce working-hours intervals.",
|
|
1908
|
+
"default": "time"
|
|
1909
|
+
}
|
|
1910
|
+
},
|
|
1911
|
+
"required": [
|
|
1912
|
+
"from",
|
|
1913
|
+
"to",
|
|
1914
|
+
"user_ids"
|
|
1915
|
+
]
|
|
1916
|
+
},
|
|
1917
|
+
"SearchNowAbsenceBody": {
|
|
1918
|
+
"type": "object",
|
|
1919
|
+
"properties": {
|
|
1920
|
+
"user_ids": {
|
|
1921
|
+
"type": "array",
|
|
1922
|
+
"items": {
|
|
1923
|
+
"type": "string",
|
|
1924
|
+
"minLength": 1
|
|
1925
|
+
},
|
|
1926
|
+
"minItems": 1,
|
|
1927
|
+
"maxItems": 300,
|
|
1928
|
+
"description": "Candidate users to check for absence at the current server time inside the caller organization."
|
|
1929
|
+
},
|
|
1930
|
+
"include_busy": {
|
|
1931
|
+
"type": "boolean",
|
|
1932
|
+
"description": "Include busy inputs in addition to out-of-office absence. Defaults to false.",
|
|
1933
|
+
"default": false
|
|
1934
|
+
},
|
|
1935
|
+
"working_hours_granularity": {
|
|
1936
|
+
"type": "string",
|
|
1937
|
+
"enum": [
|
|
1938
|
+
"time",
|
|
1939
|
+
"day"
|
|
1940
|
+
],
|
|
1941
|
+
"description": "At what granularity working hours contribute to absence. \"time\" (default): all time outside a user's working windows counts as absent. \"day\": only full days with no working windows count as absent (whole-day granularity, used by thread assignment). Users without a working-hours record never produce working-hours intervals.",
|
|
1942
|
+
"default": "time"
|
|
1943
|
+
}
|
|
1944
|
+
},
|
|
1945
|
+
"required": [
|
|
1946
|
+
"user_ids"
|
|
1947
|
+
]
|
|
1948
|
+
},
|
|
1949
|
+
"AbsenceAdjustment": {
|
|
1950
|
+
"type": "object",
|
|
1951
|
+
"properties": {
|
|
1952
|
+
"from": {
|
|
1953
|
+
"type": "string",
|
|
1954
|
+
"format": "date-time",
|
|
1955
|
+
"description": "Adjustment start. Maximum adjustment duration: 7 days."
|
|
1956
|
+
},
|
|
1957
|
+
"to": {
|
|
1958
|
+
"type": "string",
|
|
1959
|
+
"format": "date-time",
|
|
1960
|
+
"description": "Adjustment end. Must be after from."
|
|
1961
|
+
},
|
|
1962
|
+
"absent": {
|
|
1963
|
+
"type": "boolean",
|
|
1964
|
+
"description": "Manual override state: true means absent, false means not absent."
|
|
1965
|
+
},
|
|
1966
|
+
"status": {
|
|
1967
|
+
"$ref": "#/components/schemas/AbsenceStatus"
|
|
1968
|
+
},
|
|
1969
|
+
"type": {
|
|
1970
|
+
"$ref": "#/components/schemas/AbsenceType"
|
|
1971
|
+
},
|
|
1972
|
+
"reason": {
|
|
1973
|
+
"type": "string",
|
|
1974
|
+
"nullable": true,
|
|
1975
|
+
"maxLength": 500
|
|
1976
|
+
},
|
|
1977
|
+
"adjustment_id": {
|
|
1978
|
+
"type": "string"
|
|
1979
|
+
},
|
|
1980
|
+
"user_id": {
|
|
1981
|
+
"type": "string"
|
|
1982
|
+
},
|
|
1983
|
+
"created_by": {
|
|
1984
|
+
"type": "string"
|
|
1985
|
+
},
|
|
1986
|
+
"created_at": {
|
|
1987
|
+
"type": "string",
|
|
1988
|
+
"format": "date-time"
|
|
1989
|
+
},
|
|
1990
|
+
"updated_at": {
|
|
1991
|
+
"type": "string",
|
|
1992
|
+
"format": "date-time"
|
|
1993
|
+
}
|
|
1994
|
+
},
|
|
1995
|
+
"required": [
|
|
1996
|
+
"from",
|
|
1997
|
+
"to",
|
|
1998
|
+
"absent",
|
|
1999
|
+
"status",
|
|
2000
|
+
"adjustment_id",
|
|
2001
|
+
"user_id",
|
|
2002
|
+
"created_by",
|
|
2003
|
+
"created_at",
|
|
2004
|
+
"updated_at"
|
|
2005
|
+
]
|
|
2006
|
+
},
|
|
2007
|
+
"AbsenceStatus": {
|
|
2008
|
+
"type": "string",
|
|
2009
|
+
"enum": [
|
|
2010
|
+
"oof",
|
|
2011
|
+
"busy"
|
|
2012
|
+
],
|
|
2013
|
+
"description": "Calendar status targeted by the absence adjustment."
|
|
2014
|
+
},
|
|
2015
|
+
"AbsenceType": {
|
|
2016
|
+
"type": "string",
|
|
2017
|
+
"minLength": 1,
|
|
2018
|
+
"maxLength": 128,
|
|
2019
|
+
"description": "Optional producer-defined reference stored with an absence adjustment."
|
|
2020
|
+
},
|
|
2021
|
+
"CreateAbsenceAdjustmentBody": {
|
|
2022
|
+
"type": "object",
|
|
2023
|
+
"properties": {
|
|
2024
|
+
"from": {
|
|
2025
|
+
"type": "string",
|
|
2026
|
+
"format": "date-time",
|
|
2027
|
+
"description": "Adjustment start. Maximum adjustment duration: 7 days."
|
|
2028
|
+
},
|
|
2029
|
+
"to": {
|
|
2030
|
+
"type": "string",
|
|
2031
|
+
"format": "date-time",
|
|
2032
|
+
"description": "Adjustment end. Must be after from."
|
|
2033
|
+
},
|
|
2034
|
+
"absent": {
|
|
2035
|
+
"type": "boolean",
|
|
2036
|
+
"description": "Manual override state: true means absent, false means not absent."
|
|
2037
|
+
},
|
|
2038
|
+
"status": {
|
|
2039
|
+
"$ref": "#/components/schemas/AbsenceStatus"
|
|
2040
|
+
},
|
|
2041
|
+
"type": {
|
|
2042
|
+
"$ref": "#/components/schemas/AbsenceType"
|
|
2043
|
+
},
|
|
2044
|
+
"reason": {
|
|
2045
|
+
"type": "string",
|
|
2046
|
+
"nullable": true,
|
|
2047
|
+
"maxLength": 500
|
|
2048
|
+
}
|
|
2049
|
+
},
|
|
2050
|
+
"required": [
|
|
2051
|
+
"from",
|
|
2052
|
+
"to",
|
|
2053
|
+
"absent",
|
|
2054
|
+
"status"
|
|
2055
|
+
]
|
|
2056
|
+
},
|
|
2057
|
+
"PatchAbsenceAdjustmentBody": {
|
|
2058
|
+
"type": "object",
|
|
2059
|
+
"properties": {
|
|
2060
|
+
"from": {
|
|
2061
|
+
"type": "string",
|
|
2062
|
+
"format": "date-time",
|
|
2063
|
+
"description": "Adjustment start. Maximum adjustment duration: 7 days."
|
|
2064
|
+
},
|
|
2065
|
+
"to": {
|
|
2066
|
+
"type": "string",
|
|
2067
|
+
"format": "date-time",
|
|
2068
|
+
"description": "Adjustment end. Must be after from."
|
|
2069
|
+
},
|
|
2070
|
+
"absent": {
|
|
2071
|
+
"type": "boolean",
|
|
2072
|
+
"description": "Manual override state: true means absent, false means not absent."
|
|
2073
|
+
},
|
|
2074
|
+
"status": {
|
|
2075
|
+
"$ref": "#/components/schemas/AbsenceStatus"
|
|
2076
|
+
},
|
|
2077
|
+
"type": {
|
|
2078
|
+
"$ref": "#/components/schemas/AbsenceType"
|
|
2079
|
+
},
|
|
2080
|
+
"reason": {
|
|
2081
|
+
"type": "string",
|
|
2082
|
+
"nullable": true,
|
|
2083
|
+
"maxLength": 500
|
|
2084
|
+
}
|
|
2085
|
+
}
|
|
2086
|
+
},
|
|
2087
|
+
"ExternalCalendar": {
|
|
2088
|
+
"type": "object",
|
|
2089
|
+
"properties": {
|
|
2090
|
+
"provider": {
|
|
2091
|
+
"type": "string",
|
|
2092
|
+
"enum": [
|
|
2093
|
+
"outlook",
|
|
2094
|
+
"google"
|
|
2095
|
+
],
|
|
2096
|
+
"description": "External calendar provider."
|
|
2097
|
+
},
|
|
2098
|
+
"last_synced_at": {
|
|
2099
|
+
"type": "string",
|
|
2100
|
+
"nullable": true,
|
|
2101
|
+
"format": "date-time",
|
|
2102
|
+
"description": "Last successful sync of this provider calendar, if any."
|
|
2103
|
+
}
|
|
2104
|
+
},
|
|
2105
|
+
"required": [
|
|
2106
|
+
"provider",
|
|
2107
|
+
"last_synced_at"
|
|
2108
|
+
]
|
|
2109
|
+
},
|
|
2110
|
+
"WorkingHours": {
|
|
2111
|
+
"type": "object",
|
|
2112
|
+
"properties": {
|
|
2113
|
+
"monday": {
|
|
2114
|
+
"type": "array",
|
|
2115
|
+
"items": {
|
|
2116
|
+
"$ref": "#/components/schemas/TimeWindow"
|
|
2117
|
+
},
|
|
2118
|
+
"maxItems": 6,
|
|
2119
|
+
"description": "Working windows for a day, sorted and non-overlapping. An empty array means a day off."
|
|
2120
|
+
},
|
|
2121
|
+
"tuesday": {
|
|
2122
|
+
"type": "array",
|
|
2123
|
+
"items": {
|
|
2124
|
+
"$ref": "#/components/schemas/TimeWindow"
|
|
2125
|
+
},
|
|
2126
|
+
"maxItems": 6,
|
|
2127
|
+
"description": "Working windows for a day, sorted and non-overlapping. An empty array means a day off."
|
|
2128
|
+
},
|
|
2129
|
+
"wednesday": {
|
|
2130
|
+
"type": "array",
|
|
2131
|
+
"items": {
|
|
2132
|
+
"$ref": "#/components/schemas/TimeWindow"
|
|
2133
|
+
},
|
|
2134
|
+
"maxItems": 6,
|
|
2135
|
+
"description": "Working windows for a day, sorted and non-overlapping. An empty array means a day off."
|
|
2136
|
+
},
|
|
2137
|
+
"thursday": {
|
|
2138
|
+
"type": "array",
|
|
2139
|
+
"items": {
|
|
2140
|
+
"$ref": "#/components/schemas/TimeWindow"
|
|
2141
|
+
},
|
|
2142
|
+
"maxItems": 6,
|
|
2143
|
+
"description": "Working windows for a day, sorted and non-overlapping. An empty array means a day off."
|
|
2144
|
+
},
|
|
2145
|
+
"friday": {
|
|
2146
|
+
"type": "array",
|
|
2147
|
+
"items": {
|
|
2148
|
+
"$ref": "#/components/schemas/TimeWindow"
|
|
2149
|
+
},
|
|
2150
|
+
"maxItems": 6,
|
|
2151
|
+
"description": "Working windows for a day, sorted and non-overlapping. An empty array means a day off."
|
|
2152
|
+
},
|
|
2153
|
+
"saturday": {
|
|
2154
|
+
"type": "array",
|
|
2155
|
+
"items": {
|
|
2156
|
+
"$ref": "#/components/schemas/TimeWindow"
|
|
2157
|
+
},
|
|
2158
|
+
"maxItems": 6,
|
|
2159
|
+
"description": "Working windows for a day, sorted and non-overlapping. An empty array means a day off."
|
|
2160
|
+
},
|
|
2161
|
+
"sunday": {
|
|
2162
|
+
"type": "array",
|
|
2163
|
+
"items": {
|
|
2164
|
+
"$ref": "#/components/schemas/TimeWindow"
|
|
2165
|
+
},
|
|
2166
|
+
"maxItems": 6,
|
|
2167
|
+
"description": "Working windows for a day, sorted and non-overlapping. An empty array means a day off."
|
|
2168
|
+
},
|
|
2169
|
+
"timezone": {
|
|
2170
|
+
"type": "string",
|
|
2171
|
+
"description": "IANA timezone the working windows are expressed in."
|
|
2172
|
+
},
|
|
2173
|
+
"user_id": {
|
|
2174
|
+
"type": "string"
|
|
2175
|
+
},
|
|
2176
|
+
"updated_by": {
|
|
2177
|
+
"type": "string"
|
|
2178
|
+
},
|
|
2179
|
+
"created_at": {
|
|
2180
|
+
"type": "string",
|
|
2181
|
+
"format": "date-time"
|
|
2182
|
+
},
|
|
2183
|
+
"updated_at": {
|
|
2184
|
+
"type": "string",
|
|
2185
|
+
"format": "date-time"
|
|
2186
|
+
}
|
|
2187
|
+
},
|
|
2188
|
+
"required": [
|
|
2189
|
+
"monday",
|
|
2190
|
+
"tuesday",
|
|
2191
|
+
"wednesday",
|
|
2192
|
+
"thursday",
|
|
2193
|
+
"friday",
|
|
2194
|
+
"saturday",
|
|
2195
|
+
"sunday",
|
|
2196
|
+
"timezone",
|
|
2197
|
+
"user_id",
|
|
2198
|
+
"updated_by",
|
|
2199
|
+
"created_at",
|
|
2200
|
+
"updated_at"
|
|
2201
|
+
],
|
|
2202
|
+
"description": "Recurring weekly working hours of a user. The absence of a record means the user is treated as always available."
|
|
2203
|
+
},
|
|
2204
|
+
"UpsertWorkingHoursBody": {
|
|
2205
|
+
"type": "object",
|
|
2206
|
+
"properties": {
|
|
2207
|
+
"monday": {
|
|
2208
|
+
"type": "array",
|
|
2209
|
+
"items": {
|
|
2210
|
+
"$ref": "#/components/schemas/TimeWindow"
|
|
2211
|
+
},
|
|
2212
|
+
"maxItems": 6,
|
|
2213
|
+
"description": "Working windows for a day, sorted and non-overlapping. An empty array means a day off."
|
|
2214
|
+
},
|
|
2215
|
+
"tuesday": {
|
|
2216
|
+
"type": "array",
|
|
2217
|
+
"items": {
|
|
2218
|
+
"$ref": "#/components/schemas/TimeWindow"
|
|
2219
|
+
},
|
|
2220
|
+
"maxItems": 6,
|
|
2221
|
+
"description": "Working windows for a day, sorted and non-overlapping. An empty array means a day off."
|
|
2222
|
+
},
|
|
2223
|
+
"wednesday": {
|
|
2224
|
+
"type": "array",
|
|
2225
|
+
"items": {
|
|
2226
|
+
"$ref": "#/components/schemas/TimeWindow"
|
|
2227
|
+
},
|
|
2228
|
+
"maxItems": 6,
|
|
2229
|
+
"description": "Working windows for a day, sorted and non-overlapping. An empty array means a day off."
|
|
2230
|
+
},
|
|
2231
|
+
"thursday": {
|
|
2232
|
+
"type": "array",
|
|
2233
|
+
"items": {
|
|
2234
|
+
"$ref": "#/components/schemas/TimeWindow"
|
|
2235
|
+
},
|
|
2236
|
+
"maxItems": 6,
|
|
2237
|
+
"description": "Working windows for a day, sorted and non-overlapping. An empty array means a day off."
|
|
2238
|
+
},
|
|
2239
|
+
"friday": {
|
|
2240
|
+
"type": "array",
|
|
2241
|
+
"items": {
|
|
2242
|
+
"$ref": "#/components/schemas/TimeWindow"
|
|
2243
|
+
},
|
|
2244
|
+
"maxItems": 6,
|
|
2245
|
+
"description": "Working windows for a day, sorted and non-overlapping. An empty array means a day off."
|
|
2246
|
+
},
|
|
2247
|
+
"saturday": {
|
|
2248
|
+
"type": "array",
|
|
2249
|
+
"items": {
|
|
2250
|
+
"$ref": "#/components/schemas/TimeWindow"
|
|
2251
|
+
},
|
|
2252
|
+
"maxItems": 6,
|
|
2253
|
+
"description": "Working windows for a day, sorted and non-overlapping. An empty array means a day off."
|
|
2254
|
+
},
|
|
2255
|
+
"sunday": {
|
|
2256
|
+
"type": "array",
|
|
2257
|
+
"items": {
|
|
2258
|
+
"$ref": "#/components/schemas/TimeWindow"
|
|
2259
|
+
},
|
|
2260
|
+
"maxItems": 6,
|
|
2261
|
+
"description": "Working windows for a day, sorted and non-overlapping. An empty array means a day off."
|
|
2262
|
+
},
|
|
2263
|
+
"timezone": {
|
|
2264
|
+
"type": "string",
|
|
2265
|
+
"description": "IANA timezone the working windows are expressed in. Defaults to Europe/Berlin.",
|
|
2266
|
+
"default": "Europe/Berlin"
|
|
2267
|
+
}
|
|
2268
|
+
},
|
|
2269
|
+
"required": [
|
|
2270
|
+
"monday",
|
|
2271
|
+
"tuesday",
|
|
2272
|
+
"wednesday",
|
|
2273
|
+
"thursday",
|
|
2274
|
+
"friday",
|
|
2275
|
+
"saturday",
|
|
2276
|
+
"sunday"
|
|
2277
|
+
],
|
|
2278
|
+
"description": "Full replacement of the working-hours record. All weekdays are required; an empty array means a day off. Users without a working-hours record are treated as always available."
|
|
2279
|
+
},
|
|
2280
|
+
"TimeWindow": {
|
|
2281
|
+
"type": "object",
|
|
2282
|
+
"properties": {
|
|
2283
|
+
"start": {
|
|
2284
|
+
"type": "string",
|
|
2285
|
+
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
|
|
2286
|
+
"description": "24h wall-clock time (\"HH:mm\") in the timezone of the working-hours record."
|
|
2287
|
+
},
|
|
2288
|
+
"end": {
|
|
2289
|
+
"type": "string",
|
|
2290
|
+
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
|
|
2291
|
+
"description": "24h wall-clock time (\"HH:mm\") in the timezone of the working-hours record."
|
|
2292
|
+
}
|
|
2293
|
+
},
|
|
2294
|
+
"required": [
|
|
2295
|
+
"start",
|
|
2296
|
+
"end"
|
|
2297
|
+
],
|
|
2298
|
+
"description": "A wall-clock working window within a single day."
|
|
2299
|
+
},
|
|
2300
|
+
"Calendar": {
|
|
2301
|
+
"type": "object",
|
|
2302
|
+
"properties": {
|
|
2303
|
+
"_id": {
|
|
2304
|
+
"type": "string",
|
|
2305
|
+
"description": "epilot calendar ID"
|
|
2306
|
+
},
|
|
2307
|
+
"_schema": {
|
|
2308
|
+
"type": "string",
|
|
2309
|
+
"enum": [
|
|
2310
|
+
"calendar"
|
|
2311
|
+
]
|
|
2312
|
+
},
|
|
2313
|
+
"_org": {
|
|
2314
|
+
"type": "string",
|
|
2315
|
+
"description": "Organization the calendar belongs to"
|
|
2316
|
+
},
|
|
2317
|
+
"_title": {
|
|
2318
|
+
"type": "string",
|
|
2319
|
+
"description": "Computed display title"
|
|
2320
|
+
},
|
|
2321
|
+
"name": {
|
|
2322
|
+
"type": "string",
|
|
2323
|
+
"minLength": 1
|
|
2324
|
+
},
|
|
2325
|
+
"description": {
|
|
2326
|
+
"type": "string",
|
|
2327
|
+
"nullable": true
|
|
2328
|
+
},
|
|
2329
|
+
"color": {
|
|
2330
|
+
"type": "string",
|
|
2331
|
+
"nullable": true,
|
|
2332
|
+
"description": "Hex color (e.g. \"#3b82f6\") or provider-defined named color"
|
|
2333
|
+
},
|
|
2334
|
+
"is_default": {
|
|
2335
|
+
"type": "boolean",
|
|
2336
|
+
"description": "True if the source provider marks this calendar as default"
|
|
2337
|
+
},
|
|
2338
|
+
"is_epilot_default": {
|
|
2339
|
+
"type": "boolean",
|
|
2340
|
+
"description": "True for the epilot default calendar"
|
|
2341
|
+
},
|
|
2342
|
+
"read_only": {
|
|
2343
|
+
"type": "boolean",
|
|
2344
|
+
"description": "True if the caller cannot create, update, or delete events in this calendar"
|
|
2345
|
+
},
|
|
2346
|
+
"owner_email": {
|
|
2347
|
+
"type": "string",
|
|
2348
|
+
"nullable": true,
|
|
2349
|
+
"format": "email"
|
|
2350
|
+
},
|
|
2351
|
+
"source": {
|
|
2352
|
+
"$ref": "#/components/schemas/CalendarSource"
|
|
2353
|
+
},
|
|
2354
|
+
"_created_at": {
|
|
2355
|
+
"type": "string",
|
|
2356
|
+
"format": "date-time"
|
|
2357
|
+
},
|
|
2358
|
+
"_updated_at": {
|
|
2359
|
+
"type": "string",
|
|
2360
|
+
"format": "date-time"
|
|
2361
|
+
}
|
|
2362
|
+
},
|
|
2363
|
+
"required": [
|
|
2364
|
+
"_id",
|
|
2365
|
+
"_schema",
|
|
2366
|
+
"_org",
|
|
2367
|
+
"name",
|
|
2368
|
+
"is_default",
|
|
2369
|
+
"is_epilot_default",
|
|
2370
|
+
"read_only",
|
|
2371
|
+
"source"
|
|
2372
|
+
]
|
|
2373
|
+
},
|
|
2374
|
+
"CalendarSource": {
|
|
2375
|
+
"type": "object",
|
|
2376
|
+
"properties": {
|
|
2377
|
+
"type": {
|
|
2378
|
+
"type": "string",
|
|
2379
|
+
"enum": [
|
|
2380
|
+
"native",
|
|
2381
|
+
"synced"
|
|
2382
|
+
],
|
|
2383
|
+
"description": "`native` = hosted by epilot. `synced` = mirrored from an external provider."
|
|
2384
|
+
},
|
|
2385
|
+
"provider": {
|
|
2386
|
+
"$ref": "#/components/schemas/Provider"
|
|
2387
|
+
},
|
|
2388
|
+
"provider_calendar_id": {
|
|
2389
|
+
"type": "string",
|
|
2390
|
+
"nullable": true
|
|
2391
|
+
},
|
|
2392
|
+
"last_synced_at": {
|
|
2393
|
+
"type": "string",
|
|
2394
|
+
"nullable": true,
|
|
2395
|
+
"format": "date-time"
|
|
2396
|
+
}
|
|
2397
|
+
},
|
|
2398
|
+
"required": [
|
|
2399
|
+
"type"
|
|
2400
|
+
]
|
|
2401
|
+
},
|
|
2402
|
+
"Provider": {
|
|
2403
|
+
"type": "string",
|
|
2404
|
+
"nullable": true,
|
|
2405
|
+
"enum": [
|
|
2406
|
+
"outlook",
|
|
2407
|
+
"google",
|
|
2408
|
+
null
|
|
2409
|
+
],
|
|
2410
|
+
"description": "Null for native epilot calendars"
|
|
2411
|
+
},
|
|
2412
|
+
"CalendarCreateBody": {
|
|
2413
|
+
"type": "object",
|
|
2414
|
+
"properties": {
|
|
2415
|
+
"name": {
|
|
2416
|
+
"type": "string",
|
|
2417
|
+
"minLength": 1
|
|
2418
|
+
},
|
|
2419
|
+
"description": {
|
|
2420
|
+
"type": "string",
|
|
2421
|
+
"nullable": true
|
|
2422
|
+
},
|
|
2423
|
+
"color": {
|
|
2424
|
+
"type": "string",
|
|
2425
|
+
"nullable": true,
|
|
2426
|
+
"description": "Hex color (e.g. \"#3b82f6\") or provider-defined named color"
|
|
2427
|
+
}
|
|
2428
|
+
},
|
|
2429
|
+
"required": [
|
|
2430
|
+
"name"
|
|
2431
|
+
]
|
|
2432
|
+
},
|
|
2433
|
+
"AddOutlookCalendarRequest": {
|
|
2434
|
+
"type": "object",
|
|
2435
|
+
"properties": {
|
|
2436
|
+
"provider_calendar_id": {
|
|
2437
|
+
"type": "string",
|
|
2438
|
+
"minLength": 1
|
|
2439
|
+
},
|
|
2440
|
+
"name": {
|
|
2441
|
+
"type": "string",
|
|
2442
|
+
"minLength": 1,
|
|
2443
|
+
"description": "Optional override; defaults to the provider calendar name."
|
|
2444
|
+
}
|
|
2445
|
+
},
|
|
2446
|
+
"required": [
|
|
2447
|
+
"provider_calendar_id"
|
|
2448
|
+
]
|
|
2449
|
+
},
|
|
2450
|
+
"AvailableOutlookCalendar": {
|
|
2451
|
+
"type": "object",
|
|
2452
|
+
"properties": {
|
|
2453
|
+
"provider_calendar_id": {
|
|
2454
|
+
"type": "string",
|
|
2455
|
+
"description": "Microsoft Graph calendar id (immutable, e.g. base64-encoded)"
|
|
2456
|
+
},
|
|
2457
|
+
"name": {
|
|
2458
|
+
"type": "string"
|
|
2459
|
+
},
|
|
2460
|
+
"color": {
|
|
2461
|
+
"type": "string",
|
|
2462
|
+
"nullable": true
|
|
2463
|
+
},
|
|
2464
|
+
"is_default": {
|
|
2465
|
+
"type": "boolean"
|
|
2466
|
+
},
|
|
2467
|
+
"can_edit": {
|
|
2468
|
+
"type": "boolean"
|
|
2469
|
+
},
|
|
2470
|
+
"owner": {
|
|
2471
|
+
"type": "string",
|
|
2472
|
+
"nullable": true,
|
|
2473
|
+
"description": "Owner email address on the Microsoft side"
|
|
2474
|
+
}
|
|
2475
|
+
},
|
|
2476
|
+
"required": [
|
|
2477
|
+
"provider_calendar_id",
|
|
2478
|
+
"name"
|
|
2479
|
+
]
|
|
2480
|
+
},
|
|
2481
|
+
"CalendarPatchBody": {
|
|
2482
|
+
"type": "object",
|
|
2483
|
+
"properties": {
|
|
2484
|
+
"name": {
|
|
2485
|
+
"type": "string",
|
|
2486
|
+
"minLength": 1
|
|
2487
|
+
},
|
|
2488
|
+
"description": {
|
|
2489
|
+
"type": "string",
|
|
2490
|
+
"nullable": true
|
|
2491
|
+
},
|
|
2492
|
+
"color": {
|
|
2493
|
+
"type": "string",
|
|
2494
|
+
"nullable": true,
|
|
2495
|
+
"description": "Hex color (e.g. \"#3b82f6\") or provider-defined named color"
|
|
2496
|
+
}
|
|
2497
|
+
}
|
|
2498
|
+
},
|
|
2499
|
+
"CalendarEvent": {
|
|
2500
|
+
"type": "object",
|
|
2501
|
+
"properties": {
|
|
2502
|
+
"_id": {
|
|
2503
|
+
"type": "string",
|
|
2504
|
+
"description": "epilot event ID"
|
|
2505
|
+
},
|
|
2506
|
+
"_schema": {
|
|
2507
|
+
"type": "string",
|
|
2508
|
+
"enum": [
|
|
2509
|
+
"calendar_event"
|
|
2510
|
+
]
|
|
2511
|
+
},
|
|
2512
|
+
"_org": {
|
|
2513
|
+
"type": "string"
|
|
2514
|
+
},
|
|
2515
|
+
"_title": {
|
|
2516
|
+
"type": "string",
|
|
2517
|
+
"nullable": true,
|
|
2518
|
+
"description": "Null when sensitivity is private or confidential"
|
|
2519
|
+
},
|
|
2520
|
+
"_tags": {
|
|
2521
|
+
"type": "array",
|
|
2522
|
+
"items": {
|
|
2523
|
+
"type": "string"
|
|
2524
|
+
},
|
|
2525
|
+
"description": "Provider categories (Outlook) or colours (Google) as epilot tags"
|
|
2526
|
+
},
|
|
2527
|
+
"calendar_id": {
|
|
2528
|
+
"type": "string",
|
|
2529
|
+
"minLength": 1,
|
|
2530
|
+
"description": "epilot calendar this event belongs to"
|
|
2531
|
+
},
|
|
2532
|
+
"event_type": {
|
|
2533
|
+
"$ref": "#/components/schemas/EventType"
|
|
2534
|
+
},
|
|
2535
|
+
"description": {
|
|
2536
|
+
"type": "string",
|
|
2537
|
+
"nullable": true,
|
|
2538
|
+
"description": "Preview of the event body, truncated to 255 chars",
|
|
2539
|
+
"maxLength": 255
|
|
2540
|
+
},
|
|
2541
|
+
"start_time": {
|
|
2542
|
+
"type": "string",
|
|
2543
|
+
"format": "date-time",
|
|
2544
|
+
"description": "Event start in UTC"
|
|
2545
|
+
},
|
|
2546
|
+
"end_time": {
|
|
2547
|
+
"type": "string",
|
|
2548
|
+
"format": "date-time",
|
|
2549
|
+
"description": "Event end in UTC"
|
|
2550
|
+
},
|
|
2551
|
+
"timezone": {
|
|
2552
|
+
"type": "string",
|
|
2553
|
+
"minLength": 1,
|
|
2554
|
+
"description": "IANA timezone of the original event (for display)"
|
|
2555
|
+
},
|
|
2556
|
+
"is_all_day": {
|
|
2557
|
+
"type": "boolean"
|
|
2558
|
+
},
|
|
2559
|
+
"location": {
|
|
2560
|
+
"type": "string",
|
|
2561
|
+
"nullable": true
|
|
2562
|
+
},
|
|
2563
|
+
"status": {
|
|
2564
|
+
"$ref": "#/components/schemas/EventStatus"
|
|
2565
|
+
},
|
|
2566
|
+
"busy": {
|
|
2567
|
+
"type": "boolean",
|
|
2568
|
+
"description": "Convenience flag, true when status is busy/oof/tentative"
|
|
2569
|
+
},
|
|
2570
|
+
"is_cancelled": {
|
|
2571
|
+
"type": "boolean",
|
|
2572
|
+
"description": "Whether the event was cancelled but still exists"
|
|
2573
|
+
},
|
|
2574
|
+
"is_draft": {
|
|
2575
|
+
"type": "boolean",
|
|
2576
|
+
"description": "Whether the event is saved as a draft"
|
|
2577
|
+
},
|
|
2578
|
+
"sensitivity": {
|
|
2579
|
+
"$ref": "#/components/schemas/Sensitivity"
|
|
2580
|
+
},
|
|
2581
|
+
"importance": {
|
|
2582
|
+
"$ref": "#/components/schemas/Importance"
|
|
2583
|
+
},
|
|
2584
|
+
"is_online_meeting": {
|
|
2585
|
+
"type": "boolean"
|
|
2586
|
+
},
|
|
2587
|
+
"online_meeting_url": {
|
|
2588
|
+
"type": "string",
|
|
2589
|
+
"nullable": true,
|
|
2590
|
+
"format": "uri",
|
|
2591
|
+
"description": "Teams, Meet, Zoom, or similar join URL"
|
|
2592
|
+
},
|
|
2593
|
+
"web_link": {
|
|
2594
|
+
"type": "string",
|
|
2595
|
+
"nullable": true,
|
|
2596
|
+
"format": "uri",
|
|
2597
|
+
"description": "Deep link to open the event in the originating provider"
|
|
2598
|
+
},
|
|
2599
|
+
"response_status": {
|
|
2600
|
+
"$ref": "#/components/schemas/ResponseStatus"
|
|
2601
|
+
},
|
|
2602
|
+
"organizer_email": {
|
|
2603
|
+
"type": "string",
|
|
2604
|
+
"nullable": true,
|
|
2605
|
+
"format": "email"
|
|
2606
|
+
},
|
|
2607
|
+
"attendees": {
|
|
2608
|
+
"type": "array",
|
|
2609
|
+
"nullable": true,
|
|
2610
|
+
"items": {
|
|
2611
|
+
"$ref": "#/components/schemas/Attendee"
|
|
2612
|
+
},
|
|
2613
|
+
"description": "Null when sensitivity is private or confidential"
|
|
2614
|
+
},
|
|
2615
|
+
"metadata": {
|
|
2616
|
+
"type": "object",
|
|
2617
|
+
"nullable": true,
|
|
2618
|
+
"additionalProperties": {}
|
|
2619
|
+
},
|
|
2620
|
+
"is_recurring": {
|
|
2621
|
+
"type": "boolean"
|
|
2622
|
+
},
|
|
2623
|
+
"series_master_id": {
|
|
2624
|
+
"type": "string",
|
|
2625
|
+
"nullable": true,
|
|
2626
|
+
"description": "ID of the recurring series this occurrence belongs to"
|
|
2627
|
+
},
|
|
2628
|
+
"source": {
|
|
2629
|
+
"$ref": "#/components/schemas/EventSource"
|
|
2630
|
+
},
|
|
2631
|
+
"_created_at": {
|
|
2632
|
+
"type": "string",
|
|
2633
|
+
"format": "date-time"
|
|
2634
|
+
},
|
|
2635
|
+
"_updated_at": {
|
|
2636
|
+
"type": "string",
|
|
2637
|
+
"format": "date-time"
|
|
2638
|
+
}
|
|
2639
|
+
},
|
|
2640
|
+
"required": [
|
|
2641
|
+
"_id",
|
|
2642
|
+
"_schema",
|
|
2643
|
+
"_org",
|
|
2644
|
+
"calendar_id",
|
|
2645
|
+
"event_type",
|
|
2646
|
+
"start_time",
|
|
2647
|
+
"end_time",
|
|
2648
|
+
"timezone",
|
|
2649
|
+
"is_all_day",
|
|
2650
|
+
"status",
|
|
2651
|
+
"busy",
|
|
2652
|
+
"is_cancelled",
|
|
2653
|
+
"is_draft",
|
|
2654
|
+
"sensitivity",
|
|
2655
|
+
"importance",
|
|
2656
|
+
"is_online_meeting",
|
|
2657
|
+
"response_status",
|
|
2658
|
+
"is_recurring",
|
|
2659
|
+
"source"
|
|
2660
|
+
]
|
|
2661
|
+
},
|
|
2662
|
+
"EventType": {
|
|
2663
|
+
"type": "string",
|
|
2664
|
+
"enum": [
|
|
2665
|
+
"singleInstance",
|
|
2666
|
+
"occurrence",
|
|
2667
|
+
"exception",
|
|
2668
|
+
"seriesMaster"
|
|
2669
|
+
]
|
|
2670
|
+
},
|
|
2671
|
+
"EventStatus": {
|
|
2672
|
+
"type": "string",
|
|
2673
|
+
"enum": [
|
|
2674
|
+
"free",
|
|
2675
|
+
"tentative",
|
|
2676
|
+
"busy",
|
|
2677
|
+
"oof",
|
|
2678
|
+
"workingElsewhere",
|
|
2679
|
+
"unknown"
|
|
2680
|
+
],
|
|
2681
|
+
"description": "Free/busy state derived from provider `showAs`"
|
|
2682
|
+
},
|
|
2683
|
+
"Sensitivity": {
|
|
2684
|
+
"type": "string",
|
|
2685
|
+
"enum": [
|
|
2686
|
+
"normal",
|
|
2687
|
+
"personal",
|
|
2688
|
+
"private",
|
|
2689
|
+
"confidential"
|
|
2690
|
+
]
|
|
2691
|
+
},
|
|
2692
|
+
"Importance": {
|
|
2693
|
+
"type": "string",
|
|
2694
|
+
"enum": [
|
|
2695
|
+
"low",
|
|
2696
|
+
"normal",
|
|
2697
|
+
"high"
|
|
2698
|
+
]
|
|
2699
|
+
},
|
|
2700
|
+
"ResponseStatus": {
|
|
2701
|
+
"type": "string",
|
|
2702
|
+
"enum": [
|
|
2703
|
+
"none",
|
|
2704
|
+
"organizer",
|
|
2705
|
+
"tentativelyAccepted",
|
|
2706
|
+
"accepted",
|
|
2707
|
+
"declined",
|
|
2708
|
+
"notResponded"
|
|
2709
|
+
],
|
|
2710
|
+
"description": "Caller's response to the invite"
|
|
2711
|
+
},
|
|
2712
|
+
"Attendee": {
|
|
2713
|
+
"type": "object",
|
|
2714
|
+
"properties": {
|
|
2715
|
+
"email": {
|
|
2716
|
+
"type": "string",
|
|
2717
|
+
"format": "email"
|
|
2718
|
+
},
|
|
2719
|
+
"name": {
|
|
2720
|
+
"type": "string",
|
|
2721
|
+
"nullable": true
|
|
2722
|
+
},
|
|
2723
|
+
"response": {
|
|
2724
|
+
"$ref": "#/components/schemas/ResponseStatus"
|
|
2725
|
+
},
|
|
2726
|
+
"type": {
|
|
2727
|
+
"type": "string",
|
|
2728
|
+
"enum": [
|
|
2729
|
+
"required",
|
|
2730
|
+
"optional",
|
|
2731
|
+
"resource"
|
|
2732
|
+
]
|
|
2733
|
+
}
|
|
2734
|
+
},
|
|
2735
|
+
"required": [
|
|
2736
|
+
"email",
|
|
2737
|
+
"response",
|
|
2738
|
+
"type"
|
|
2739
|
+
]
|
|
2740
|
+
},
|
|
2741
|
+
"EventSource": {
|
|
2742
|
+
"type": "object",
|
|
2743
|
+
"properties": {
|
|
2744
|
+
"type": {
|
|
2745
|
+
"type": "string",
|
|
2746
|
+
"enum": [
|
|
2747
|
+
"native",
|
|
2748
|
+
"synced"
|
|
2749
|
+
],
|
|
2750
|
+
"description": "`native` = hosted by epilot. `synced` = mirrored from an external provider."
|
|
2751
|
+
},
|
|
2752
|
+
"provider": {
|
|
2753
|
+
"$ref": "#/components/schemas/Provider"
|
|
2754
|
+
},
|
|
2755
|
+
"provider_event_id": {
|
|
2756
|
+
"type": "string",
|
|
2757
|
+
"nullable": true
|
|
2758
|
+
},
|
|
2759
|
+
"provider_event_url": {
|
|
2760
|
+
"type": "string",
|
|
2761
|
+
"nullable": true,
|
|
2762
|
+
"format": "uri",
|
|
2763
|
+
"description": "Deep link to open the event in the originating provider"
|
|
2764
|
+
},
|
|
2765
|
+
"last_synced_at": {
|
|
2766
|
+
"type": "string",
|
|
2767
|
+
"nullable": true,
|
|
2768
|
+
"format": "date-time"
|
|
2769
|
+
},
|
|
2770
|
+
"etag": {
|
|
2771
|
+
"type": "string",
|
|
2772
|
+
"nullable": true,
|
|
2773
|
+
"description": "Provider-supplied version tag used for conflict detection"
|
|
2774
|
+
}
|
|
2775
|
+
},
|
|
2776
|
+
"required": [
|
|
2777
|
+
"type"
|
|
2778
|
+
]
|
|
2779
|
+
},
|
|
2780
|
+
"CalendarEventCreateBody": {
|
|
2781
|
+
"type": "object",
|
|
2782
|
+
"properties": {
|
|
2783
|
+
"calendar_id": {
|
|
2784
|
+
"type": "string",
|
|
2785
|
+
"minLength": 1,
|
|
2786
|
+
"description": "Owned calendar ID. Omit this property to use the epilot default calendar."
|
|
2787
|
+
},
|
|
2788
|
+
"description": {
|
|
2789
|
+
"type": "string",
|
|
2790
|
+
"nullable": true,
|
|
2791
|
+
"description": "Preview of the event body, truncated to 255 chars",
|
|
2792
|
+
"maxLength": 255
|
|
2793
|
+
},
|
|
2794
|
+
"start_time": {
|
|
2795
|
+
"type": "string",
|
|
2796
|
+
"format": "date-time",
|
|
2797
|
+
"description": "Event start in UTC"
|
|
2798
|
+
},
|
|
2799
|
+
"end_time": {
|
|
2800
|
+
"type": "string",
|
|
2801
|
+
"format": "date-time",
|
|
2802
|
+
"description": "Event end in UTC"
|
|
2803
|
+
},
|
|
2804
|
+
"timezone": {
|
|
2805
|
+
"type": "string",
|
|
2806
|
+
"minLength": 1,
|
|
2807
|
+
"description": "IANA timezone of the original event (for display)"
|
|
2808
|
+
},
|
|
2809
|
+
"is_all_day": {
|
|
2810
|
+
"type": "boolean"
|
|
2811
|
+
},
|
|
2812
|
+
"location": {
|
|
2813
|
+
"type": "string",
|
|
2814
|
+
"nullable": true
|
|
2815
|
+
},
|
|
2816
|
+
"status": {
|
|
2817
|
+
"$ref": "#/components/schemas/EventStatus"
|
|
2818
|
+
},
|
|
2819
|
+
"sensitivity": {
|
|
2820
|
+
"$ref": "#/components/schemas/Sensitivity"
|
|
2821
|
+
},
|
|
2822
|
+
"metadata": {
|
|
2823
|
+
"type": "object",
|
|
2824
|
+
"nullable": true,
|
|
2825
|
+
"additionalProperties": {}
|
|
2826
|
+
},
|
|
2827
|
+
"_title": {
|
|
2828
|
+
"type": "string",
|
|
2829
|
+
"minLength": 1
|
|
2830
|
+
}
|
|
2831
|
+
},
|
|
2832
|
+
"required": [
|
|
2833
|
+
"start_time",
|
|
2834
|
+
"end_time",
|
|
2835
|
+
"timezone",
|
|
2836
|
+
"is_all_day",
|
|
2837
|
+
"status",
|
|
2838
|
+
"sensitivity",
|
|
2839
|
+
"_title"
|
|
2840
|
+
]
|
|
2841
|
+
},
|
|
2842
|
+
"CalendarEventPatchBody": {
|
|
2843
|
+
"type": "object",
|
|
2844
|
+
"properties": {
|
|
2845
|
+
"description": {
|
|
2846
|
+
"type": "string",
|
|
2847
|
+
"nullable": true,
|
|
2848
|
+
"description": "Preview of the event body, truncated to 255 chars",
|
|
2849
|
+
"maxLength": 255
|
|
2850
|
+
},
|
|
2851
|
+
"start_time": {
|
|
2852
|
+
"type": "string",
|
|
2853
|
+
"format": "date-time",
|
|
2854
|
+
"description": "Event start in UTC"
|
|
2855
|
+
},
|
|
2856
|
+
"end_time": {
|
|
2857
|
+
"type": "string",
|
|
2858
|
+
"format": "date-time",
|
|
2859
|
+
"description": "Event end in UTC"
|
|
2860
|
+
},
|
|
2861
|
+
"timezone": {
|
|
2862
|
+
"type": "string",
|
|
2863
|
+
"minLength": 1,
|
|
2864
|
+
"description": "IANA timezone of the original event (for display)"
|
|
2865
|
+
},
|
|
2866
|
+
"is_all_day": {
|
|
2867
|
+
"type": "boolean"
|
|
2868
|
+
},
|
|
2869
|
+
"location": {
|
|
2870
|
+
"type": "string",
|
|
2871
|
+
"nullable": true
|
|
2872
|
+
},
|
|
2873
|
+
"status": {
|
|
2874
|
+
"$ref": "#/components/schemas/EventStatus"
|
|
2875
|
+
},
|
|
2876
|
+
"is_cancelled": {
|
|
2877
|
+
"type": "boolean",
|
|
2878
|
+
"description": "Whether the event was cancelled but still exists"
|
|
2879
|
+
},
|
|
2880
|
+
"sensitivity": {
|
|
2881
|
+
"$ref": "#/components/schemas/Sensitivity"
|
|
2882
|
+
},
|
|
2883
|
+
"_title": {
|
|
2884
|
+
"type": "string",
|
|
2885
|
+
"minLength": 1
|
|
2886
|
+
}
|
|
2887
|
+
}
|
|
2888
|
+
},
|
|
2889
|
+
"ShareEventBody": {
|
|
2890
|
+
"type": "object",
|
|
2891
|
+
"properties": {
|
|
2892
|
+
"user_id": {
|
|
2893
|
+
"type": "string",
|
|
2894
|
+
"minLength": 1,
|
|
2895
|
+
"description": "epilot user id (same organization) to grant view-only access to this event"
|
|
2896
|
+
}
|
|
2897
|
+
},
|
|
2898
|
+
"required": [
|
|
2899
|
+
"user_id"
|
|
2900
|
+
]
|
|
2901
|
+
}
|
|
2902
|
+
}
|
|
2903
|
+
}
|
|
2904
|
+
}
|