@snokam/mcp-api 0.58.0 → 0.59.0

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.
@@ -0,0 +1,3213 @@
1
+ {
2
+ "openapi": "3.0.1",
3
+ "info": {
4
+ "title": "Recruitment API",
5
+ "description": "Recruitment management API",
6
+ "version": "v1.0.0"
7
+ },
8
+ "servers": [
9
+ {
10
+ "url": "https://recruitment.api.test.snokam.no"
11
+ }
12
+ ],
13
+ "paths": {
14
+ "/v1.0/GetHealth": {
15
+ "get": {
16
+ "tags": [
17
+ "Health"
18
+ ],
19
+ "summary": "Health check",
20
+ "description": "Returns a health check response.",
21
+ "operationId": "GetHealth",
22
+ "responses": {
23
+ "200": {
24
+ "description": "Service is healthy",
25
+ "content": {
26
+ "application/json": {
27
+ "schema": {
28
+ "type": "object"
29
+ }
30
+ }
31
+ },
32
+ "x-ms-summary": "Success"
33
+ }
34
+ }
35
+ }
36
+ },
37
+ "/v1.0/protected/candidates": {
38
+ "get": {
39
+ "tags": [
40
+ "Candidates"
41
+ ],
42
+ "summary": "List recruitment candidates",
43
+ "description": "Returns every candidate document in Sanity — pipeline, applications and archived.",
44
+ "operationId": "ListCandidates",
45
+ "responses": {
46
+ "200": {
47
+ "description": "All candidates",
48
+ "content": {
49
+ "application/json": {
50
+ "schema": {
51
+ "type": "array",
52
+ "items": {
53
+ "$ref": "#/components/schemas/sanityCandidate"
54
+ }
55
+ }
56
+ }
57
+ },
58
+ "x-ms-summary": "Success"
59
+ },
60
+ "401": {
61
+ "description": "No description",
62
+ "x-ms-summary": "Unauthorized"
63
+ }
64
+ },
65
+ "security": [
66
+ {
67
+ "Implicit": [
68
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
69
+ ]
70
+ }
71
+ ]
72
+ },
73
+ "post": {
74
+ "tags": [
75
+ "Candidates"
76
+ ],
77
+ "summary": "Create a fresh admin-initiated candidate",
78
+ "description": "Creates a candidate document directly (not via the public application flow). Caller supplies name + status + track.",
79
+ "operationId": "CreateCandidate",
80
+ "parameters": [
81
+ {
82
+ "name": "notify",
83
+ "in": "query",
84
+ "schema": {
85
+ "type": "boolean"
86
+ },
87
+ "x-ms-summary": "If false, suppress the welcome email/SMS even when the candidate has contact info. Defaults to true."
88
+ }
89
+ ],
90
+ "requestBody": {
91
+ "description": "Initial candidate fields",
92
+ "content": {
93
+ "application/json": {
94
+ "schema": {
95
+ "$ref": "#/components/schemas/createCandidateInput"
96
+ }
97
+ }
98
+ },
99
+ "required": true
100
+ },
101
+ "responses": {
102
+ "201": {
103
+ "description": "The created candidate",
104
+ "content": {
105
+ "application/json": {
106
+ "schema": {
107
+ "$ref": "#/components/schemas/sanityCandidate"
108
+ }
109
+ }
110
+ },
111
+ "x-ms-summary": "Created"
112
+ },
113
+ "400": {
114
+ "description": "Payload of Object",
115
+ "content": {
116
+ "application/json": {
117
+ "schema": {
118
+ "type": "object"
119
+ }
120
+ }
121
+ },
122
+ "x-ms-summary": "Bad Request"
123
+ },
124
+ "401": {
125
+ "description": "No description",
126
+ "x-ms-summary": "Unauthorized"
127
+ }
128
+ },
129
+ "security": [
130
+ {
131
+ "Implicit": [
132
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
133
+ ]
134
+ }
135
+ ]
136
+ }
137
+ },
138
+ "/v1.0/protected/candidates/{id}": {
139
+ "get": {
140
+ "tags": [
141
+ "Candidates"
142
+ ],
143
+ "summary": "Get a candidate by id",
144
+ "description": "Returns a fully-hydrated candidate including references, documents, systems and checklists.",
145
+ "operationId": "GetCandidate",
146
+ "parameters": [
147
+ {
148
+ "name": "id",
149
+ "in": "path",
150
+ "required": true,
151
+ "schema": {
152
+ "type": "string"
153
+ },
154
+ "x-ms-summary": "Candidate Sanity id"
155
+ }
156
+ ],
157
+ "responses": {
158
+ "200": {
159
+ "description": "Payload of SanityCandidate",
160
+ "content": {
161
+ "application/json": {
162
+ "schema": {
163
+ "$ref": "#/components/schemas/sanityCandidate"
164
+ }
165
+ }
166
+ },
167
+ "x-ms-summary": "Success"
168
+ },
169
+ "401": {
170
+ "description": "No description",
171
+ "x-ms-summary": "Unauthorized"
172
+ },
173
+ "404": {
174
+ "description": "No description",
175
+ "x-ms-summary": "Not Found"
176
+ }
177
+ },
178
+ "security": [
179
+ {
180
+ "Implicit": [
181
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
182
+ ]
183
+ }
184
+ ]
185
+ },
186
+ "patch": {
187
+ "tags": [
188
+ "Candidates"
189
+ ],
190
+ "summary": "Patch candidate fields",
191
+ "description": "Updates any subset of candidate fields — status, buddy, recruiter, systems, checklists, contact info.",
192
+ "operationId": "PatchCandidate",
193
+ "parameters": [
194
+ {
195
+ "name": "id",
196
+ "in": "path",
197
+ "required": true,
198
+ "schema": {
199
+ "type": "string"
200
+ },
201
+ "x-ms-summary": "Candidate Sanity id"
202
+ },
203
+ {
204
+ "name": "notify",
205
+ "in": "query",
206
+ "schema": {
207
+ "type": "boolean"
208
+ },
209
+ "x-ms-summary": "If true and the patch changes status, send the candidate the email/SMS for the new status"
210
+ }
211
+ ],
212
+ "requestBody": {
213
+ "description": "Partial candidate fields to update",
214
+ "content": {
215
+ "application/json": {
216
+ "schema": {
217
+ "$ref": "#/components/schemas/sanityPatchCandidate"
218
+ }
219
+ }
220
+ },
221
+ "required": true
222
+ },
223
+ "responses": {
224
+ "200": {
225
+ "description": "The patched candidate",
226
+ "content": {
227
+ "application/json": {
228
+ "schema": {
229
+ "$ref": "#/components/schemas/sanityCandidate"
230
+ }
231
+ }
232
+ },
233
+ "x-ms-summary": "Success"
234
+ },
235
+ "400": {
236
+ "description": "Payload of Object",
237
+ "content": {
238
+ "application/json": {
239
+ "schema": {
240
+ "type": "object"
241
+ }
242
+ }
243
+ },
244
+ "x-ms-summary": "Bad Request"
245
+ },
246
+ "401": {
247
+ "description": "No description",
248
+ "x-ms-summary": "Unauthorized"
249
+ },
250
+ "404": {
251
+ "description": "No description",
252
+ "x-ms-summary": "Not Found"
253
+ }
254
+ },
255
+ "security": [
256
+ {
257
+ "Implicit": [
258
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
259
+ ]
260
+ }
261
+ ]
262
+ }
263
+ },
264
+ "/v1.0/protected/candidates/{id}/notification-preview": {
265
+ "get": {
266
+ "tags": [
267
+ "Candidates"
268
+ ],
269
+ "summary": "Preview the email/SMS that would be sent for a candidate event",
270
+ "description": "Renders the email + SMS templates for the given event using the candidate's current data. Use to populate the confirm modal before a status change.",
271
+ "operationId": "GetCandidateNotificationPreview",
272
+ "parameters": [
273
+ {
274
+ "name": "id",
275
+ "in": "path",
276
+ "required": true,
277
+ "schema": {
278
+ "type": "string"
279
+ },
280
+ "x-ms-summary": "Candidate Sanity id"
281
+ },
282
+ {
283
+ "name": "event",
284
+ "in": "query",
285
+ "required": true,
286
+ "schema": {
287
+ "type": "string"
288
+ },
289
+ "x-ms-summary": "Event name: Created, Introduction, Offer, Signed, Onboarding, UserCreationReview, Offboarding"
290
+ }
291
+ ],
292
+ "responses": {
293
+ "200": {
294
+ "description": "Payload of CandidateNotificationPreview",
295
+ "content": {
296
+ "application/json": {
297
+ "schema": {
298
+ "$ref": "#/components/schemas/candidateNotificationPreview"
299
+ }
300
+ }
301
+ },
302
+ "x-ms-summary": "Success"
303
+ },
304
+ "400": {
305
+ "description": "Payload of Object",
306
+ "content": {
307
+ "application/json": {
308
+ "schema": {
309
+ "type": "object"
310
+ }
311
+ }
312
+ },
313
+ "x-ms-summary": "Bad Request"
314
+ },
315
+ "401": {
316
+ "description": "No description",
317
+ "x-ms-summary": "Unauthorized"
318
+ },
319
+ "404": {
320
+ "description": "No description",
321
+ "x-ms-summary": "Not Found"
322
+ }
323
+ },
324
+ "security": [
325
+ {
326
+ "Implicit": [
327
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
328
+ ]
329
+ }
330
+ ]
331
+ }
332
+ },
333
+ "/v1.0/protected/candidates/notification-preview": {
334
+ "post": {
335
+ "tags": [
336
+ "Candidates"
337
+ ],
338
+ "summary": "Preview a candidate notification before the candidate is created",
339
+ "description": "Used by the create form to render the email/SMS that will be sent on submit, given the in-progress candidate fields. No recruiter resolution — uses the team-fallback signoff.",
340
+ "operationId": "PreviewCandidateNotification",
341
+ "requestBody": {
342
+ "description": "Event + candidate-shaped fields",
343
+ "content": {
344
+ "application/json": {
345
+ "schema": {
346
+ "$ref": "#/components/schemas/candidateNotificationPreviewRequest"
347
+ }
348
+ }
349
+ },
350
+ "required": true
351
+ },
352
+ "responses": {
353
+ "200": {
354
+ "description": "Payload of CandidateNotificationPreview",
355
+ "content": {
356
+ "application/json": {
357
+ "schema": {
358
+ "$ref": "#/components/schemas/candidateNotificationPreview"
359
+ }
360
+ }
361
+ },
362
+ "x-ms-summary": "Success"
363
+ },
364
+ "400": {
365
+ "description": "Payload of Object",
366
+ "content": {
367
+ "application/json": {
368
+ "schema": {
369
+ "type": "object"
370
+ }
371
+ }
372
+ },
373
+ "x-ms-summary": "Bad Request"
374
+ },
375
+ "401": {
376
+ "description": "No description",
377
+ "x-ms-summary": "Unauthorized"
378
+ }
379
+ },
380
+ "security": [
381
+ {
382
+ "Implicit": [
383
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
384
+ ]
385
+ }
386
+ ]
387
+ }
388
+ },
389
+ "/v1.0/protected/candidates/{id}/promote": {
390
+ "post": {
391
+ "tags": [
392
+ "Candidates"
393
+ ],
394
+ "summary": "Promote a public job application to the pipeline",
395
+ "description": "Flips fromApplication=false and bumps status to INTRODUCTION so the candidate appears in the admin pipeline.",
396
+ "operationId": "PromoteApplication",
397
+ "parameters": [
398
+ {
399
+ "name": "id",
400
+ "in": "path",
401
+ "required": true,
402
+ "schema": {
403
+ "type": "string"
404
+ },
405
+ "x-ms-summary": "Candidate Sanity id"
406
+ }
407
+ ],
408
+ "responses": {
409
+ "200": {
410
+ "description": "The promoted candidate",
411
+ "content": {
412
+ "application/json": {
413
+ "schema": {
414
+ "$ref": "#/components/schemas/sanityCandidate"
415
+ }
416
+ }
417
+ },
418
+ "x-ms-summary": "Success"
419
+ },
420
+ "400": {
421
+ "description": "Candidate is not a public job application",
422
+ "content": {
423
+ "application/json": {
424
+ "schema": {
425
+ "type": "object"
426
+ }
427
+ }
428
+ },
429
+ "x-ms-summary": "Bad Request"
430
+ },
431
+ "401": {
432
+ "description": "No description",
433
+ "x-ms-summary": "Unauthorized"
434
+ },
435
+ "404": {
436
+ "description": "No description",
437
+ "x-ms-summary": "Not Found"
438
+ }
439
+ },
440
+ "security": [
441
+ {
442
+ "Implicit": [
443
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
444
+ ]
445
+ }
446
+ ]
447
+ }
448
+ },
449
+ "/v1.0/protected/candidates/{id}/onboard/{system}": {
450
+ "post": {
451
+ "tags": [
452
+ "Candidates"
453
+ ],
454
+ "summary": "Trigger automated onboarding for a single chain step",
455
+ "description": "Re-runs one named onboarding step (slug matches the timeline step ids — e.g. 'microsoft-365', 'license-assignment', 'github-org-invite'). Used by the admin UI's per-step retry button when an earlier chain run partially failed.",
456
+ "operationId": "OnboardCandidateSystem",
457
+ "parameters": [
458
+ {
459
+ "name": "id",
460
+ "in": "path",
461
+ "required": true,
462
+ "schema": {
463
+ "type": "string"
464
+ },
465
+ "x-ms-summary": "Candidate Sanity id"
466
+ },
467
+ {
468
+ "name": "system",
469
+ "in": "path",
470
+ "required": true,
471
+ "schema": {
472
+ "type": "string"
473
+ },
474
+ "x-ms-summary": "System slug (e.g. 'microsoft-365')"
475
+ }
476
+ ],
477
+ "responses": {
478
+ "200": {
479
+ "description": "Uniform onboarding result with status + message",
480
+ "content": {
481
+ "application/json": {
482
+ "schema": {
483
+ "$ref": "#/components/schemas/onboardingResult"
484
+ }
485
+ }
486
+ },
487
+ "x-ms-summary": "Success"
488
+ },
489
+ "400": {
490
+ "description": "Payload of Object",
491
+ "content": {
492
+ "application/json": {
493
+ "schema": {
494
+ "type": "object"
495
+ }
496
+ }
497
+ },
498
+ "x-ms-summary": "Bad Request"
499
+ },
500
+ "401": {
501
+ "description": "No description",
502
+ "x-ms-summary": "Unauthorized"
503
+ },
504
+ "404": {
505
+ "description": "No description",
506
+ "x-ms-summary": "Not Found"
507
+ }
508
+ },
509
+ "security": [
510
+ {
511
+ "Implicit": [
512
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
513
+ ]
514
+ }
515
+ ]
516
+ }
517
+ },
518
+ "/v1.0/protected/candidates/{id}/offboard/{system}": {
519
+ "post": {
520
+ "tags": [
521
+ "Candidates"
522
+ ],
523
+ "summary": "Trigger automated offboarding for a single chain step",
524
+ "description": "Mirror of OnboardCandidateSystem for the offboarding chain. Re-runs one named offboarding step (e.g. 'microsoft-365-disable', 'license-revoke', 'github-org-remove').",
525
+ "operationId": "OffboardCandidateSystem",
526
+ "parameters": [
527
+ {
528
+ "name": "id",
529
+ "in": "path",
530
+ "required": true,
531
+ "schema": {
532
+ "type": "string"
533
+ },
534
+ "x-ms-summary": "Candidate Sanity id"
535
+ },
536
+ {
537
+ "name": "system",
538
+ "in": "path",
539
+ "required": true,
540
+ "schema": {
541
+ "type": "string"
542
+ },
543
+ "x-ms-summary": "Step slug (e.g. 'microsoft-365-disable')"
544
+ }
545
+ ],
546
+ "responses": {
547
+ "200": {
548
+ "description": "Uniform onboarding result with status + message",
549
+ "content": {
550
+ "application/json": {
551
+ "schema": {
552
+ "$ref": "#/components/schemas/onboardingResult"
553
+ }
554
+ }
555
+ },
556
+ "x-ms-summary": "Success"
557
+ },
558
+ "400": {
559
+ "description": "Payload of Object",
560
+ "content": {
561
+ "application/json": {
562
+ "schema": {
563
+ "type": "object"
564
+ }
565
+ }
566
+ },
567
+ "x-ms-summary": "Bad Request"
568
+ },
569
+ "401": {
570
+ "description": "No description",
571
+ "x-ms-summary": "Unauthorized"
572
+ },
573
+ "404": {
574
+ "description": "No description",
575
+ "x-ms-summary": "Not Found"
576
+ }
577
+ },
578
+ "security": [
579
+ {
580
+ "Implicit": [
581
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
582
+ ]
583
+ }
584
+ ]
585
+ }
586
+ },
587
+ "/v1.0/protected/candidates/{id}/onboard-full/stream": {
588
+ "post": {
589
+ "tags": [
590
+ "Candidates"
591
+ ],
592
+ "summary": "Run the onboarding chain with a live SSE event feed",
593
+ "description": "Same chain as /onboard-full but streams Server-Sent Events (`event: step`) as each step starts (`status:running`) and finishes (`succeeded`/`failed`). Closes with `event: done`. Frontend uses fetch streaming so we can pass a Bearer token; EventSource doesn't support custom headers.",
594
+ "operationId": "OnboardCandidateFullStream",
595
+ "parameters": [
596
+ {
597
+ "name": "id",
598
+ "in": "path",
599
+ "required": true,
600
+ "schema": {
601
+ "type": "string"
602
+ }
603
+ }
604
+ ],
605
+ "responses": {
606
+ "200": {
607
+ "description": "No description",
608
+ "x-ms-summary": "SSE stream of OnboardingResult frames"
609
+ }
610
+ },
611
+ "security": [
612
+ {
613
+ "Implicit": [
614
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
615
+ ]
616
+ }
617
+ ]
618
+ }
619
+ },
620
+ "/v1.0/protected/candidates/{id}/onboard-full": {
621
+ "post": {
622
+ "tags": [
623
+ "Candidates"
624
+ ],
625
+ "summary": "Run the full automated onboarding chain",
626
+ "description": "Provisions the candidate's Microsoft 365 user, then triggers an Azure AD → Sanity sync to create the matching employee doc. Returns one OnboardingResult row per step so the admin UI can render a live timeline.",
627
+ "operationId": "OnboardCandidateFull",
628
+ "parameters": [
629
+ {
630
+ "name": "id",
631
+ "in": "path",
632
+ "required": true,
633
+ "schema": {
634
+ "type": "string"
635
+ },
636
+ "x-ms-summary": "Candidate Sanity id"
637
+ }
638
+ ],
639
+ "responses": {
640
+ "200": {
641
+ "description": "Per-step results",
642
+ "content": {
643
+ "application/json": {
644
+ "schema": {
645
+ "type": "array",
646
+ "items": {
647
+ "$ref": "#/components/schemas/onboardingResult"
648
+ }
649
+ }
650
+ }
651
+ },
652
+ "x-ms-summary": "Success"
653
+ },
654
+ "401": {
655
+ "description": "No description",
656
+ "x-ms-summary": "Unauthorized"
657
+ },
658
+ "404": {
659
+ "description": "No description",
660
+ "x-ms-summary": "Not Found"
661
+ }
662
+ },
663
+ "security": [
664
+ {
665
+ "Implicit": [
666
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
667
+ ]
668
+ }
669
+ ]
670
+ }
671
+ },
672
+ "/v1.0/protected/candidates/{id}/offboard-full": {
673
+ "post": {
674
+ "tags": [
675
+ "Candidates"
676
+ ],
677
+ "summary": "Run the full automated offboarding chain",
678
+ "description": "Disables the candidate's Microsoft 365 user and triggers an Azure AD → Sanity sync so the employee doc reflects the disabled state.",
679
+ "operationId": "OffboardCandidateFull",
680
+ "parameters": [
681
+ {
682
+ "name": "id",
683
+ "in": "path",
684
+ "required": true,
685
+ "schema": {
686
+ "type": "string"
687
+ }
688
+ }
689
+ ],
690
+ "responses": {
691
+ "200": {
692
+ "description": "Per-step results",
693
+ "content": {
694
+ "application/json": {
695
+ "schema": {
696
+ "type": "array",
697
+ "items": {
698
+ "$ref": "#/components/schemas/onboardingResult"
699
+ }
700
+ }
701
+ }
702
+ },
703
+ "x-ms-summary": "Success"
704
+ },
705
+ "401": {
706
+ "description": "No description",
707
+ "x-ms-summary": "Unauthorized"
708
+ },
709
+ "404": {
710
+ "description": "No description",
711
+ "x-ms-summary": "Not Found"
712
+ }
713
+ },
714
+ "security": [
715
+ {
716
+ "Implicit": [
717
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
718
+ ]
719
+ }
720
+ ]
721
+ }
722
+ },
723
+ "/v1.0/protected/candidates/{id}/offboard-full/stream": {
724
+ "post": {
725
+ "tags": [
726
+ "Candidates"
727
+ ],
728
+ "summary": "Offboarding chain with a live SSE event feed",
729
+ "description": "Streams the offboarding chain step-by-step as Server-Sent Events. Mirrors /onboard-full/stream.",
730
+ "operationId": "OffboardCandidateFullStream",
731
+ "parameters": [
732
+ {
733
+ "name": "id",
734
+ "in": "path",
735
+ "required": true,
736
+ "schema": {
737
+ "type": "string"
738
+ }
739
+ }
740
+ ],
741
+ "responses": {
742
+ "200": {
743
+ "description": "No description",
744
+ "x-ms-summary": "SSE stream of OnboardingResult frames"
745
+ }
746
+ },
747
+ "security": [
748
+ {
749
+ "Implicit": [
750
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
751
+ ]
752
+ }
753
+ ]
754
+ }
755
+ },
756
+ "/v1.0/protected/candidates/{id}/reject": {
757
+ "post": {
758
+ "tags": [
759
+ "Candidates"
760
+ ],
761
+ "summary": "Reject a candidate",
762
+ "description": "Sets status=REJECTED. Optionally sends an admin-edited rejection email and/or SMS — both default to off so the status flip is the only guaranteed side-effect.",
763
+ "operationId": "RejectCandidate",
764
+ "parameters": [
765
+ {
766
+ "name": "id",
767
+ "in": "path",
768
+ "required": true,
769
+ "schema": {
770
+ "type": "string"
771
+ },
772
+ "x-ms-summary": "Candidate Sanity id"
773
+ }
774
+ ],
775
+ "requestBody": {
776
+ "description": "Optional admin-edited email/SMS draft + per-channel send flags. Omit to reject without notifying.",
777
+ "content": {
778
+ "application/json": {
779
+ "schema": {
780
+ "$ref": "#/components/schemas/rejectCandidateMessage"
781
+ }
782
+ }
783
+ }
784
+ },
785
+ "responses": {
786
+ "200": {
787
+ "description": "Payload of SanityCandidate",
788
+ "content": {
789
+ "application/json": {
790
+ "schema": {
791
+ "$ref": "#/components/schemas/sanityCandidate"
792
+ }
793
+ }
794
+ },
795
+ "x-ms-summary": "Success"
796
+ },
797
+ "401": {
798
+ "description": "No description",
799
+ "x-ms-summary": "Unauthorized"
800
+ },
801
+ "404": {
802
+ "description": "No description",
803
+ "x-ms-summary": "Not Found"
804
+ }
805
+ },
806
+ "security": [
807
+ {
808
+ "Implicit": [
809
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
810
+ ]
811
+ }
812
+ ]
813
+ }
814
+ },
815
+ "/v1.0/protected/candidates/{id}/generate-offer-pdf": {
816
+ "post": {
817
+ "tags": [
818
+ "Candidates"
819
+ ],
820
+ "summary": "Generate the 'Tilbud om ansettelse' PDF and store it on the candidate",
821
+ "description": "Renders the Snøkam offer letter, uploads it as a Sanity file asset, and patches candidate.offerPdf to point at it. Stock percentage is taken from candidate.ownership; salary/pension language and the signing chair are fixed template constants. Re-running overwrites the previous PDF. Returns the updated candidate so the caller can read offerPdf.asset.url without an extra refetch.",
822
+ "operationId": "GenerateOfferPdf",
823
+ "parameters": [
824
+ {
825
+ "name": "id",
826
+ "in": "path",
827
+ "required": true,
828
+ "schema": {
829
+ "type": "string"
830
+ },
831
+ "x-ms-summary": "Candidate Sanity id"
832
+ }
833
+ ],
834
+ "responses": {
835
+ "200": {
836
+ "description": "Payload of SanityCandidate",
837
+ "content": {
838
+ "application/json": {
839
+ "schema": {
840
+ "$ref": "#/components/schemas/sanityCandidate"
841
+ }
842
+ }
843
+ },
844
+ "x-ms-summary": "Success"
845
+ },
846
+ "401": {
847
+ "description": "No description",
848
+ "x-ms-summary": "Unauthorized"
849
+ },
850
+ "404": {
851
+ "description": "No description",
852
+ "x-ms-summary": "Not Found"
853
+ }
854
+ },
855
+ "security": [
856
+ {
857
+ "Implicit": [
858
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
859
+ ]
860
+ }
861
+ ]
862
+ }
863
+ },
864
+ "/v1.0/protected/candidates/{id}/generate-contract-pdf": {
865
+ "post": {
866
+ "tags": [
867
+ "Candidates"
868
+ ],
869
+ "summary": "Generate the 'Ansettelseskontrakt' PDF and store it on the candidate",
870
+ "description": "Renders the Snøkam employment contract template, uploads it as a Sanity file asset, and patches candidate.contractPdf to point at it. The unsigned contract is what the candidate downloads, signs and the admin then uploads back as candidate.signedContract on the SIGNED status flip. Re-running overwrites the previous PDF. Returns the updated candidate so the caller can read contractPdf.asset.url without an extra refetch.",
871
+ "operationId": "GenerateContractPdf",
872
+ "parameters": [
873
+ {
874
+ "name": "id",
875
+ "in": "path",
876
+ "required": true,
877
+ "schema": {
878
+ "type": "string"
879
+ },
880
+ "x-ms-summary": "Candidate Sanity id"
881
+ }
882
+ ],
883
+ "responses": {
884
+ "200": {
885
+ "description": "Payload of SanityCandidate",
886
+ "content": {
887
+ "application/json": {
888
+ "schema": {
889
+ "$ref": "#/components/schemas/sanityCandidate"
890
+ }
891
+ }
892
+ },
893
+ "x-ms-summary": "Success"
894
+ },
895
+ "401": {
896
+ "description": "No description",
897
+ "x-ms-summary": "Unauthorized"
898
+ },
899
+ "404": {
900
+ "description": "No description",
901
+ "x-ms-summary": "Not Found"
902
+ }
903
+ },
904
+ "security": [
905
+ {
906
+ "Implicit": [
907
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
908
+ ]
909
+ }
910
+ ]
911
+ }
912
+ },
913
+ "/v1.0/protected/candidates/{id}/upload-signed-contract": {
914
+ "post": {
915
+ "tags": [
916
+ "Candidates"
917
+ ],
918
+ "summary": "Upload the candidate's signed employment contract",
919
+ "description": "Stores the admin-uploaded signed contract PDF as a Sanity file asset and patches candidate.signedContract. Used by the SIGNED status modal — the candidate-facing /prosess/{id}/signert page renders the resulting PDF inline. Send the file as multipart/form-data under the 'file' field, OR send the raw bytes as the request body with the appropriate Content-Type.",
920
+ "operationId": "UploadSignedContract",
921
+ "parameters": [
922
+ {
923
+ "name": "id",
924
+ "in": "path",
925
+ "required": true,
926
+ "schema": {
927
+ "type": "string"
928
+ },
929
+ "x-ms-summary": "Candidate Sanity id"
930
+ }
931
+ ],
932
+ "requestBody": {
933
+ "description": "Signed contract PDF bytes. Multipart 'file' field is also accepted.",
934
+ "content": {
935
+ "application/pdf": {
936
+ "schema": {
937
+ "type": "string",
938
+ "format": "binary"
939
+ }
940
+ }
941
+ },
942
+ "required": true
943
+ },
944
+ "responses": {
945
+ "200": {
946
+ "description": "Payload of SanityCandidate",
947
+ "content": {
948
+ "application/json": {
949
+ "schema": {
950
+ "$ref": "#/components/schemas/sanityCandidate"
951
+ }
952
+ }
953
+ },
954
+ "x-ms-summary": "Success"
955
+ },
956
+ "400": {
957
+ "description": "Payload of Object",
958
+ "content": {
959
+ "application/json": {
960
+ "schema": {
961
+ "type": "object"
962
+ }
963
+ }
964
+ },
965
+ "x-ms-summary": "Bad Request"
966
+ },
967
+ "401": {
968
+ "description": "No description",
969
+ "x-ms-summary": "Unauthorized"
970
+ },
971
+ "404": {
972
+ "description": "No description",
973
+ "x-ms-summary": "Not Found"
974
+ }
975
+ },
976
+ "security": [
977
+ {
978
+ "Implicit": [
979
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
980
+ ]
981
+ }
982
+ ]
983
+ }
984
+ },
985
+ "/v1.0/protected/candidates/{id}/rejection-suggestion": {
986
+ "post": {
987
+ "tags": [
988
+ "Candidates"
989
+ ],
990
+ "summary": "Draft a personalised rejection email for a candidate",
991
+ "description": "Uses chatgpt-function to generate a Norwegian email + SMS draft based on the candidate, the job position, and optional internal feedback. The admin reviews and edits before deciding whether to send.",
992
+ "operationId": "SuggestRejectionMessage",
993
+ "parameters": [
994
+ {
995
+ "name": "id",
996
+ "in": "path",
997
+ "required": true,
998
+ "schema": {
999
+ "type": "string"
1000
+ },
1001
+ "x-ms-summary": "Candidate Sanity id"
1002
+ }
1003
+ ],
1004
+ "requestBody": {
1005
+ "description": "Optional internal admin notes used as LLM context (never quoted back to the candidate).",
1006
+ "content": {
1007
+ "application/json": {
1008
+ "schema": {
1009
+ "$ref": "#/components/schemas/rejectionSuggestionRequest"
1010
+ }
1011
+ }
1012
+ }
1013
+ },
1014
+ "responses": {
1015
+ "200": {
1016
+ "description": "Payload of RejectionSuggestion",
1017
+ "content": {
1018
+ "application/json": {
1019
+ "schema": {
1020
+ "$ref": "#/components/schemas/rejectionSuggestion"
1021
+ }
1022
+ }
1023
+ },
1024
+ "x-ms-summary": "Success"
1025
+ },
1026
+ "401": {
1027
+ "description": "No description",
1028
+ "x-ms-summary": "Unauthorized"
1029
+ },
1030
+ "404": {
1031
+ "description": "No description",
1032
+ "x-ms-summary": "Not Found"
1033
+ }
1034
+ },
1035
+ "security": [
1036
+ {
1037
+ "Implicit": [
1038
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
1039
+ ]
1040
+ }
1041
+ ]
1042
+ }
1043
+ },
1044
+ "/v1.0/protected/job-positions": {
1045
+ "get": {
1046
+ "tags": [
1047
+ "JobPositions"
1048
+ ],
1049
+ "summary": "List published job positions",
1050
+ "description": "Returns every job position document. Used by the admin stillinger page.",
1051
+ "operationId": "ListJobPositions",
1052
+ "responses": {
1053
+ "200": {
1054
+ "description": "Payload of Array of SanityJobPosition",
1055
+ "content": {
1056
+ "application/json": {
1057
+ "schema": {
1058
+ "type": "array",
1059
+ "items": {
1060
+ "$ref": "#/components/schemas/sanityJobPosition"
1061
+ }
1062
+ }
1063
+ }
1064
+ },
1065
+ "x-ms-summary": "Success"
1066
+ },
1067
+ "401": {
1068
+ "description": "No description",
1069
+ "x-ms-summary": "Unauthorized"
1070
+ }
1071
+ },
1072
+ "security": [
1073
+ {
1074
+ "Implicit": [
1075
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
1076
+ ]
1077
+ }
1078
+ ]
1079
+ }
1080
+ },
1081
+ "/v1.0/protected/systems": {
1082
+ "get": {
1083
+ "tags": [
1084
+ "Systems"
1085
+ ],
1086
+ "summary": "List systems used for onboarding checklists",
1087
+ "description": "Returns every system document. Used by the candidate detail and systems library pages.",
1088
+ "operationId": "ListSystems",
1089
+ "responses": {
1090
+ "200": {
1091
+ "description": "Payload of Array of SanitySystemsInner",
1092
+ "content": {
1093
+ "application/json": {
1094
+ "schema": {
1095
+ "type": "array",
1096
+ "items": {
1097
+ "$ref": "#/components/schemas/sanitySystemsInner"
1098
+ }
1099
+ }
1100
+ }
1101
+ },
1102
+ "x-ms-summary": "Success"
1103
+ },
1104
+ "401": {
1105
+ "description": "No description",
1106
+ "x-ms-summary": "Unauthorized"
1107
+ }
1108
+ },
1109
+ "security": [
1110
+ {
1111
+ "Implicit": [
1112
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
1113
+ ]
1114
+ }
1115
+ ]
1116
+ },
1117
+ "post": {
1118
+ "tags": [
1119
+ "Systems"
1120
+ ],
1121
+ "summary": "Create a system",
1122
+ "description": "Adds a new system to the onboarding/offboarding system library.",
1123
+ "operationId": "CreateSystem",
1124
+ "requestBody": {
1125
+ "content": {
1126
+ "application/json": {
1127
+ "schema": {
1128
+ "$ref": "#/components/schemas/sanityCreateSystem"
1129
+ }
1130
+ }
1131
+ },
1132
+ "required": true
1133
+ },
1134
+ "responses": {
1135
+ "200": {
1136
+ "description": "Payload of SanitySystemsInner",
1137
+ "content": {
1138
+ "application/json": {
1139
+ "schema": {
1140
+ "$ref": "#/components/schemas/sanitySystemsInner"
1141
+ }
1142
+ }
1143
+ },
1144
+ "x-ms-summary": "Success"
1145
+ },
1146
+ "400": {
1147
+ "description": "Payload of Object",
1148
+ "content": {
1149
+ "application/json": {
1150
+ "schema": {
1151
+ "type": "object"
1152
+ }
1153
+ }
1154
+ },
1155
+ "x-ms-summary": "Bad Request"
1156
+ },
1157
+ "401": {
1158
+ "description": "No description",
1159
+ "x-ms-summary": "Unauthorized"
1160
+ }
1161
+ },
1162
+ "security": [
1163
+ {
1164
+ "Implicit": [
1165
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
1166
+ ]
1167
+ }
1168
+ ]
1169
+ }
1170
+ },
1171
+ "/v1.0/protected/onboarding-chain/automated-system-titles": {
1172
+ "get": {
1173
+ "tags": [
1174
+ "Systems"
1175
+ ],
1176
+ "summary": "List systems handled end-to-end by the onboarding chain",
1177
+ "description": "Returns title + maturity status (stable / beta) so the admin UI can badge systems that need no per-row admin action and flag the experimental ones.",
1178
+ "operationId": "GetChainAutomatedSystemTitles",
1179
+ "responses": {
1180
+ "200": {
1181
+ "description": "Payload of Array of ChainAutomatedSystem",
1182
+ "content": {
1183
+ "application/json": {
1184
+ "schema": {
1185
+ "type": "array",
1186
+ "items": {
1187
+ "$ref": "#/components/schemas/chainAutomatedSystem"
1188
+ }
1189
+ }
1190
+ }
1191
+ },
1192
+ "x-ms-summary": "Success"
1193
+ },
1194
+ "401": {
1195
+ "description": "No description",
1196
+ "x-ms-summary": "Unauthorized"
1197
+ }
1198
+ },
1199
+ "security": [
1200
+ {
1201
+ "Implicit": [
1202
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
1203
+ ]
1204
+ }
1205
+ ]
1206
+ }
1207
+ },
1208
+ "/v1.0/protected/onboarding-tasks": {
1209
+ "get": {
1210
+ "tags": [
1211
+ "Tasks"
1212
+ ],
1213
+ "summary": "List every onboarding task",
1214
+ "description": "Returns all onboarding tasks with their Portable Text description so the admin can render an editable checklist with contextual notes.",
1215
+ "operationId": "ListOnboardingTasks",
1216
+ "responses": {
1217
+ "200": {
1218
+ "description": "Payload of Array of SanityTask",
1219
+ "content": {
1220
+ "application/json": {
1221
+ "schema": {
1222
+ "type": "array",
1223
+ "items": {
1224
+ "$ref": "#/components/schemas/sanityTask"
1225
+ }
1226
+ }
1227
+ }
1228
+ },
1229
+ "x-ms-summary": "Success"
1230
+ },
1231
+ "401": {
1232
+ "description": "No description",
1233
+ "x-ms-summary": "Unauthorized"
1234
+ }
1235
+ },
1236
+ "security": [
1237
+ {
1238
+ "Implicit": [
1239
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
1240
+ ]
1241
+ }
1242
+ ]
1243
+ }
1244
+ },
1245
+ "/v1.0/protected/offboarding-tasks": {
1246
+ "get": {
1247
+ "tags": [
1248
+ "Tasks"
1249
+ ],
1250
+ "summary": "List every offboarding task",
1251
+ "description": "Returns all offboarding tasks with their Portable Text description for the admin offboarding checklist.",
1252
+ "operationId": "ListOffboardingTasks",
1253
+ "responses": {
1254
+ "200": {
1255
+ "description": "Payload of Array of SanityTask",
1256
+ "content": {
1257
+ "application/json": {
1258
+ "schema": {
1259
+ "type": "array",
1260
+ "items": {
1261
+ "$ref": "#/components/schemas/sanityTask"
1262
+ }
1263
+ }
1264
+ }
1265
+ },
1266
+ "x-ms-summary": "Success"
1267
+ },
1268
+ "401": {
1269
+ "description": "No description",
1270
+ "x-ms-summary": "Unauthorized"
1271
+ }
1272
+ },
1273
+ "security": [
1274
+ {
1275
+ "Implicit": [
1276
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
1277
+ ]
1278
+ }
1279
+ ]
1280
+ }
1281
+ },
1282
+ "/v1.0/protected/onboarding-tasks/with-reminder": {
1283
+ "get": {
1284
+ "tags": [
1285
+ "Tasks"
1286
+ ],
1287
+ "summary": "List onboarding tasks with a Slack reminder",
1288
+ "description": "Returns onboarding tasks that have reminderWeeksBefore + reminderSlackChannel set. Used by the admin oppgaver page.",
1289
+ "operationId": "ListOnboardingTasksWithReminder",
1290
+ "responses": {
1291
+ "200": {
1292
+ "description": "Payload of Array of SanityOnboardingTask",
1293
+ "content": {
1294
+ "application/json": {
1295
+ "schema": {
1296
+ "type": "array",
1297
+ "items": {
1298
+ "$ref": "#/components/schemas/sanityOnboardingTask"
1299
+ }
1300
+ }
1301
+ }
1302
+ },
1303
+ "x-ms-summary": "Success"
1304
+ },
1305
+ "401": {
1306
+ "description": "No description",
1307
+ "x-ms-summary": "Unauthorized"
1308
+ }
1309
+ },
1310
+ "security": [
1311
+ {
1312
+ "Implicit": [
1313
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
1314
+ ]
1315
+ }
1316
+ ]
1317
+ }
1318
+ },
1319
+ "/v1.0/protected/tasks": {
1320
+ "post": {
1321
+ "tags": [
1322
+ "Tasks"
1323
+ ],
1324
+ "summary": "Create an onboarding or offboarding task",
1325
+ "description": "Adds a new task document to the library with optional Portable Text description and Slack reminder settings.",
1326
+ "operationId": "CreateTask",
1327
+ "requestBody": {
1328
+ "content": {
1329
+ "application/json": {
1330
+ "schema": {
1331
+ "$ref": "#/components/schemas/sanityCreateTask"
1332
+ }
1333
+ }
1334
+ },
1335
+ "required": true
1336
+ },
1337
+ "responses": {
1338
+ "200": {
1339
+ "description": "Payload of SanityTask",
1340
+ "content": {
1341
+ "application/json": {
1342
+ "schema": {
1343
+ "$ref": "#/components/schemas/sanityTask"
1344
+ }
1345
+ }
1346
+ },
1347
+ "x-ms-summary": "Success"
1348
+ },
1349
+ "400": {
1350
+ "description": "Payload of Object",
1351
+ "content": {
1352
+ "application/json": {
1353
+ "schema": {
1354
+ "type": "object"
1355
+ }
1356
+ }
1357
+ },
1358
+ "x-ms-summary": "Bad Request"
1359
+ },
1360
+ "401": {
1361
+ "description": "No description",
1362
+ "x-ms-summary": "Unauthorized"
1363
+ }
1364
+ },
1365
+ "security": [
1366
+ {
1367
+ "Implicit": [
1368
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
1369
+ ]
1370
+ }
1371
+ ]
1372
+ }
1373
+ },
1374
+ "/v1.0/protected/tasks/{id}": {
1375
+ "patch": {
1376
+ "tags": [
1377
+ "Tasks"
1378
+ ],
1379
+ "summary": "Update an onboarding or offboarding task",
1380
+ "description": "Partially updates a task. Omitted fields are left unchanged; pass null to clear an optional field.",
1381
+ "operationId": "PatchTask",
1382
+ "parameters": [
1383
+ {
1384
+ "name": "id",
1385
+ "in": "path",
1386
+ "required": true,
1387
+ "schema": {
1388
+ "type": "string"
1389
+ }
1390
+ }
1391
+ ],
1392
+ "requestBody": {
1393
+ "content": {
1394
+ "application/json": {
1395
+ "schema": {
1396
+ "$ref": "#/components/schemas/sanityPatchTask"
1397
+ }
1398
+ }
1399
+ },
1400
+ "required": true
1401
+ },
1402
+ "responses": {
1403
+ "200": {
1404
+ "description": "Payload of SanityTask",
1405
+ "content": {
1406
+ "application/json": {
1407
+ "schema": {
1408
+ "$ref": "#/components/schemas/sanityTask"
1409
+ }
1410
+ }
1411
+ },
1412
+ "x-ms-summary": "Success"
1413
+ },
1414
+ "400": {
1415
+ "description": "Payload of Object",
1416
+ "content": {
1417
+ "application/json": {
1418
+ "schema": {
1419
+ "type": "object"
1420
+ }
1421
+ }
1422
+ },
1423
+ "x-ms-summary": "Bad Request"
1424
+ },
1425
+ "401": {
1426
+ "description": "No description",
1427
+ "x-ms-summary": "Unauthorized"
1428
+ },
1429
+ "404": {
1430
+ "description": "No description",
1431
+ "x-ms-summary": "Not Found"
1432
+ }
1433
+ },
1434
+ "security": [
1435
+ {
1436
+ "Implicit": [
1437
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
1438
+ ]
1439
+ }
1440
+ ]
1441
+ },
1442
+ "delete": {
1443
+ "tags": [
1444
+ "Tasks"
1445
+ ],
1446
+ "summary": "Delete a task",
1447
+ "description": "Removes a task from the library. Does not touch candidate checklists that reference it.",
1448
+ "operationId": "DeleteTask",
1449
+ "parameters": [
1450
+ {
1451
+ "name": "id",
1452
+ "in": "path",
1453
+ "required": true,
1454
+ "schema": {
1455
+ "type": "string"
1456
+ }
1457
+ }
1458
+ ],
1459
+ "responses": {
1460
+ "200": {
1461
+ "description": "Payload of SanityTask",
1462
+ "content": {
1463
+ "application/json": {
1464
+ "schema": {
1465
+ "$ref": "#/components/schemas/sanityTask"
1466
+ }
1467
+ }
1468
+ },
1469
+ "x-ms-summary": "Success"
1470
+ },
1471
+ "401": {
1472
+ "description": "No description",
1473
+ "x-ms-summary": "Unauthorized"
1474
+ },
1475
+ "404": {
1476
+ "description": "No description",
1477
+ "x-ms-summary": "Not Found"
1478
+ }
1479
+ },
1480
+ "security": [
1481
+ {
1482
+ "Implicit": [
1483
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
1484
+ ]
1485
+ }
1486
+ ]
1487
+ }
1488
+ },
1489
+ "/v1.0/protected/systems/{id}": {
1490
+ "patch": {
1491
+ "tags": [
1492
+ "Systems"
1493
+ ],
1494
+ "summary": "Update a system",
1495
+ "operationId": "PatchSystem",
1496
+ "parameters": [
1497
+ {
1498
+ "name": "id",
1499
+ "in": "path",
1500
+ "required": true,
1501
+ "schema": {
1502
+ "type": "string"
1503
+ }
1504
+ }
1505
+ ],
1506
+ "requestBody": {
1507
+ "content": {
1508
+ "application/json": {
1509
+ "schema": {
1510
+ "$ref": "#/components/schemas/sanityPatchSystem"
1511
+ }
1512
+ }
1513
+ },
1514
+ "required": true
1515
+ },
1516
+ "responses": {
1517
+ "200": {
1518
+ "description": "Payload of SanitySystemsInner",
1519
+ "content": {
1520
+ "application/json": {
1521
+ "schema": {
1522
+ "$ref": "#/components/schemas/sanitySystemsInner"
1523
+ }
1524
+ }
1525
+ },
1526
+ "x-ms-summary": "Success"
1527
+ },
1528
+ "400": {
1529
+ "description": "Payload of Object",
1530
+ "content": {
1531
+ "application/json": {
1532
+ "schema": {
1533
+ "type": "object"
1534
+ }
1535
+ }
1536
+ },
1537
+ "x-ms-summary": "Bad Request"
1538
+ },
1539
+ "401": {
1540
+ "description": "No description",
1541
+ "x-ms-summary": "Unauthorized"
1542
+ },
1543
+ "404": {
1544
+ "description": "No description",
1545
+ "x-ms-summary": "Not Found"
1546
+ }
1547
+ },
1548
+ "security": [
1549
+ {
1550
+ "Implicit": [
1551
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
1552
+ ]
1553
+ }
1554
+ ]
1555
+ },
1556
+ "delete": {
1557
+ "tags": [
1558
+ "Systems"
1559
+ ],
1560
+ "summary": "Delete a system",
1561
+ "operationId": "DeleteSystem",
1562
+ "parameters": [
1563
+ {
1564
+ "name": "id",
1565
+ "in": "path",
1566
+ "required": true,
1567
+ "schema": {
1568
+ "type": "string"
1569
+ }
1570
+ }
1571
+ ],
1572
+ "responses": {
1573
+ "200": {
1574
+ "description": "Payload of SanitySystemsInner",
1575
+ "content": {
1576
+ "application/json": {
1577
+ "schema": {
1578
+ "$ref": "#/components/schemas/sanitySystemsInner"
1579
+ }
1580
+ }
1581
+ },
1582
+ "x-ms-summary": "Success"
1583
+ },
1584
+ "401": {
1585
+ "description": "No description",
1586
+ "x-ms-summary": "Unauthorized"
1587
+ },
1588
+ "404": {
1589
+ "description": "No description",
1590
+ "x-ms-summary": "Not Found"
1591
+ }
1592
+ },
1593
+ "security": [
1594
+ {
1595
+ "Implicit": [
1596
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
1597
+ ]
1598
+ }
1599
+ ]
1600
+ }
1601
+ },
1602
+ "/v1.0/protected/employees": {
1603
+ "get": {
1604
+ "tags": [
1605
+ "Employees"
1606
+ ],
1607
+ "summary": "List employees for buddy/recruiter assignment",
1608
+ "description": "Lightweight employee list used by the candidate detail page's buddy and recruiter dropdowns.",
1609
+ "operationId": "ListRecruitmentEmployees",
1610
+ "responses": {
1611
+ "200": {
1612
+ "description": "Payload of Array of SanityBasicEmployee",
1613
+ "content": {
1614
+ "application/json": {
1615
+ "schema": {
1616
+ "type": "array",
1617
+ "items": {
1618
+ "$ref": "#/components/schemas/sanityBasicEmployee"
1619
+ }
1620
+ }
1621
+ }
1622
+ },
1623
+ "x-ms-summary": "Success"
1624
+ },
1625
+ "401": {
1626
+ "description": "No description",
1627
+ "x-ms-summary": "Unauthorized"
1628
+ }
1629
+ },
1630
+ "security": [
1631
+ {
1632
+ "Implicit": [
1633
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
1634
+ ]
1635
+ }
1636
+ ]
1637
+ }
1638
+ },
1639
+ "/v1.0/protected/candidates/{id}/issue-pin": {
1640
+ "post": {
1641
+ "tags": [
1642
+ "Candidates"
1643
+ ],
1644
+ "summary": "Generate or set a candidate PIN code and SMS it to them",
1645
+ "description": "Issues the six-digit PIN that gates the candidate's tilbud-, signert- and onboarding-side. Pass an empty body to generate a fresh code; pass {\"pin\": \"123456\"} to override with a specific value (handy when the candidate calls in for help). Patches candidate.pin in Sanity and SMSes the code to candidate.telephone via notifications-function. Returns the updated candidate.",
1646
+ "operationId": "IssueCandidatePin",
1647
+ "parameters": [
1648
+ {
1649
+ "name": "id",
1650
+ "in": "path",
1651
+ "required": true,
1652
+ "schema": {
1653
+ "type": "string"
1654
+ },
1655
+ "x-ms-summary": "Candidate Sanity id"
1656
+ }
1657
+ ],
1658
+ "requestBody": {
1659
+ "description": "Optional override",
1660
+ "content": {
1661
+ "application/json": {
1662
+ "schema": {
1663
+ "$ref": "#/components/schemas/issueCandidatePinRequest"
1664
+ }
1665
+ }
1666
+ }
1667
+ },
1668
+ "responses": {
1669
+ "200": {
1670
+ "description": "Payload of SanityCandidate",
1671
+ "content": {
1672
+ "application/json": {
1673
+ "schema": {
1674
+ "$ref": "#/components/schemas/sanityCandidate"
1675
+ }
1676
+ }
1677
+ },
1678
+ "x-ms-summary": "Success"
1679
+ },
1680
+ "400": {
1681
+ "description": "No description",
1682
+ "x-ms-summary": "Invalid PIN value"
1683
+ },
1684
+ "401": {
1685
+ "description": "No description",
1686
+ "x-ms-summary": "Unauthorized"
1687
+ },
1688
+ "404": {
1689
+ "description": "No description",
1690
+ "x-ms-summary": "Not Found"
1691
+ }
1692
+ },
1693
+ "security": [
1694
+ {
1695
+ "Implicit": [
1696
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default"
1697
+ ]
1698
+ }
1699
+ ]
1700
+ }
1701
+ }
1702
+ },
1703
+ "components": {
1704
+ "schemas": {
1705
+ "candidateNotificationPreview": {
1706
+ "type": "object",
1707
+ "properties": {
1708
+ "subject": {
1709
+ "type": "string"
1710
+ },
1711
+ "plainText": {
1712
+ "type": "string"
1713
+ },
1714
+ "htmlBody": {
1715
+ "type": "string"
1716
+ },
1717
+ "smsBody": {
1718
+ "type": "string"
1719
+ },
1720
+ "willSendEmail": {
1721
+ "type": "boolean"
1722
+ },
1723
+ "willSendSms": {
1724
+ "type": "boolean"
1725
+ },
1726
+ "recipientEmail": {
1727
+ "type": "string"
1728
+ },
1729
+ "recipientPhone": {
1730
+ "type": "string"
1731
+ }
1732
+ }
1733
+ },
1734
+ "candidateNotificationPreviewRequest": {
1735
+ "type": "object",
1736
+ "properties": {
1737
+ "ev": {
1738
+ "enum": [
1739
+ 0,
1740
+ 1,
1741
+ 2,
1742
+ 3,
1743
+ 4,
1744
+ 5,
1745
+ 6,
1746
+ 7
1747
+ ],
1748
+ "type": "integer",
1749
+ "format": "int32",
1750
+ "default": 0
1751
+ },
1752
+ "name": {
1753
+ "type": "string"
1754
+ },
1755
+ "email": {
1756
+ "type": "string"
1757
+ },
1758
+ "telephone": {
1759
+ "type": "string"
1760
+ },
1761
+ "recruiterName": {
1762
+ "type": "string"
1763
+ },
1764
+ "recruiterEmail": {
1765
+ "type": "string"
1766
+ }
1767
+ }
1768
+ },
1769
+ "chainAutomatedSystem": {
1770
+ "type": "object",
1771
+ "properties": {
1772
+ "title": {
1773
+ "type": "string"
1774
+ },
1775
+ "status": {
1776
+ "type": "string"
1777
+ }
1778
+ }
1779
+ },
1780
+ "createCandidateInput": {
1781
+ "type": "object",
1782
+ "properties": {
1783
+ "status": {
1784
+ "enum": [
1785
+ "CREATED",
1786
+ "INTRODUCTION",
1787
+ "OFFER",
1788
+ "SIGNED",
1789
+ "ONBOARDING",
1790
+ "USER_CREATION_REVIEW",
1791
+ "OFFBOARDING",
1792
+ "REJECTED"
1793
+ ],
1794
+ "type": "string",
1795
+ "default": "CREATED"
1796
+ },
1797
+ "candidate": {
1798
+ "type": "string"
1799
+ },
1800
+ "email": {
1801
+ "type": "string"
1802
+ },
1803
+ "jobPositionId": {
1804
+ "type": "string"
1805
+ },
1806
+ "recruiter": {
1807
+ "type": "string"
1808
+ },
1809
+ "telephone": {
1810
+ "type": "string"
1811
+ },
1812
+ "additionalProperties": {
1813
+ "type": "object",
1814
+ "additionalProperties": {
1815
+ "type": "object"
1816
+ }
1817
+ }
1818
+ }
1819
+ },
1820
+ "employeeReference": {
1821
+ "type": "object",
1822
+ "properties": {
1823
+ "sanityType": {
1824
+ "enum": [
1825
+ "reference"
1826
+ ],
1827
+ "type": "string",
1828
+ "default": "reference"
1829
+ },
1830
+ "sanityRef": {
1831
+ "type": "string"
1832
+ },
1833
+ "sanityWeak": {
1834
+ "type": "boolean"
1835
+ }
1836
+ }
1837
+ },
1838
+ "issueCandidatePinRequest": {
1839
+ "type": "object",
1840
+ "properties": {
1841
+ "pin": {
1842
+ "type": "string"
1843
+ }
1844
+ }
1845
+ },
1846
+ "jobPositionReference": {
1847
+ "type": "object",
1848
+ "properties": {
1849
+ "sanityType": {
1850
+ "enum": [
1851
+ "reference"
1852
+ ],
1853
+ "type": "string",
1854
+ "default": "reference"
1855
+ },
1856
+ "sanityRef": {
1857
+ "type": "string"
1858
+ },
1859
+ "sanityWeak": {
1860
+ "type": "boolean"
1861
+ }
1862
+ }
1863
+ },
1864
+ "onboardingResult": {
1865
+ "type": "object",
1866
+ "properties": {
1867
+ "step": {
1868
+ "type": "string"
1869
+ },
1870
+ "status": {
1871
+ "type": "string"
1872
+ },
1873
+ "message": {
1874
+ "type": "string"
1875
+ },
1876
+ "preferredEmail": {
1877
+ "type": "string"
1878
+ },
1879
+ "createdAccountId": {
1880
+ "type": "string"
1881
+ },
1882
+ "temporaryPassword": {
1883
+ "type": "string"
1884
+ }
1885
+ }
1886
+ },
1887
+ "pageMetaImage": {
1888
+ "type": "object",
1889
+ "properties": {
1890
+ "sanityType": {
1891
+ "enum": [
1892
+ "image"
1893
+ ],
1894
+ "type": "string",
1895
+ "default": "image"
1896
+ },
1897
+ "asset": {
1898
+ "$ref": "#/components/schemas/sanityImageAssetReference"
1899
+ },
1900
+ "crop": {
1901
+ "$ref": "#/components/schemas/sanityImageCrop"
1902
+ },
1903
+ "hotspot": {
1904
+ "$ref": "#/components/schemas/sanityImageHotspot"
1905
+ },
1906
+ "media": {
1907
+ "type": "object"
1908
+ }
1909
+ }
1910
+ },
1911
+ "rejectCandidateMessage": {
1912
+ "type": "object",
1913
+ "properties": {
1914
+ "subject": {
1915
+ "type": "string"
1916
+ },
1917
+ "plainText": {
1918
+ "type": "string"
1919
+ },
1920
+ "htmlBody": {
1921
+ "type": "string"
1922
+ },
1923
+ "smsBody": {
1924
+ "type": "string"
1925
+ },
1926
+ "sendEmail": {
1927
+ "type": "boolean"
1928
+ },
1929
+ "sendSms": {
1930
+ "type": "boolean"
1931
+ }
1932
+ }
1933
+ },
1934
+ "rejectionSuggestion": {
1935
+ "type": "object",
1936
+ "properties": {
1937
+ "subject": {
1938
+ "type": "string"
1939
+ },
1940
+ "plainText": {
1941
+ "type": "string"
1942
+ },
1943
+ "htmlBody": {
1944
+ "type": "string"
1945
+ },
1946
+ "smsBody": {
1947
+ "type": "string"
1948
+ }
1949
+ }
1950
+ },
1951
+ "rejectionSuggestionRequest": {
1952
+ "type": "object",
1953
+ "properties": {
1954
+ "feedback": {
1955
+ "type": "string"
1956
+ }
1957
+ }
1958
+ },
1959
+ "sanityAssetSourceData": {
1960
+ "type": "object",
1961
+ "properties": {
1962
+ "sanityType": {
1963
+ "enum": [
1964
+ "sanity.assetSourceData"
1965
+ ],
1966
+ "type": "string",
1967
+ "default": "sanity.assetSourceData"
1968
+ },
1969
+ "id": {
1970
+ "type": "string"
1971
+ },
1972
+ "name": {
1973
+ "type": "string"
1974
+ },
1975
+ "url": {
1976
+ "type": "string"
1977
+ }
1978
+ }
1979
+ },
1980
+ "sanityBasicEmployee": {
1981
+ "type": "object",
1982
+ "properties": {
1983
+ "sanityType": {
1984
+ "enum": [
1985
+ "employee"
1986
+ ],
1987
+ "type": "string",
1988
+ "default": "employee"
1989
+ },
1990
+ "email": {
1991
+ "type": "string"
1992
+ },
1993
+ "image": {
1994
+ "$ref": "#/components/schemas/sanityTechnologyWithRelationsProjectsInnerTestimonialsInnerCustomerLogo"
1995
+ },
1996
+ "name": {
1997
+ "type": "string"
1998
+ },
1999
+ "sanityId": {
2000
+ "type": "string"
2001
+ },
2002
+ "slug": {
2003
+ "$ref": "#/components/schemas/slug"
2004
+ },
2005
+ "tags": {
2006
+ "type": "array",
2007
+ "items": {
2008
+ "$ref": "#/components/schemas/sanityTechnologyWithRelationsProjectsInnerTechnologiesInnerParent"
2009
+ }
2010
+ },
2011
+ "telephone": {
2012
+ "type": "string"
2013
+ }
2014
+ }
2015
+ },
2016
+ "sanityCandidate": {
2017
+ "type": "object",
2018
+ "properties": {
2019
+ "sanityType": {
2020
+ "enum": [
2021
+ "candidate"
2022
+ ],
2023
+ "type": "string",
2024
+ "default": "candidate"
2025
+ },
2026
+ "status": {
2027
+ "enum": [
2028
+ "CREATED",
2029
+ "INTRODUCTION",
2030
+ "OFFBOARDING",
2031
+ "OFFER",
2032
+ "ONBOARDING",
2033
+ "REJECTED",
2034
+ "SIGNED",
2035
+ "USER_CREATION_REVIEW"
2036
+ ],
2037
+ "type": "string",
2038
+ "default": "CREATED"
2039
+ },
2040
+ "address": {
2041
+ "$ref": "#/components/schemas/sanityCandidateAddress"
2042
+ },
2043
+ "applicationLetter": {
2044
+ "$ref": "#/components/schemas/sanityCandidateSignedContract"
2045
+ },
2046
+ "applicationOther": {
2047
+ "type": "string"
2048
+ },
2049
+ "bankAccount": {
2050
+ "type": "string"
2051
+ },
2052
+ "buddy": {
2053
+ "$ref": "#/components/schemas/sanityEmployeeManager"
2054
+ },
2055
+ "candidate": {
2056
+ "type": "string"
2057
+ },
2058
+ "contractPdf": {
2059
+ "$ref": "#/components/schemas/sanityCandidateSignedContract"
2060
+ },
2061
+ "contractSignDate": {
2062
+ "type": "string"
2063
+ },
2064
+ "contractSigner": {
2065
+ "$ref": "#/components/schemas/sanityEmployeeManager"
2066
+ },
2067
+ "contractSignerRole": {
2068
+ "type": "string"
2069
+ },
2070
+ "cv": {
2071
+ "$ref": "#/components/schemas/sanityCandidateSignedContract"
2072
+ },
2073
+ "email": {
2074
+ "type": "string"
2075
+ },
2076
+ "employee": {
2077
+ "$ref": "#/components/schemas/sanityEmployeeManager"
2078
+ },
2079
+ "fromApplication": {
2080
+ "type": "boolean"
2081
+ },
2082
+ "githubUsername": {
2083
+ "type": "string"
2084
+ },
2085
+ "grades": {
2086
+ "$ref": "#/components/schemas/sanityCandidateSignedContract"
2087
+ },
2088
+ "jobPosition": {
2089
+ "$ref": "#/components/schemas/sanityCandidateJobPosition"
2090
+ },
2091
+ "offboardingChecklist": {
2092
+ "type": "array",
2093
+ "items": {
2094
+ "$ref": "#/components/schemas/sanityCandidateOffboardingChecklistInner"
2095
+ }
2096
+ },
2097
+ "offerPdf": {
2098
+ "$ref": "#/components/schemas/sanityCandidateSignedContract"
2099
+ },
2100
+ "onboardingChecklist": {
2101
+ "type": "array",
2102
+ "items": {
2103
+ "$ref": "#/components/schemas/sanityCandidateOffboardingChecklistInner"
2104
+ }
2105
+ },
2106
+ "ownership": {
2107
+ "type": "number",
2108
+ "format": "double"
2109
+ },
2110
+ "personalNumber": {
2111
+ "type": "string"
2112
+ },
2113
+ "pin": {
2114
+ "type": "string"
2115
+ },
2116
+ "preferredDisplayName": {
2117
+ "type": "string"
2118
+ },
2119
+ "preferredEmail": {
2120
+ "type": "string"
2121
+ },
2122
+ "profileImage": {
2123
+ "$ref": "#/components/schemas/sanityTvCategoryDashboardsInnerBackgroundImage"
2124
+ },
2125
+ "recruiter": {
2126
+ "$ref": "#/components/schemas/sanityEmployeeManager"
2127
+ },
2128
+ "references": {
2129
+ "type": "array",
2130
+ "items": {
2131
+ "$ref": "#/components/schemas/sanityCandidateReferencesInner"
2132
+ }
2133
+ },
2134
+ "sanityCreatedAt": {
2135
+ "type": "string"
2136
+ },
2137
+ "sanityId": {
2138
+ "type": "string"
2139
+ },
2140
+ "sanityRev": {
2141
+ "type": "string"
2142
+ },
2143
+ "sanityUpdatedAt": {
2144
+ "type": "string"
2145
+ },
2146
+ "shortUrl": {
2147
+ "type": "string"
2148
+ },
2149
+ "signedContract": {
2150
+ "$ref": "#/components/schemas/sanityCandidateSignedContract"
2151
+ },
2152
+ "snapchatUsername": {
2153
+ "type": "string"
2154
+ },
2155
+ "startDate": {
2156
+ "type": "string"
2157
+ },
2158
+ "systemsActive": {
2159
+ "type": "array",
2160
+ "items": {
2161
+ "$ref": "#/components/schemas/sanitySystemsInner"
2162
+ }
2163
+ },
2164
+ "telephone": {
2165
+ "type": "string"
2166
+ },
2167
+ "url": {
2168
+ "type": "string"
2169
+ }
2170
+ }
2171
+ },
2172
+ "sanityCandidateAddress": {
2173
+ "type": "object",
2174
+ "properties": {
2175
+ "city": {
2176
+ "type": "string"
2177
+ },
2178
+ "postalCode": {
2179
+ "type": "string"
2180
+ },
2181
+ "street": {
2182
+ "type": "string"
2183
+ }
2184
+ }
2185
+ },
2186
+ "sanityCandidateJobPosition": {
2187
+ "type": "object",
2188
+ "properties": {
2189
+ "sanityType": {
2190
+ "enum": [
2191
+ "jobPosition"
2192
+ ],
2193
+ "type": "string",
2194
+ "default": "jobPosition"
2195
+ },
2196
+ "askForGrades": {
2197
+ "type": "boolean"
2198
+ },
2199
+ "deadline": {
2200
+ "type": "string"
2201
+ },
2202
+ "description": {
2203
+ "type": "array",
2204
+ "items": {
2205
+ "$ref": "#/components/schemas/sanitySystemsInnerDescriptionInner"
2206
+ }
2207
+ },
2208
+ "image": {
2209
+ "$ref": "#/components/schemas/pageMetaImage"
2210
+ },
2211
+ "metaDescription": {
2212
+ "type": "string"
2213
+ },
2214
+ "sanityCreatedAt": {
2215
+ "type": "string"
2216
+ },
2217
+ "sanityId": {
2218
+ "type": "string"
2219
+ },
2220
+ "sanityRev": {
2221
+ "type": "string"
2222
+ },
2223
+ "sanityUpdatedAt": {
2224
+ "type": "string"
2225
+ },
2226
+ "slug": {
2227
+ "$ref": "#/components/schemas/slug"
2228
+ },
2229
+ "title": {
2230
+ "type": "string"
2231
+ }
2232
+ }
2233
+ },
2234
+ "sanityCandidateOffboardingChecklistInner": {
2235
+ "type": "object",
2236
+ "properties": {
2237
+ "sanityType": {
2238
+ "enum": [
2239
+ "reference"
2240
+ ],
2241
+ "type": "string",
2242
+ "default": "reference"
2243
+ },
2244
+ "sanityKey": {
2245
+ "type": "string"
2246
+ },
2247
+ "sanityRef": {
2248
+ "type": "string"
2249
+ },
2250
+ "sanityWeak": {
2251
+ "type": "boolean"
2252
+ }
2253
+ }
2254
+ },
2255
+ "sanityCandidateReferencesInner": {
2256
+ "type": "object",
2257
+ "properties": {
2258
+ "sanityType": {
2259
+ "enum": [
2260
+ "candidateReference"
2261
+ ],
2262
+ "type": "string",
2263
+ "default": "candidateReference"
2264
+ },
2265
+ "details": {
2266
+ "type": "string"
2267
+ },
2268
+ "email": {
2269
+ "type": "string"
2270
+ },
2271
+ "name": {
2272
+ "type": "string"
2273
+ },
2274
+ "phone": {
2275
+ "type": "string"
2276
+ },
2277
+ "sanityKey": {
2278
+ "type": "string"
2279
+ }
2280
+ }
2281
+ },
2282
+ "sanityCandidateSignedContract": {
2283
+ "type": "object",
2284
+ "properties": {
2285
+ "sanityType": {
2286
+ "enum": [
2287
+ "file"
2288
+ ],
2289
+ "type": "string",
2290
+ "default": "file"
2291
+ },
2292
+ "asset": {
2293
+ "$ref": "#/components/schemas/sanityDocFileAsset"
2294
+ },
2295
+ "media": {
2296
+ "type": "object"
2297
+ }
2298
+ }
2299
+ },
2300
+ "sanityCreateSystem": {
2301
+ "type": "object",
2302
+ "properties": {
2303
+ "description": {
2304
+ "type": "array",
2305
+ "items": {
2306
+ "type": "object"
2307
+ }
2308
+ },
2309
+ "links": {
2310
+ "type": "array",
2311
+ "items": {
2312
+ "type": "string"
2313
+ }
2314
+ },
2315
+ "title": {
2316
+ "type": "string"
2317
+ },
2318
+ "additionalProperties": {
2319
+ "type": "object",
2320
+ "additionalProperties": {
2321
+ "type": "object"
2322
+ }
2323
+ }
2324
+ }
2325
+ },
2326
+ "sanityCreateTask": {
2327
+ "type": "object",
2328
+ "properties": {
2329
+ "type": {
2330
+ "enum": [
2331
+ "onboarding",
2332
+ "offboarding"
2333
+ ],
2334
+ "type": "string",
2335
+ "default": "onboarding"
2336
+ },
2337
+ "description": {
2338
+ "type": "array",
2339
+ "items": {
2340
+ "type": "object"
2341
+ }
2342
+ },
2343
+ "reminderSlackChannel": {
2344
+ "type": "string"
2345
+ },
2346
+ "reminderWeeksBefore": {
2347
+ "type": "number",
2348
+ "format": "double",
2349
+ "nullable": true
2350
+ },
2351
+ "title": {
2352
+ "type": "string"
2353
+ },
2354
+ "additionalProperties": {
2355
+ "type": "object",
2356
+ "additionalProperties": {
2357
+ "type": "object"
2358
+ }
2359
+ }
2360
+ }
2361
+ },
2362
+ "sanityDocFileAsset": {
2363
+ "type": "object",
2364
+ "properties": {
2365
+ "sanityType": {
2366
+ "enum": [
2367
+ "sanity.fileAsset"
2368
+ ],
2369
+ "type": "string",
2370
+ "default": "sanity.fileAsset"
2371
+ },
2372
+ "altText": {
2373
+ "type": "string"
2374
+ },
2375
+ "assetId": {
2376
+ "type": "string"
2377
+ },
2378
+ "description": {
2379
+ "type": "string"
2380
+ },
2381
+ "extension": {
2382
+ "type": "string"
2383
+ },
2384
+ "label": {
2385
+ "type": "string"
2386
+ },
2387
+ "mimeType": {
2388
+ "type": "string"
2389
+ },
2390
+ "originalFilename": {
2391
+ "type": "string"
2392
+ },
2393
+ "path": {
2394
+ "type": "string"
2395
+ },
2396
+ "sanityCreatedAt": {
2397
+ "type": "string"
2398
+ },
2399
+ "sanityId": {
2400
+ "type": "string"
2401
+ },
2402
+ "sanityRev": {
2403
+ "type": "string"
2404
+ },
2405
+ "sanityUpdatedAt": {
2406
+ "type": "string"
2407
+ },
2408
+ "sha1hash": {
2409
+ "type": "string"
2410
+ },
2411
+ "size": {
2412
+ "type": "number",
2413
+ "format": "double"
2414
+ },
2415
+ "source": {
2416
+ "$ref": "#/components/schemas/sanityAssetSourceData"
2417
+ },
2418
+ "title": {
2419
+ "type": "string"
2420
+ },
2421
+ "uploadId": {
2422
+ "type": "string"
2423
+ },
2424
+ "url": {
2425
+ "type": "string"
2426
+ }
2427
+ }
2428
+ },
2429
+ "sanityEmployeeManager": {
2430
+ "type": "object",
2431
+ "properties": {
2432
+ "sanityType": {
2433
+ "enum": [
2434
+ "employee"
2435
+ ],
2436
+ "type": "string",
2437
+ "default": "employee"
2438
+ },
2439
+ "email": {
2440
+ "type": "string"
2441
+ },
2442
+ "image": {
2443
+ "$ref": "#/components/schemas/sanityTechnologyWithRelationsProjectsInnerTestimonialsInnerCustomerLogo"
2444
+ },
2445
+ "name": {
2446
+ "type": "string"
2447
+ },
2448
+ "sanityId": {
2449
+ "type": "string"
2450
+ },
2451
+ "slug": {
2452
+ "$ref": "#/components/schemas/slug"
2453
+ },
2454
+ "tags": {
2455
+ "type": "array",
2456
+ "items": {
2457
+ "$ref": "#/components/schemas/sanityTechnologyWithRelationsProjectsInnerTechnologiesInnerParent"
2458
+ }
2459
+ },
2460
+ "telephone": {
2461
+ "type": "string"
2462
+ }
2463
+ }
2464
+ },
2465
+ "sanityFileAssetReference": {
2466
+ "type": "object",
2467
+ "properties": {
2468
+ "sanityType": {
2469
+ "enum": [
2470
+ "reference"
2471
+ ],
2472
+ "type": "string",
2473
+ "default": "reference"
2474
+ },
2475
+ "sanityRef": {
2476
+ "type": "string"
2477
+ },
2478
+ "sanityWeak": {
2479
+ "type": "boolean"
2480
+ }
2481
+ }
2482
+ },
2483
+ "sanityImageAssetReference": {
2484
+ "type": "object",
2485
+ "properties": {
2486
+ "sanityType": {
2487
+ "enum": [
2488
+ "reference"
2489
+ ],
2490
+ "type": "string",
2491
+ "default": "reference"
2492
+ },
2493
+ "sanityRef": {
2494
+ "type": "string"
2495
+ },
2496
+ "sanityWeak": {
2497
+ "type": "boolean"
2498
+ }
2499
+ }
2500
+ },
2501
+ "sanityImageCrop": {
2502
+ "type": "object",
2503
+ "properties": {
2504
+ "sanityType": {
2505
+ "enum": [
2506
+ "sanity.imageCrop"
2507
+ ],
2508
+ "type": "string",
2509
+ "default": "sanity.imageCrop"
2510
+ },
2511
+ "bottom": {
2512
+ "type": "number",
2513
+ "format": "double"
2514
+ },
2515
+ "left": {
2516
+ "type": "number",
2517
+ "format": "double"
2518
+ },
2519
+ "right": {
2520
+ "type": "number",
2521
+ "format": "double"
2522
+ },
2523
+ "top": {
2524
+ "type": "number",
2525
+ "format": "double"
2526
+ }
2527
+ }
2528
+ },
2529
+ "sanityImageHotspot": {
2530
+ "type": "object",
2531
+ "properties": {
2532
+ "sanityType": {
2533
+ "enum": [
2534
+ "sanity.imageHotspot"
2535
+ ],
2536
+ "type": "string",
2537
+ "default": "sanity.imageHotspot"
2538
+ },
2539
+ "height": {
2540
+ "type": "number",
2541
+ "format": "double"
2542
+ },
2543
+ "width": {
2544
+ "type": "number",
2545
+ "format": "double"
2546
+ },
2547
+ "x": {
2548
+ "type": "number",
2549
+ "format": "double"
2550
+ },
2551
+ "y": {
2552
+ "type": "number",
2553
+ "format": "double"
2554
+ }
2555
+ }
2556
+ },
2557
+ "sanityJobPosition": {
2558
+ "type": "object",
2559
+ "properties": {
2560
+ "sanityType": {
2561
+ "enum": [
2562
+ "jobPosition"
2563
+ ],
2564
+ "type": "string",
2565
+ "default": "jobPosition"
2566
+ },
2567
+ "askForGrades": {
2568
+ "type": "boolean"
2569
+ },
2570
+ "deadline": {
2571
+ "type": "string"
2572
+ },
2573
+ "description": {
2574
+ "type": "array",
2575
+ "items": {
2576
+ "$ref": "#/components/schemas/sanitySystemsInnerDescriptionInner"
2577
+ }
2578
+ },
2579
+ "image": {
2580
+ "$ref": "#/components/schemas/sanityTvCategoryDashboardsInnerBackgroundImage"
2581
+ },
2582
+ "metaDescription": {
2583
+ "type": "string"
2584
+ },
2585
+ "sanityCreatedAt": {
2586
+ "type": "string"
2587
+ },
2588
+ "sanityId": {
2589
+ "type": "string"
2590
+ },
2591
+ "sanityRev": {
2592
+ "type": "string"
2593
+ },
2594
+ "sanityUpdatedAt": {
2595
+ "type": "string"
2596
+ },
2597
+ "slug": {
2598
+ "$ref": "#/components/schemas/slug"
2599
+ },
2600
+ "title": {
2601
+ "type": "string"
2602
+ }
2603
+ }
2604
+ },
2605
+ "sanityOnboardingTask": {
2606
+ "type": "object",
2607
+ "properties": {
2608
+ "type": {
2609
+ "enum": [
2610
+ "onboarding"
2611
+ ],
2612
+ "type": "string",
2613
+ "default": "onboarding"
2614
+ },
2615
+ "remindDaysBefore": {
2616
+ "type": "number",
2617
+ "format": "double"
2618
+ },
2619
+ "sanityCreatedAt": {
2620
+ "type": "string"
2621
+ },
2622
+ "sanityId": {
2623
+ "type": "string"
2624
+ },
2625
+ "sanityRev": {
2626
+ "type": "string"
2627
+ },
2628
+ "sanityType": {
2629
+ "type": "string"
2630
+ },
2631
+ "sanityUpdatedAt": {
2632
+ "type": "string"
2633
+ },
2634
+ "title": {
2635
+ "type": "string"
2636
+ },
2637
+ "additionalProperties": {
2638
+ "type": "object",
2639
+ "additionalProperties": {
2640
+ "type": "object"
2641
+ }
2642
+ }
2643
+ }
2644
+ },
2645
+ "sanityPatchCandidate": {
2646
+ "type": "object",
2647
+ "properties": {
2648
+ "sanityType": {
2649
+ "enum": [
2650
+ "candidate"
2651
+ ],
2652
+ "type": "string",
2653
+ "default": "candidate",
2654
+ "nullable": true
2655
+ },
2656
+ "status": {
2657
+ "enum": [
2658
+ "CREATED",
2659
+ "INTRODUCTION",
2660
+ "OFFER",
2661
+ "SIGNED",
2662
+ "ONBOARDING",
2663
+ "USER_CREATION_REVIEW",
2664
+ "OFFBOARDING",
2665
+ "REJECTED"
2666
+ ],
2667
+ "type": "string",
2668
+ "default": "CREATED",
2669
+ "nullable": true
2670
+ },
2671
+ "address": {
2672
+ "$ref": "#/components/schemas/sanityPatchCandidateAddress"
2673
+ },
2674
+ "applicationLetter": {
2675
+ "$ref": "#/components/schemas/sanityPatchCandidateApplicationLetter"
2676
+ },
2677
+ "applicationOther": {
2678
+ "type": "string"
2679
+ },
2680
+ "bankAccount": {
2681
+ "type": "string"
2682
+ },
2683
+ "buddy": {
2684
+ "$ref": "#/components/schemas/employeeReference"
2685
+ },
2686
+ "candidate": {
2687
+ "type": "string"
2688
+ },
2689
+ "contractPdf": {
2690
+ "$ref": "#/components/schemas/sanityPatchCandidateApplicationLetter"
2691
+ },
2692
+ "contractSignDate": {
2693
+ "type": "string"
2694
+ },
2695
+ "contractSigner": {
2696
+ "$ref": "#/components/schemas/employeeReference"
2697
+ },
2698
+ "contractSignerRole": {
2699
+ "type": "string"
2700
+ },
2701
+ "cv": {
2702
+ "$ref": "#/components/schemas/sanityPatchCandidateApplicationLetter"
2703
+ },
2704
+ "email": {
2705
+ "type": "string"
2706
+ },
2707
+ "employee": {
2708
+ "$ref": "#/components/schemas/employeeReference"
2709
+ },
2710
+ "fromApplication": {
2711
+ "type": "boolean",
2712
+ "nullable": true
2713
+ },
2714
+ "githubUsername": {
2715
+ "type": "string"
2716
+ },
2717
+ "grades": {
2718
+ "$ref": "#/components/schemas/sanityPatchCandidateApplicationLetter"
2719
+ },
2720
+ "jobPosition": {
2721
+ "$ref": "#/components/schemas/jobPositionReference"
2722
+ },
2723
+ "offboardingChecklist": {
2724
+ "type": "array",
2725
+ "items": {
2726
+ "$ref": "#/components/schemas/sanityCandidateOffboardingChecklistInner"
2727
+ }
2728
+ },
2729
+ "offerPdf": {
2730
+ "$ref": "#/components/schemas/sanityPatchCandidateApplicationLetter"
2731
+ },
2732
+ "onboardingChecklist": {
2733
+ "type": "array",
2734
+ "items": {
2735
+ "$ref": "#/components/schemas/sanityCandidateOffboardingChecklistInner"
2736
+ }
2737
+ },
2738
+ "ownership": {
2739
+ "type": "number",
2740
+ "format": "double",
2741
+ "nullable": true
2742
+ },
2743
+ "personalNumber": {
2744
+ "type": "string"
2745
+ },
2746
+ "pin": {
2747
+ "type": "string"
2748
+ },
2749
+ "preferredDisplayName": {
2750
+ "type": "string"
2751
+ },
2752
+ "preferredEmail": {
2753
+ "type": "string"
2754
+ },
2755
+ "profileImage": {
2756
+ "$ref": "#/components/schemas/sanityPatchPageMetaImage"
2757
+ },
2758
+ "recruiter": {
2759
+ "$ref": "#/components/schemas/employeeReference"
2760
+ },
2761
+ "references": {
2762
+ "type": "array",
2763
+ "items": {
2764
+ "$ref": "#/components/schemas/sanityCandidateReferencesInner"
2765
+ }
2766
+ },
2767
+ "shortUrl": {
2768
+ "type": "string"
2769
+ },
2770
+ "signedContract": {
2771
+ "$ref": "#/components/schemas/sanityPatchCandidateApplicationLetter"
2772
+ },
2773
+ "snapchatUsername": {
2774
+ "type": "string"
2775
+ },
2776
+ "startDate": {
2777
+ "type": "string"
2778
+ },
2779
+ "systemsActive": {
2780
+ "type": "array",
2781
+ "items": {
2782
+ "$ref": "#/components/schemas/sanityPatchCandidateSystemsActiveInner"
2783
+ }
2784
+ },
2785
+ "telephone": {
2786
+ "type": "string"
2787
+ },
2788
+ "url": {
2789
+ "type": "string"
2790
+ },
2791
+ "additionalProperties": {
2792
+ "type": "object",
2793
+ "additionalProperties": {
2794
+ "type": "object"
2795
+ }
2796
+ }
2797
+ }
2798
+ },
2799
+ "sanityPatchCandidateAddress": {
2800
+ "type": "object",
2801
+ "properties": {
2802
+ "city": {
2803
+ "type": "string"
2804
+ },
2805
+ "postalCode": {
2806
+ "type": "string"
2807
+ },
2808
+ "street": {
2809
+ "type": "string"
2810
+ }
2811
+ }
2812
+ },
2813
+ "sanityPatchCandidateApplicationLetter": {
2814
+ "type": "object",
2815
+ "properties": {
2816
+ "sanityType": {
2817
+ "enum": [
2818
+ "file"
2819
+ ],
2820
+ "type": "string",
2821
+ "default": "file"
2822
+ },
2823
+ "asset": {
2824
+ "$ref": "#/components/schemas/sanityFileAssetReference"
2825
+ },
2826
+ "media": {
2827
+ "type": "object"
2828
+ }
2829
+ }
2830
+ },
2831
+ "sanityPatchCandidateSystemsActiveInner": {
2832
+ "type": "object",
2833
+ "properties": {
2834
+ "sanityType": {
2835
+ "enum": [
2836
+ "reference"
2837
+ ],
2838
+ "type": "string",
2839
+ "default": "reference"
2840
+ },
2841
+ "sanityKey": {
2842
+ "type": "string"
2843
+ },
2844
+ "sanityRef": {
2845
+ "type": "string"
2846
+ },
2847
+ "sanityWeak": {
2848
+ "type": "boolean"
2849
+ }
2850
+ }
2851
+ },
2852
+ "sanityPatchPageMetaImage": {
2853
+ "type": "object",
2854
+ "properties": {
2855
+ "sanityType": {
2856
+ "enum": [
2857
+ "image"
2858
+ ],
2859
+ "type": "string",
2860
+ "default": "image"
2861
+ },
2862
+ "asset": {
2863
+ "$ref": "#/components/schemas/sanityImageAssetReference"
2864
+ },
2865
+ "crop": {
2866
+ "$ref": "#/components/schemas/sanityImageCrop"
2867
+ },
2868
+ "hotspot": {
2869
+ "$ref": "#/components/schemas/sanityImageHotspot"
2870
+ },
2871
+ "media": {
2872
+ "type": "object"
2873
+ }
2874
+ }
2875
+ },
2876
+ "sanityPatchSystem": {
2877
+ "type": "object",
2878
+ "properties": {
2879
+ "description": {
2880
+ "type": "array",
2881
+ "items": {
2882
+ "type": "object"
2883
+ }
2884
+ },
2885
+ "links": {
2886
+ "type": "array",
2887
+ "items": {
2888
+ "type": "string"
2889
+ }
2890
+ },
2891
+ "title": {
2892
+ "type": "string"
2893
+ },
2894
+ "additionalProperties": {
2895
+ "type": "object",
2896
+ "additionalProperties": {
2897
+ "type": "object"
2898
+ }
2899
+ }
2900
+ }
2901
+ },
2902
+ "sanityPatchTask": {
2903
+ "type": "object",
2904
+ "properties": {
2905
+ "type": {
2906
+ "enum": [
2907
+ "onboarding",
2908
+ "offboarding"
2909
+ ],
2910
+ "type": "string",
2911
+ "default": "onboarding",
2912
+ "nullable": true
2913
+ },
2914
+ "description": {
2915
+ "type": "array",
2916
+ "items": {
2917
+ "type": "object"
2918
+ }
2919
+ },
2920
+ "reminderSlackChannel": {
2921
+ "type": "string"
2922
+ },
2923
+ "reminderWeeksBefore": {
2924
+ "type": "number",
2925
+ "format": "double",
2926
+ "nullable": true
2927
+ },
2928
+ "title": {
2929
+ "type": "string"
2930
+ },
2931
+ "additionalProperties": {
2932
+ "type": "object",
2933
+ "additionalProperties": {
2934
+ "type": "object"
2935
+ }
2936
+ }
2937
+ }
2938
+ },
2939
+ "sanitySystemsInner": {
2940
+ "type": "object",
2941
+ "properties": {
2942
+ "reminderSlackChannel": {
2943
+ "enum": [
2944
+ "#spor-økonomi",
2945
+ "#spor-rekruttering",
2946
+ "#spor-selskapsadmin",
2947
+ "#spor-sosialt",
2948
+ "#spor-utvikling"
2949
+ ],
2950
+ "type": "string",
2951
+ "default": "#spor-økonomi",
2952
+ "nullable": true
2953
+ },
2954
+ "sanityType": {
2955
+ "enum": [
2956
+ "system"
2957
+ ],
2958
+ "type": "string",
2959
+ "default": "system"
2960
+ },
2961
+ "description": {
2962
+ "type": "array",
2963
+ "items": {
2964
+ "$ref": "#/components/schemas/sanitySystemsInnerDescriptionInner"
2965
+ }
2966
+ },
2967
+ "image": {
2968
+ "$ref": "#/components/schemas/sanityTvCategoryDashboardsInnerBackgroundImage"
2969
+ },
2970
+ "links": {
2971
+ "type": "array",
2972
+ "items": {
2973
+ "type": "string"
2974
+ }
2975
+ },
2976
+ "remindDaysBefore": {
2977
+ "type": "number",
2978
+ "format": "double"
2979
+ },
2980
+ "sanityCreatedAt": {
2981
+ "type": "string"
2982
+ },
2983
+ "sanityId": {
2984
+ "type": "string"
2985
+ },
2986
+ "sanityRev": {
2987
+ "type": "string"
2988
+ },
2989
+ "sanityUpdatedAt": {
2990
+ "type": "string"
2991
+ },
2992
+ "title": {
2993
+ "type": "string"
2994
+ }
2995
+ }
2996
+ },
2997
+ "sanitySystemsInnerDescriptionInner": {
2998
+ "type": "object",
2999
+ "properties": {
3000
+ "listItem": {
3001
+ "enum": [
3002
+ "bullet",
3003
+ "number"
3004
+ ],
3005
+ "type": "string",
3006
+ "default": "bullet",
3007
+ "nullable": true
3008
+ },
3009
+ "sanityType": {
3010
+ "enum": [
3011
+ "block"
3012
+ ],
3013
+ "type": "string",
3014
+ "default": "block"
3015
+ },
3016
+ "style": {
3017
+ "enum": [
3018
+ "blockquote",
3019
+ "h1",
3020
+ "h2",
3021
+ "h3",
3022
+ "h4",
3023
+ "h5",
3024
+ "h6",
3025
+ "normal"
3026
+ ],
3027
+ "type": "string",
3028
+ "default": "blockquote",
3029
+ "nullable": true
3030
+ },
3031
+ "children": {
3032
+ "type": "array",
3033
+ "items": {
3034
+ "$ref": "#/components/schemas/componentBlocksInnerOneOfChildrenInner"
3035
+ }
3036
+ },
3037
+ "level": {
3038
+ "type": "number",
3039
+ "format": "double"
3040
+ },
3041
+ "markDefs": {
3042
+ "type": "array",
3043
+ "items": {
3044
+ "$ref": "#/components/schemas/componentBlocksInnerOneOfMarkDefsInner"
3045
+ }
3046
+ },
3047
+ "sanityKey": {
3048
+ "type": "string"
3049
+ }
3050
+ }
3051
+ },
3052
+ "sanityTask": {
3053
+ "type": "object",
3054
+ "properties": {
3055
+ "type": {
3056
+ "enum": [
3057
+ "onboarding",
3058
+ "offboarding"
3059
+ ],
3060
+ "type": "string",
3061
+ "default": "onboarding"
3062
+ },
3063
+ "description": {
3064
+ "type": "array",
3065
+ "items": {
3066
+ "type": "object"
3067
+ }
3068
+ },
3069
+ "reminderSlackChannel": {
3070
+ "type": "string"
3071
+ },
3072
+ "reminderWeeksBefore": {
3073
+ "type": "number",
3074
+ "format": "double",
3075
+ "nullable": true
3076
+ },
3077
+ "sanityCreatedAt": {
3078
+ "type": "string"
3079
+ },
3080
+ "sanityId": {
3081
+ "type": "string"
3082
+ },
3083
+ "sanityRev": {
3084
+ "type": "string"
3085
+ },
3086
+ "sanityType": {
3087
+ "type": "string"
3088
+ },
3089
+ "sanityUpdatedAt": {
3090
+ "type": "string"
3091
+ },
3092
+ "title": {
3093
+ "type": "string"
3094
+ },
3095
+ "additionalProperties": {
3096
+ "type": "object",
3097
+ "additionalProperties": {
3098
+ "type": "object"
3099
+ }
3100
+ }
3101
+ }
3102
+ },
3103
+ "sanityTechnologyWithRelationsProjectsInnerTechnologiesInnerParent": {
3104
+ "type": "object",
3105
+ "properties": {
3106
+ "sanityType": {
3107
+ "enum": [
3108
+ "tag"
3109
+ ],
3110
+ "type": "string",
3111
+ "default": "tag"
3112
+ },
3113
+ "name": {
3114
+ "type": "string"
3115
+ },
3116
+ "sanityId": {
3117
+ "type": "string"
3118
+ },
3119
+ "slug": {
3120
+ "$ref": "#/components/schemas/slug"
3121
+ }
3122
+ }
3123
+ },
3124
+ "sanityTechnologyWithRelationsProjectsInnerTestimonialsInnerCustomerLogo": {
3125
+ "type": "object",
3126
+ "properties": {
3127
+ "sanityType": {
3128
+ "enum": [
3129
+ "image"
3130
+ ],
3131
+ "type": "string",
3132
+ "default": "image"
3133
+ },
3134
+ "asset": {
3135
+ "$ref": "#/components/schemas/sanityTvCategoryDashboardsInnerBackgroundImageAsset"
3136
+ }
3137
+ }
3138
+ },
3139
+ "sanityTvCategoryDashboardsInnerBackgroundImage": {
3140
+ "type": "object",
3141
+ "properties": {
3142
+ "sanityType": {
3143
+ "enum": [
3144
+ "image"
3145
+ ],
3146
+ "type": "string",
3147
+ "default": "image"
3148
+ },
3149
+ "asset": {
3150
+ "$ref": "#/components/schemas/sanityTvCategoryDashboardsInnerBackgroundImageAsset"
3151
+ }
3152
+ }
3153
+ },
3154
+ "sanityTvCategoryDashboardsInnerBackgroundImageAsset": {
3155
+ "type": "object",
3156
+ "properties": {
3157
+ "sanityType": {
3158
+ "enum": [
3159
+ "sanity.imageAsset"
3160
+ ],
3161
+ "type": "string",
3162
+ "default": "sanity.imageAsset"
3163
+ },
3164
+ "mimeType": {
3165
+ "type": "string"
3166
+ },
3167
+ "originalFilename": {
3168
+ "type": "string"
3169
+ },
3170
+ "sanityId": {
3171
+ "type": "string"
3172
+ },
3173
+ "url": {
3174
+ "type": "string"
3175
+ }
3176
+ }
3177
+ },
3178
+ "slug": {
3179
+ "type": "object",
3180
+ "properties": {
3181
+ "sanityType": {
3182
+ "enum": [
3183
+ "slug"
3184
+ ],
3185
+ "type": "string",
3186
+ "default": "slug"
3187
+ },
3188
+ "current": {
3189
+ "type": "string"
3190
+ },
3191
+ "source": {
3192
+ "type": "string"
3193
+ }
3194
+ }
3195
+ }
3196
+ },
3197
+ "securitySchemes": {
3198
+ "Implicit": {
3199
+ "type": "oauth2",
3200
+ "flows": {
3201
+ "implicit": {
3202
+ "authorizationUrl": "https://login.microsoftonline.com/a8533784-aa3c-403b-a61a-1533ecc6e3ed/oauth2/v2.0/authorize",
3203
+ "tokenUrl": "https://login.microsoftonline.com/a8533784-aa3c-403b-a61a-1533ecc6e3ed/oauth2/v2.0/token",
3204
+ "refreshUrl": "https://login.microsoftonline.com/a8533784-aa3c-403b-a61a-1533ecc6e3ed/oauth2/v2.0/token",
3205
+ "scopes": {
3206
+ "api://050da74a-523f-48ba-a9de-e5c8d6805a93/.default": "Default function scope"
3207
+ }
3208
+ }
3209
+ }
3210
+ }
3211
+ }
3212
+ }
3213
+ }