@snokam/mcp-api 0.13.0 → 0.14.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.
@@ -34,26 +34,36 @@
34
34
  }
35
35
  }
36
36
  },
37
- "/v1.0/tenders": {
38
- "get": {
37
+ "/v1.0/tenders/{id}/match-consultants": {
38
+ "post": {
39
39
  "tags": [
40
40
  "Tenders"
41
41
  ],
42
- "summary": "List all tenders",
43
- "operationId": "ListTenders",
42
+ "summary": "Start CV matching for a tender",
43
+ "operationId": "StartCvMatching",
44
+ "parameters": [
45
+ {
46
+ "name": "id",
47
+ "in": "path",
48
+ "required": true,
49
+ "schema": {
50
+ "type": "string"
51
+ }
52
+ }
53
+ ],
44
54
  "responses": {
45
- "200": {
46
- "description": "Payload of Array of Tender",
55
+ "202": {
56
+ "description": "Payload of Object",
47
57
  "content": {
48
58
  "application/json": {
49
59
  "schema": {
50
- "type": "array",
51
- "items": {
52
- "$ref": "#/components/schemas/tender"
53
- }
60
+ "type": "object"
54
61
  }
55
62
  }
56
63
  }
64
+ },
65
+ "404": {
66
+ "description": "No description"
57
67
  }
58
68
  },
59
69
  "security": [
@@ -63,30 +73,32 @@
63
73
  ]
64
74
  }
65
75
  ]
66
- },
76
+ }
77
+ },
78
+ "/v1.0/tenders/ingest": {
67
79
  "post": {
68
80
  "tags": [
69
81
  "Tenders"
70
82
  ],
71
- "summary": "Create a new tender",
72
- "operationId": "CreateTender",
83
+ "summary": "Start tender ingestion",
84
+ "operationId": "StartTenderIngestion",
73
85
  "requestBody": {
74
86
  "content": {
75
87
  "application/json": {
76
88
  "schema": {
77
- "$ref": "#/components/schemas/tender"
89
+ "$ref": "#/components/schemas/ingestionRequest"
78
90
  }
79
91
  }
80
92
  },
81
93
  "required": true
82
94
  },
83
95
  "responses": {
84
- "201": {
85
- "description": "Payload of Tender",
96
+ "202": {
97
+ "description": "Payload of Object",
86
98
  "content": {
87
99
  "application/json": {
88
100
  "schema": {
89
- "$ref": "#/components/schemas/tender"
101
+ "type": "object"
90
102
  }
91
103
  }
92
104
  }
@@ -101,16 +113,16 @@
101
113
  ]
102
114
  }
103
115
  },
104
- "/v1.0/tenders/{id}": {
116
+ "/v1.0/jobs/{jobId}": {
105
117
  "get": {
106
118
  "tags": [
107
- "Tenders"
119
+ "Admin"
108
120
  ],
109
- "summary": "Get a tender by ID",
110
- "operationId": "GetTender",
121
+ "summary": "Get agent job by ID",
122
+ "operationId": "GetAgentJob",
111
123
  "parameters": [
112
124
  {
113
- "name": "id",
125
+ "name": "jobId",
114
126
  "in": "path",
115
127
  "required": true,
116
128
  "schema": {
@@ -120,11 +132,11 @@
120
132
  ],
121
133
  "responses": {
122
134
  "200": {
123
- "description": "Payload of Tender",
135
+ "description": "Payload of AgentJob",
124
136
  "content": {
125
137
  "application/json": {
126
138
  "schema": {
127
- "$ref": "#/components/schemas/tender"
139
+ "$ref": "#/components/schemas/agentJob"
128
140
  }
129
141
  }
130
142
  }
@@ -140,46 +152,63 @@
140
152
  ]
141
153
  }
142
154
  ]
143
- },
144
- "put": {
155
+ }
156
+ },
157
+ "/v1.0/admin/reprocess-ingestion": {
158
+ "post": {
145
159
  "tags": [
146
- "Tenders"
160
+ "Admin"
147
161
  ],
148
- "summary": "Update a tender",
149
- "operationId": "UpdateTender",
162
+ "summary": "Batch reprocess tender ingestion",
163
+ "operationId": "ReprocessIngestion",
150
164
  "parameters": [
151
165
  {
152
- "name": "id",
153
- "in": "path",
154
- "required": true,
166
+ "name": "unmatchedOnly",
167
+ "in": "query",
168
+ "description": "If true, only reprocess tenders with no existing consultant matches",
155
169
  "schema": {
156
- "type": "string"
170
+ "type": "boolean"
157
171
  }
158
172
  }
159
173
  ],
160
- "requestBody": {
161
- "content": {
162
- "application/json": {
163
- "schema": {
164
- "$ref": "#/components/schemas/tender"
174
+ "responses": {
175
+ "200": {
176
+ "description": "Payload of Object",
177
+ "content": {
178
+ "application/json": {
179
+ "schema": {
180
+ "type": "object"
181
+ }
165
182
  }
166
183
  }
167
- },
168
- "required": true
184
+ }
169
185
  },
186
+ "security": [
187
+ {
188
+ "Implicit": [
189
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
190
+ ]
191
+ }
192
+ ]
193
+ }
194
+ },
195
+ "/v1.0/scan/doffin": {
196
+ "post": {
197
+ "tags": [
198
+ "Scan"
199
+ ],
200
+ "summary": "Trigger a Doffin scan immediately",
201
+ "operationId": "TriggerDoffinScan",
170
202
  "responses": {
171
203
  "200": {
172
- "description": "Payload of Tender",
204
+ "description": "Payload of Object",
173
205
  "content": {
174
206
  "application/json": {
175
207
  "schema": {
176
- "$ref": "#/components/schemas/tender"
208
+ "type": "object"
177
209
  }
178
210
  }
179
211
  }
180
- },
181
- "404": {
182
- "description": "No description"
183
212
  }
184
213
  },
185
214
  "security": [
@@ -189,29 +218,123 @@
189
218
  ]
190
219
  }
191
220
  ]
192
- },
193
- "delete": {
221
+ }
222
+ },
223
+ "/v1.0/scan/email": {
224
+ "post": {
194
225
  "tags": [
195
- "Tenders"
226
+ "Scan"
196
227
  ],
197
- "summary": "Delete a tender",
198
- "operationId": "DeleteTender",
228
+ "summary": "Trigger an email scan immediately",
229
+ "operationId": "TriggerEmailScan",
230
+ "responses": {
231
+ "200": {
232
+ "description": "Payload of Object",
233
+ "content": {
234
+ "application/json": {
235
+ "schema": {
236
+ "type": "object"
237
+ }
238
+ }
239
+ }
240
+ }
241
+ },
242
+ "security": [
243
+ {
244
+ "Implicit": [
245
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
246
+ ]
247
+ }
248
+ ]
249
+ }
250
+ },
251
+ "/v1.0/scan/sites": {
252
+ "post": {
253
+ "tags": [
254
+ "Scan"
255
+ ],
256
+ "summary": "Trigger an agentic site scan immediately over all configured sources",
257
+ "operationId": "TriggerSiteScan",
258
+ "responses": {
259
+ "200": {
260
+ "description": "Payload of Object",
261
+ "content": {
262
+ "application/json": {
263
+ "schema": {
264
+ "type": "object"
265
+ }
266
+ }
267
+ }
268
+ }
269
+ },
270
+ "security": [
271
+ {
272
+ "Implicit": [
273
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
274
+ ]
275
+ }
276
+ ]
277
+ }
278
+ },
279
+ "/v1.0/admin/reprocess-emails": {
280
+ "post": {
281
+ "tags": [
282
+ "Admin"
283
+ ],
284
+ "summary": "Re-fetch all emails since N days ago and re-ingest them so raw content is stored as source_email blobs",
285
+ "operationId": "ReprocessEmails",
199
286
  "parameters": [
200
287
  {
201
- "name": "id",
202
- "in": "path",
203
- "required": true,
288
+ "name": "daysSince",
289
+ "in": "query",
290
+ "description": "Number of days back to fetch emails (default: 90)",
204
291
  "schema": {
205
292
  "type": "string"
206
293
  }
207
294
  }
208
295
  ],
209
296
  "responses": {
210
- "204": {
211
- "description": "No description"
212
- },
213
- "404": {
214
- "description": "No description"
297
+ "200": {
298
+ "description": "Payload of Object",
299
+ "content": {
300
+ "application/json": {
301
+ "schema": {
302
+ "type": "object"
303
+ }
304
+ }
305
+ }
306
+ }
307
+ }
308
+ }
309
+ },
310
+ "/v1.0/crawl/jobs/reap-zombies": {
311
+ "post": {
312
+ "tags": [
313
+ "Crawl"
314
+ ],
315
+ "summary": "Manually fail pending/running jobs older than 15 min (same logic as the every-5-min timer)",
316
+ "operationId": "ReapZombieJobsManual",
317
+ "parameters": [
318
+ {
319
+ "name": "thresholdMinutes",
320
+ "in": "query",
321
+ "description": "Override the 15 min threshold (1-180)",
322
+ "schema": {
323
+ "type": "integer",
324
+ "format": "int32"
325
+ }
326
+ }
327
+ ],
328
+ "responses": {
329
+ "200": {
330
+ "description": "Payload of ZombieReapResult",
331
+ "content": {
332
+ "application/json": {
333
+ "schema": {
334
+ "$ref": "#/components/schemas/zombieReapResult"
335
+ }
336
+ }
337
+ }
215
338
  }
216
339
  },
217
340
  "security": [
@@ -223,32 +346,41 @@
223
346
  ]
224
347
  }
225
348
  },
226
- "/v1.0/tenders/{id}/runs": {
349
+ "/v1.0/tenders/{tenderId}/audit": {
227
350
  "get": {
228
351
  "tags": [
229
- "Tenders"
352
+ "Audit"
230
353
  ],
231
- "summary": "List parser runs for a tender",
232
- "operationId": "ListParseRuns",
354
+ "summary": "Recent audit events for a single tender, newest first",
355
+ "operationId": "GetTenderAudit",
233
356
  "parameters": [
234
357
  {
235
- "name": "id",
358
+ "name": "tenderId",
236
359
  "in": "path",
237
360
  "required": true,
238
361
  "schema": {
239
362
  "type": "string"
240
363
  }
364
+ },
365
+ {
366
+ "name": "limit",
367
+ "in": "query",
368
+ "description": "Max events to return (default 50, max 500)",
369
+ "schema": {
370
+ "type": "integer",
371
+ "format": "int32"
372
+ }
241
373
  }
242
374
  ],
243
375
  "responses": {
244
376
  "200": {
245
- "description": "Payload of Array of ParseRun",
377
+ "description": "Payload of Array of AuditEvent",
246
378
  "content": {
247
379
  "application/json": {
248
380
  "schema": {
249
381
  "type": "array",
250
382
  "items": {
251
- "$ref": "#/components/schemas/parseRun"
383
+ "$ref": "#/components/schemas/auditEvent"
252
384
  }
253
385
  }
254
386
  }
@@ -262,36 +394,87 @@
262
394
  ]
263
395
  }
264
396
  ]
265
- },
266
- "post": {
397
+ }
398
+ },
399
+ "/v1.0/audit/recent": {
400
+ "get": {
401
+ "tags": [
402
+ "Audit"
403
+ ],
404
+ "summary": "Recent audit events across all tenders, newest first",
405
+ "operationId": "GetRecentAudit",
406
+ "parameters": [
407
+ {
408
+ "name": "limit",
409
+ "in": "query",
410
+ "description": "Max events to return (default 100, max 1000)",
411
+ "schema": {
412
+ "type": "integer",
413
+ "format": "int32"
414
+ }
415
+ },
416
+ {
417
+ "name": "sinceHours",
418
+ "in": "query",
419
+ "description": "Only events from the last N hours (default 24)",
420
+ "schema": {
421
+ "type": "integer",
422
+ "format": "int32"
423
+ }
424
+ }
425
+ ],
426
+ "responses": {
427
+ "200": {
428
+ "description": "Payload of Array of AuditEvent",
429
+ "content": {
430
+ "application/json": {
431
+ "schema": {
432
+ "type": "array",
433
+ "items": {
434
+ "$ref": "#/components/schemas/auditEvent"
435
+ }
436
+ }
437
+ }
438
+ }
439
+ }
440
+ },
441
+ "security": [
442
+ {
443
+ "Implicit": [
444
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
445
+ ]
446
+ }
447
+ ]
448
+ }
449
+ },
450
+ "/v1.0/tenders/funnel": {
451
+ "get": {
267
452
  "tags": [
268
453
  "Tenders"
269
454
  ],
270
- "summary": "Trigger a new parser run on a tender's source files",
271
- "operationId": "CreateParseRun",
455
+ "summary": "Pipeline funnel analytics: stage counts, conversion rates, cycle times",
456
+ "operationId": "GetTenderFunnel",
272
457
  "parameters": [
273
458
  {
274
- "name": "id",
275
- "in": "path",
276
- "required": true,
459
+ "name": "windowDays",
460
+ "in": "query",
461
+ "description": "Rolling window in days (default 30, max 365)",
277
462
  "schema": {
278
- "type": "string"
463
+ "type": "integer",
464
+ "format": "int32"
279
465
  }
280
466
  }
281
467
  ],
282
468
  "responses": {
283
- "201": {
284
- "description": "Payload of ParseRun",
469
+ "200": {
470
+ "description": "Payload of FunnelResponse",
285
471
  "content": {
286
472
  "application/json": {
287
473
  "schema": {
288
- "$ref": "#/components/schemas/parseRun"
474
+ "$ref": "#/components/schemas/funnelResponse"
289
475
  }
290
476
  }
291
477
  }
292
- },
293
- "404": {
294
- "description": "No description"
295
478
  }
296
479
  },
297
480
  "security": [
@@ -302,107 +485,3360 @@
302
485
  }
303
486
  ]
304
487
  }
305
- }
306
- },
307
- "components": {
308
- "schemas": {
309
- "consultantMatch": {
310
- "type": "object",
311
- "properties": {
312
- "consultantId": {
313
- "type": "string",
314
- "nullable": true
315
- },
316
- "name": {
317
- "type": "string",
318
- "nullable": true
319
- },
320
- "fitScore": {
321
- "type": "number",
322
- "format": "double",
323
- "nullable": true
324
- },
325
- "availabilityStatus": {
326
- "type": "string",
327
- "nullable": true
328
- },
488
+ },
489
+ "/v1.0/tenders/stats": {
490
+ "get": {
491
+ "tags": [
492
+ "Tenders"
493
+ ],
494
+ "summary": "Aggregated tender KPIs for the admin dashboard (by status/stage/health + activity window)",
495
+ "operationId": "GetTenderStats",
496
+ "parameters": [
497
+ {
498
+ "name": "windowDays",
499
+ "in": "query",
500
+ "description": "Rolling window for activity-based metrics (defaults to 30, max 365)",
501
+ "schema": {
502
+ "type": "integer",
503
+ "format": "int32"
504
+ }
505
+ }
506
+ ],
507
+ "responses": {
508
+ "200": {
509
+ "description": "Payload of TenderStatsResponse",
510
+ "content": {
511
+ "application/json": {
512
+ "schema": {
513
+ "$ref": "#/components/schemas/tenderStatsResponse"
514
+ }
515
+ }
516
+ }
517
+ }
518
+ },
519
+ "security": [
520
+ {
521
+ "Implicit": [
522
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
523
+ ]
524
+ }
525
+ ]
526
+ }
527
+ },
528
+ "/v1.0/consultants/stats": {
529
+ "get": {
530
+ "tags": [
531
+ "Consultants"
532
+ ],
533
+ "summary": "Aggregated consultant KPIs (total, availability split, avg fit score from latest matches)",
534
+ "operationId": "GetConsultantStats",
535
+ "responses": {
536
+ "200": {
537
+ "description": "Payload of ConsultantStatsResponse",
538
+ "content": {
539
+ "application/json": {
540
+ "schema": {
541
+ "$ref": "#/components/schemas/consultantStatsResponse"
542
+ }
543
+ }
544
+ }
545
+ }
546
+ },
547
+ "security": [
548
+ {
549
+ "Implicit": [
550
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
551
+ ]
552
+ }
553
+ ]
554
+ }
555
+ },
556
+ "/v1.0/crawl/sources": {
557
+ "get": {
558
+ "tags": [
559
+ "Crawl"
560
+ ],
561
+ "summary": "List configured crawl sources together with their learned patterns and last-activity timestamp",
562
+ "operationId": "ListCrawlSources",
563
+ "responses": {
564
+ "200": {
565
+ "description": "Payload of Array of CrawlSourceWithPattern",
566
+ "content": {
567
+ "application/json": {
568
+ "schema": {
569
+ "type": "array",
570
+ "items": {
571
+ "$ref": "#/components/schemas/crawlSourceWithPattern"
572
+ }
573
+ }
574
+ }
575
+ }
576
+ }
577
+ },
578
+ "security": [
579
+ {
580
+ "Implicit": [
581
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
582
+ ]
583
+ }
584
+ ]
585
+ }
586
+ },
587
+ "/v1.0/crawl/sources/{name}": {
588
+ "put": {
589
+ "tags": [
590
+ "Crawl"
591
+ ],
592
+ "summary": "Create or update a crawl source",
593
+ "operationId": "UpsertCrawlSource",
594
+ "requestBody": {
595
+ "content": {
596
+ "application/json": {
597
+ "schema": {
598
+ "$ref": "#/components/schemas/crawlSourceUpsertRequest"
599
+ }
600
+ }
601
+ }
602
+ },
603
+ "responses": {
604
+ "200": {
605
+ "description": "Payload of CrawlSourceConfig",
606
+ "content": {
607
+ "application/json": {
608
+ "schema": {
609
+ "$ref": "#/components/schemas/crawlSourceConfig"
610
+ }
611
+ }
612
+ }
613
+ },
614
+ "400": {
615
+ "description": "No description"
616
+ }
617
+ },
618
+ "security": [
619
+ {
620
+ "Implicit": [
621
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
622
+ ]
623
+ }
624
+ ]
625
+ },
626
+ "delete": {
627
+ "tags": [
628
+ "Crawl"
629
+ ],
630
+ "summary": "Delete a crawl source and its cached pattern",
631
+ "operationId": "DeleteCrawlSource",
632
+ "responses": {
633
+ "204": {
634
+ "description": "No description"
635
+ }
636
+ },
637
+ "security": [
638
+ {
639
+ "Implicit": [
640
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
641
+ ]
642
+ }
643
+ ]
644
+ }
645
+ },
646
+ "/v1.0/crawl/sources/{name}/pattern": {
647
+ "delete": {
648
+ "tags": [
649
+ "Crawl"
650
+ ],
651
+ "summary": "Drop the cached URL pattern for a source so the next scan re-bootstraps it",
652
+ "operationId": "InvalidateCrawlPattern",
653
+ "responses": {
654
+ "204": {
655
+ "description": "No description"
656
+ }
657
+ },
658
+ "security": [
659
+ {
660
+ "Implicit": [
661
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
662
+ ]
663
+ }
664
+ ]
665
+ }
666
+ },
667
+ "/v1.0/crawl/discover-listing": {
668
+ "post": {
669
+ "tags": [
670
+ "Crawl"
671
+ ],
672
+ "summary": "Given a site homepage or bare domain, locate the tender/project listing page on it",
673
+ "operationId": "DiscoverCrawlListing",
674
+ "requestBody": {
675
+ "content": {
676
+ "application/json": {
677
+ "schema": {
678
+ "$ref": "#/components/schemas/discoverListingRequest"
679
+ }
680
+ }
681
+ }
682
+ },
683
+ "responses": {
684
+ "200": {
685
+ "description": "Payload of DiscoverListingResponse",
686
+ "content": {
687
+ "application/json": {
688
+ "schema": {
689
+ "$ref": "#/components/schemas/discoverListingResponse"
690
+ }
691
+ }
692
+ }
693
+ }
694
+ },
695
+ "security": [
696
+ {
697
+ "Implicit": [
698
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
699
+ ]
700
+ }
701
+ ]
702
+ }
703
+ },
704
+ "/v1.0/crawl/sources/{name}/scan": {
705
+ "post": {
706
+ "tags": [
707
+ "Crawl"
708
+ ],
709
+ "summary": "Scan one source now and enqueue ingestion jobs for newly discovered notices",
710
+ "operationId": "ScanCrawlSource",
711
+ "responses": {
712
+ "200": {
713
+ "description": "Payload of CrawlScanResponse",
714
+ "content": {
715
+ "application/json": {
716
+ "schema": {
717
+ "$ref": "#/components/schemas/crawlScanResponse"
718
+ }
719
+ }
720
+ }
721
+ },
722
+ "404": {
723
+ "description": "No description"
724
+ }
725
+ },
726
+ "security": [
727
+ {
728
+ "Implicit": [
729
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
730
+ ]
731
+ }
732
+ ]
733
+ }
734
+ },
735
+ "/v1.0/crawl/sources/{name}/failed-tenders": {
736
+ "delete": {
737
+ "tags": [
738
+ "Crawl"
739
+ ],
740
+ "summary": "Delete all tenders for this source whose ingestion failed (parse-failed / zero confidence)",
741
+ "operationId": "DeleteFailedTenders",
742
+ "responses": {
743
+ "200": {
744
+ "description": "Payload of DeleteFailedTendersResponse",
745
+ "content": {
746
+ "application/json": {
747
+ "schema": {
748
+ "$ref": "#/components/schemas/deleteFailedTendersResponse"
749
+ }
750
+ }
751
+ }
752
+ }
753
+ },
754
+ "security": [
755
+ {
756
+ "Implicit": [
757
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
758
+ ]
759
+ }
760
+ ]
761
+ }
762
+ },
763
+ "/v1.0/crawl/stats": {
764
+ "get": {
765
+ "tags": [
766
+ "Crawl"
767
+ ],
768
+ "summary": "High-level stats for the /admin ops dashboard",
769
+ "operationId": "GetCrawlStats",
770
+ "responses": {
771
+ "200": {
772
+ "description": "Payload of CrawlStatsResponse",
773
+ "content": {
774
+ "application/json": {
775
+ "schema": {
776
+ "$ref": "#/components/schemas/crawlStatsResponse"
777
+ }
778
+ }
779
+ }
780
+ }
781
+ },
782
+ "security": [
783
+ {
784
+ "Implicit": [
785
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
786
+ ]
787
+ }
788
+ ]
789
+ }
790
+ },
791
+ "/v1.0/crawl/stream": {
792
+ "get": {
793
+ "tags": [
794
+ "Crawl"
795
+ ],
796
+ "summary": "Server-sent-events stream: pushes stats + activity every ~2s for the ops dashboard",
797
+ "operationId": "StreamCrawlEvents",
798
+ "responses": {},
799
+ "security": [
800
+ {
801
+ "Implicit": [
802
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
803
+ ]
804
+ }
805
+ ]
806
+ }
807
+ },
808
+ "/v1.0/crawl/activity": {
809
+ "get": {
810
+ "tags": [
811
+ "Crawl"
812
+ ],
813
+ "summary": "Recent ingestion jobs across all sources, newest first. Supports source/status/date/search filters and paging.",
814
+ "operationId": "GetCrawlActivity",
815
+ "parameters": [
816
+ {
817
+ "name": "source",
818
+ "in": "query",
819
+ "description": "Filter by sourceName (exact match)",
820
+ "schema": {
821
+ "type": "string"
822
+ }
823
+ },
824
+ {
825
+ "name": "status",
826
+ "in": "query",
827
+ "description": "Comma-separated statuses (pending,running,completed,failed)",
828
+ "schema": {
829
+ "type": "string"
830
+ }
831
+ },
832
+ {
833
+ "name": "from",
834
+ "in": "query",
835
+ "description": "ISO-8601 lower bound on startedAt",
836
+ "schema": {
837
+ "type": "string"
838
+ }
839
+ },
840
+ {
841
+ "name": "to",
842
+ "in": "query",
843
+ "description": "ISO-8601 upper bound on startedAt",
844
+ "schema": {
845
+ "type": "string"
846
+ }
847
+ },
848
+ {
849
+ "name": "search",
850
+ "in": "query",
851
+ "description": "Substring match across inputTitle/inputUrl/externalId/id/error",
852
+ "schema": {
853
+ "type": "string"
854
+ }
855
+ },
856
+ {
857
+ "name": "skip",
858
+ "in": "query",
859
+ "description": "Offset for paging (default 0)",
860
+ "schema": {
861
+ "type": "string"
862
+ }
863
+ },
864
+ {
865
+ "name": "limit",
866
+ "in": "query",
867
+ "description": "Max jobs to return (default 50, max 500)",
868
+ "schema": {
869
+ "type": "string"
870
+ }
871
+ }
872
+ ],
873
+ "responses": {
874
+ "200": {
875
+ "description": "Payload of CrawlActivityResponse",
876
+ "content": {
877
+ "application/json": {
878
+ "schema": {
879
+ "$ref": "#/components/schemas/crawlActivityResponse"
880
+ }
881
+ }
882
+ }
883
+ }
884
+ },
885
+ "security": [
886
+ {
887
+ "Implicit": [
888
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
889
+ ]
890
+ }
891
+ ]
892
+ }
893
+ },
894
+ "/v1.0/crawl/jobs/{jobId}/retry": {
895
+ "post": {
896
+ "tags": [
897
+ "Crawl"
898
+ ],
899
+ "summary": "Delete the tender (if any) and enqueue a fresh ingestion for the same URL/title/externalId",
900
+ "operationId": "RetryCrawlJob",
901
+ "responses": {
902
+ "200": {
903
+ "description": "Payload of AgentJob",
904
+ "content": {
905
+ "application/json": {
906
+ "schema": {
907
+ "$ref": "#/components/schemas/agentJob"
908
+ }
909
+ }
910
+ }
911
+ },
912
+ "400": {
913
+ "description": "No description"
914
+ },
915
+ "404": {
916
+ "description": "No description"
917
+ }
918
+ },
919
+ "security": [
920
+ {
921
+ "Implicit": [
922
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
923
+ ]
924
+ }
925
+ ]
926
+ }
927
+ },
928
+ "/v1.0/crawl/jobs/{jobId}/cancel": {
929
+ "post": {
930
+ "tags": [
931
+ "Crawl"
932
+ ],
933
+ "summary": "Terminate the running orchestration and mark the job as failed (\"Cancelled by operator\")",
934
+ "operationId": "CancelCrawlJob",
935
+ "responses": {
936
+ "200": {
937
+ "description": "Payload of AgentJob",
938
+ "content": {
939
+ "application/json": {
940
+ "schema": {
941
+ "$ref": "#/components/schemas/agentJob"
942
+ }
943
+ }
944
+ }
945
+ },
946
+ "404": {
947
+ "description": "No description"
948
+ },
949
+ "409": {
950
+ "description": "No description"
951
+ }
952
+ },
953
+ "security": [
954
+ {
955
+ "Implicit": [
956
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
957
+ ]
958
+ }
959
+ ]
960
+ }
961
+ },
962
+ "/v1.0/crawl/jobs/bulk-delete": {
963
+ "post": {
964
+ "tags": [
965
+ "Crawl"
966
+ ],
967
+ "summary": "Delete a batch of jobs and their backing tenders",
968
+ "operationId": "BulkDeleteCrawlJobs",
969
+ "requestBody": {
970
+ "content": {
971
+ "application/json": {
972
+ "schema": {
973
+ "$ref": "#/components/schemas/bulkDeleteJobsRequest"
974
+ }
975
+ }
976
+ }
977
+ },
978
+ "responses": {
979
+ "200": {
980
+ "description": "Payload of BulkDeleteJobsResponse",
981
+ "content": {
982
+ "application/json": {
983
+ "schema": {
984
+ "$ref": "#/components/schemas/bulkDeleteJobsResponse"
985
+ }
986
+ }
987
+ }
988
+ },
989
+ "400": {
990
+ "description": "No description"
991
+ }
992
+ },
993
+ "security": [
994
+ {
995
+ "Implicit": [
996
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
997
+ ]
998
+ }
999
+ ]
1000
+ }
1001
+ },
1002
+ "/v1.0/crawl/sources/{name}/jobs": {
1003
+ "get": {
1004
+ "tags": [
1005
+ "Crawl"
1006
+ ],
1007
+ "summary": "Recent ingestion jobs for this source, newest first",
1008
+ "operationId": "ListCrawlJobs",
1009
+ "parameters": [
1010
+ {
1011
+ "name": "limit",
1012
+ "in": "query",
1013
+ "description": "Max jobs to return (default 50)",
1014
+ "schema": {
1015
+ "type": "string"
1016
+ }
1017
+ }
1018
+ ],
1019
+ "responses": {
1020
+ "200": {
1021
+ "description": "Payload of Array of AgentJob",
1022
+ "content": {
1023
+ "application/json": {
1024
+ "schema": {
1025
+ "type": "array",
1026
+ "items": {
1027
+ "$ref": "#/components/schemas/agentJob"
1028
+ }
1029
+ }
1030
+ }
1031
+ }
1032
+ }
1033
+ },
1034
+ "security": [
1035
+ {
1036
+ "Implicit": [
1037
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
1038
+ ]
1039
+ }
1040
+ ]
1041
+ }
1042
+ },
1043
+ "/v1.0/crawl/sources/{name}/preview": {
1044
+ "post": {
1045
+ "tags": [
1046
+ "Crawl"
1047
+ ],
1048
+ "summary": "Run a one-off discovery crawl for a single source and return the notices it would enqueue (no ingestion)",
1049
+ "operationId": "PreviewCrawlSource",
1050
+ "responses": {
1051
+ "200": {
1052
+ "description": "Payload of CrawlPreviewResponse",
1053
+ "content": {
1054
+ "application/json": {
1055
+ "schema": {
1056
+ "$ref": "#/components/schemas/crawlPreviewResponse"
1057
+ }
1058
+ }
1059
+ }
1060
+ },
1061
+ "404": {
1062
+ "description": "No description"
1063
+ }
1064
+ },
1065
+ "security": [
1066
+ {
1067
+ "Implicit": [
1068
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
1069
+ ]
1070
+ }
1071
+ ]
1072
+ }
1073
+ },
1074
+ "/v1.0/tenders/{id}/documents": {
1075
+ "get": {
1076
+ "tags": [
1077
+ "Documents"
1078
+ ],
1079
+ "summary": "List documents for a tender",
1080
+ "operationId": "ListTenderDocuments",
1081
+ "parameters": [
1082
+ {
1083
+ "name": "id",
1084
+ "in": "path",
1085
+ "required": true,
1086
+ "schema": {
1087
+ "type": "string"
1088
+ }
1089
+ }
1090
+ ],
1091
+ "responses": {
1092
+ "200": {
1093
+ "description": "Payload of Array of TenderDocument",
1094
+ "content": {
1095
+ "application/json": {
1096
+ "schema": {
1097
+ "type": "array",
1098
+ "items": {
1099
+ "$ref": "#/components/schemas/tenderDocument"
1100
+ }
1101
+ }
1102
+ }
1103
+ }
1104
+ },
1105
+ "404": {
1106
+ "description": "No description"
1107
+ }
1108
+ },
1109
+ "security": [
1110
+ {
1111
+ "Implicit": [
1112
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
1113
+ ]
1114
+ }
1115
+ ]
1116
+ },
1117
+ "post": {
1118
+ "tags": [
1119
+ "Documents"
1120
+ ],
1121
+ "summary": "Upload a new document to a tender",
1122
+ "operationId": "UploadTenderDocument",
1123
+ "parameters": [
1124
+ {
1125
+ "name": "id",
1126
+ "in": "path",
1127
+ "required": true,
1128
+ "schema": {
1129
+ "type": "string"
1130
+ }
1131
+ }
1132
+ ],
1133
+ "responses": {
1134
+ "200": {
1135
+ "description": "Payload of TenderDocument",
1136
+ "content": {
1137
+ "application/json": {
1138
+ "schema": {
1139
+ "$ref": "#/components/schemas/tenderDocument"
1140
+ }
1141
+ }
1142
+ }
1143
+ },
1144
+ "404": {
1145
+ "description": "No description"
1146
+ }
1147
+ },
1148
+ "security": [
1149
+ {
1150
+ "Implicit": [
1151
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
1152
+ ]
1153
+ }
1154
+ ]
1155
+ }
1156
+ },
1157
+ "/v1.0/tenders/{id}/documents/{docId}/download-url": {
1158
+ "get": {
1159
+ "tags": [
1160
+ "Documents"
1161
+ ],
1162
+ "summary": "Get a short-lived download URL for a document",
1163
+ "operationId": "GetDocumentDownloadUrl",
1164
+ "parameters": [
1165
+ {
1166
+ "name": "id",
1167
+ "in": "path",
1168
+ "required": true,
1169
+ "schema": {
1170
+ "type": "string"
1171
+ }
1172
+ },
1173
+ {
1174
+ "name": "docId",
1175
+ "in": "path",
1176
+ "required": true,
1177
+ "schema": {
1178
+ "type": "string"
1179
+ }
1180
+ }
1181
+ ],
1182
+ "responses": {
1183
+ "200": {
1184
+ "description": "Payload of Object",
1185
+ "content": {
1186
+ "application/json": {
1187
+ "schema": {
1188
+ "type": "object"
1189
+ }
1190
+ }
1191
+ }
1192
+ },
1193
+ "404": {
1194
+ "description": "No description"
1195
+ }
1196
+ },
1197
+ "security": [
1198
+ {
1199
+ "Implicit": [
1200
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
1201
+ ]
1202
+ }
1203
+ ]
1204
+ }
1205
+ },
1206
+ "/v1.0/tenders/{id}/documents/{docId}/download": {
1207
+ "get": {
1208
+ "tags": [
1209
+ "Documents"
1210
+ ],
1211
+ "summary": "Download a single document",
1212
+ "operationId": "DownloadDocument",
1213
+ "parameters": [
1214
+ {
1215
+ "name": "id",
1216
+ "in": "path",
1217
+ "required": true,
1218
+ "schema": {
1219
+ "type": "string"
1220
+ }
1221
+ },
1222
+ {
1223
+ "name": "docId",
1224
+ "in": "path",
1225
+ "required": true,
1226
+ "schema": {
1227
+ "type": "string"
1228
+ }
1229
+ }
1230
+ ],
1231
+ "responses": {
1232
+ "200": {
1233
+ "description": "Payload of Array of Byte",
1234
+ "content": {
1235
+ "application/octet-stream": {
1236
+ "schema": {
1237
+ "type": "string",
1238
+ "format": "binary"
1239
+ }
1240
+ }
1241
+ }
1242
+ },
1243
+ "404": {
1244
+ "description": "No description"
1245
+ }
1246
+ },
1247
+ "security": [
1248
+ {
1249
+ "Implicit": [
1250
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
1251
+ ]
1252
+ }
1253
+ ]
1254
+ }
1255
+ },
1256
+ "/v1.0/tenders/{id}/documents/download-all": {
1257
+ "get": {
1258
+ "tags": [
1259
+ "Documents"
1260
+ ],
1261
+ "summary": "Download all tender documents as a ZIP archive",
1262
+ "operationId": "DownloadAllDocuments",
1263
+ "parameters": [
1264
+ {
1265
+ "name": "id",
1266
+ "in": "path",
1267
+ "required": true,
1268
+ "schema": {
1269
+ "type": "string"
1270
+ }
1271
+ }
1272
+ ],
1273
+ "responses": {
1274
+ "200": {
1275
+ "description": "Payload of Array of Byte",
1276
+ "content": {
1277
+ "application/zip": {
1278
+ "schema": {
1279
+ "type": "string",
1280
+ "format": "binary"
1281
+ }
1282
+ }
1283
+ }
1284
+ },
1285
+ "404": {
1286
+ "description": "No description"
1287
+ }
1288
+ },
1289
+ "security": [
1290
+ {
1291
+ "Implicit": [
1292
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
1293
+ ]
1294
+ }
1295
+ ]
1296
+ }
1297
+ },
1298
+ "/v1.0/tenders/{id}/documents/{docId}": {
1299
+ "patch": {
1300
+ "tags": [
1301
+ "Documents"
1302
+ ],
1303
+ "summary": "Patch tender document flags (e.g. set as competence matrix source)",
1304
+ "operationId": "PatchTenderDocument",
1305
+ "parameters": [
1306
+ {
1307
+ "name": "id",
1308
+ "in": "path",
1309
+ "required": true,
1310
+ "schema": {
1311
+ "type": "string"
1312
+ }
1313
+ },
1314
+ {
1315
+ "name": "docId",
1316
+ "in": "path",
1317
+ "required": true,
1318
+ "schema": {
1319
+ "type": "string"
1320
+ }
1321
+ }
1322
+ ],
1323
+ "requestBody": {
1324
+ "content": {
1325
+ "application/json": {
1326
+ "schema": {
1327
+ "$ref": "#/components/schemas/patchDocumentRequest"
1328
+ }
1329
+ }
1330
+ },
1331
+ "required": true
1332
+ },
1333
+ "responses": {
1334
+ "200": {
1335
+ "description": "Payload of PatchDocumentResponse",
1336
+ "content": {
1337
+ "application/json": {
1338
+ "schema": {
1339
+ "$ref": "#/components/schemas/patchDocumentResponse"
1340
+ }
1341
+ }
1342
+ }
1343
+ },
1344
+ "404": {
1345
+ "description": "No description"
1346
+ }
1347
+ },
1348
+ "security": [
1349
+ {
1350
+ "Implicit": [
1351
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
1352
+ ]
1353
+ }
1354
+ ]
1355
+ },
1356
+ "delete": {
1357
+ "tags": [
1358
+ "Documents"
1359
+ ],
1360
+ "summary": "Delete a tender document (and its blob + related answers)",
1361
+ "operationId": "DeleteTenderDocument",
1362
+ "parameters": [
1363
+ {
1364
+ "name": "id",
1365
+ "in": "path",
1366
+ "required": true,
1367
+ "schema": {
1368
+ "type": "string"
1369
+ }
1370
+ },
1371
+ {
1372
+ "name": "docId",
1373
+ "in": "path",
1374
+ "required": true,
1375
+ "schema": {
1376
+ "type": "string"
1377
+ }
1378
+ }
1379
+ ],
1380
+ "responses": {
1381
+ "204": {
1382
+ "description": "No description"
1383
+ },
1384
+ "404": {
1385
+ "description": "No description"
1386
+ }
1387
+ },
1388
+ "security": [
1389
+ {
1390
+ "Implicit": [
1391
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
1392
+ ]
1393
+ }
1394
+ ]
1395
+ }
1396
+ },
1397
+ "/v1.0/tenders/{id}/documents/{docId}/extract-questions": {
1398
+ "post": {
1399
+ "tags": [
1400
+ "Documents"
1401
+ ],
1402
+ "summary": "Start extraction of fillable questions from a document",
1403
+ "operationId": "StartQuestionExtraction",
1404
+ "parameters": [
1405
+ {
1406
+ "name": "id",
1407
+ "in": "path",
1408
+ "required": true,
1409
+ "schema": {
1410
+ "type": "string"
1411
+ }
1412
+ },
1413
+ {
1414
+ "name": "docId",
1415
+ "in": "path",
1416
+ "required": true,
1417
+ "schema": {
1418
+ "type": "string"
1419
+ }
1420
+ }
1421
+ ],
1422
+ "responses": {
1423
+ "202": {
1424
+ "description": "Payload of Object",
1425
+ "content": {
1426
+ "application/json": {
1427
+ "schema": {
1428
+ "type": "object"
1429
+ }
1430
+ }
1431
+ }
1432
+ },
1433
+ "404": {
1434
+ "description": "No description"
1435
+ }
1436
+ },
1437
+ "security": [
1438
+ {
1439
+ "Implicit": [
1440
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
1441
+ ]
1442
+ }
1443
+ ]
1444
+ }
1445
+ },
1446
+ "/v1.0/tenders/{id}/documents/{docId}/fill-questions": {
1447
+ "post": {
1448
+ "tags": [
1449
+ "Documents"
1450
+ ],
1451
+ "summary": "Start filling tender question answers per consultant",
1452
+ "operationId": "StartQuestionFill",
1453
+ "parameters": [
1454
+ {
1455
+ "name": "id",
1456
+ "in": "path",
1457
+ "required": true,
1458
+ "schema": {
1459
+ "type": "string"
1460
+ }
1461
+ },
1462
+ {
1463
+ "name": "docId",
1464
+ "in": "path",
1465
+ "required": true,
1466
+ "schema": {
1467
+ "type": "string"
1468
+ }
1469
+ }
1470
+ ],
1471
+ "requestBody": {
1472
+ "content": {
1473
+ "application/json": {
1474
+ "schema": {
1475
+ "$ref": "#/components/schemas/questionFillRequest"
1476
+ }
1477
+ }
1478
+ },
1479
+ "required": true
1480
+ },
1481
+ "responses": {
1482
+ "202": {
1483
+ "description": "Payload of Object",
1484
+ "content": {
1485
+ "application/json": {
1486
+ "schema": {
1487
+ "type": "object"
1488
+ }
1489
+ }
1490
+ }
1491
+ },
1492
+ "404": {
1493
+ "description": "No description"
1494
+ }
1495
+ },
1496
+ "security": [
1497
+ {
1498
+ "Implicit": [
1499
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
1500
+ ]
1501
+ }
1502
+ ]
1503
+ }
1504
+ },
1505
+ "/v1.0/consultants": {
1506
+ "get": {
1507
+ "tags": [
1508
+ "Consultants"
1509
+ ],
1510
+ "summary": "List all known consultants (for manual selection)",
1511
+ "operationId": "ListConsultants",
1512
+ "parameters": [
1513
+ {
1514
+ "name": "query",
1515
+ "in": "query",
1516
+ "schema": {
1517
+ "type": "string"
1518
+ }
1519
+ }
1520
+ ],
1521
+ "responses": {
1522
+ "200": {
1523
+ "description": "Payload of Array of ConsultantSummary",
1524
+ "content": {
1525
+ "application/json": {
1526
+ "schema": {
1527
+ "type": "array",
1528
+ "items": {
1529
+ "$ref": "#/components/schemas/consultantSummary"
1530
+ }
1531
+ }
1532
+ }
1533
+ }
1534
+ }
1535
+ },
1536
+ "security": [
1537
+ {
1538
+ "Implicit": [
1539
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
1540
+ ]
1541
+ }
1542
+ ]
1543
+ }
1544
+ },
1545
+ "/v1.0/realtime/negotiate": {
1546
+ "post": {
1547
+ "tags": [
1548
+ "Realtime"
1549
+ ],
1550
+ "summary": "Issue a SignalR access token + URL for the sales-live hub",
1551
+ "operationId": "NegotiateSignalR",
1552
+ "requestBody": {
1553
+ "content": {
1554
+ "application/json": {
1555
+ "schema": {
1556
+ "$ref": "#/components/schemas/negotiateRequest"
1557
+ }
1558
+ }
1559
+ }
1560
+ },
1561
+ "responses": {
1562
+ "200": {
1563
+ "description": "Payload of NegotiateResponse",
1564
+ "content": {
1565
+ "application/json": {
1566
+ "schema": {
1567
+ "$ref": "#/components/schemas/negotiateResponse"
1568
+ }
1569
+ }
1570
+ }
1571
+ },
1572
+ "503": {
1573
+ "description": "SignalR is not configured on this instance; fall back to SSE"
1574
+ }
1575
+ },
1576
+ "security": [
1577
+ {
1578
+ "Implicit": [
1579
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
1580
+ ]
1581
+ }
1582
+ ]
1583
+ }
1584
+ },
1585
+ "/v1.0/stream": {
1586
+ "get": {
1587
+ "tags": [
1588
+ "Realtime"
1589
+ ],
1590
+ "summary": "Unified SSE stream: tender/job/crawl/consultant/audit events on one connection",
1591
+ "operationId": "StreamAll",
1592
+ "parameters": [
1593
+ {
1594
+ "name": "channels",
1595
+ "in": "query",
1596
+ "description": "Comma-separated namespaces to include (tender,job,crawl,consultant,audit). Default: all.",
1597
+ "schema": {
1598
+ "type": "string"
1599
+ }
1600
+ }
1601
+ ],
1602
+ "responses": {},
1603
+ "security": [
1604
+ {
1605
+ "Implicit": [
1606
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
1607
+ ]
1608
+ }
1609
+ ]
1610
+ }
1611
+ },
1612
+ "/v1.0/tenders/stream-redirect": {
1613
+ "get": {
1614
+ "tags": [
1615
+ "Realtime"
1616
+ ],
1617
+ "summary": "Deprecated: redirects to /v1.0/stream?channels=tender,job",
1618
+ "operationId": "DeprecatedTenderStream",
1619
+ "responses": {},
1620
+ "deprecated": true,
1621
+ "security": [
1622
+ {
1623
+ "Implicit": [
1624
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
1625
+ ]
1626
+ }
1627
+ ]
1628
+ }
1629
+ },
1630
+ "/v1.0/crawl/stream-redirect": {
1631
+ "get": {
1632
+ "tags": [
1633
+ "Realtime"
1634
+ ],
1635
+ "summary": "Deprecated: redirects to /v1.0/stream?channels=crawl,job",
1636
+ "operationId": "DeprecatedCrawlStream",
1637
+ "responses": {},
1638
+ "deprecated": true,
1639
+ "security": [
1640
+ {
1641
+ "Implicit": [
1642
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
1643
+ ]
1644
+ }
1645
+ ]
1646
+ }
1647
+ },
1648
+ "/v1.0/salesforce/opportunities": {
1649
+ "get": {
1650
+ "tags": [
1651
+ "Salesforce"
1652
+ ],
1653
+ "summary": "List Salesforce Opportunities (open by default).",
1654
+ "operationId": "ListSalesforceOpportunities",
1655
+ "parameters": [
1656
+ {
1657
+ "name": "includeClosed",
1658
+ "in": "query",
1659
+ "schema": {
1660
+ "type": "boolean"
1661
+ },
1662
+ "x-ms-summary": "Include closed opportunities (default false)."
1663
+ },
1664
+ {
1665
+ "name": "limit",
1666
+ "in": "query",
1667
+ "schema": {
1668
+ "type": "integer",
1669
+ "format": "int32"
1670
+ },
1671
+ "x-ms-summary": "Row cap, max 200 (default 100)."
1672
+ }
1673
+ ],
1674
+ "responses": {
1675
+ "200": {
1676
+ "description": "Payload of Array of SalesforceOpportunity",
1677
+ "content": {
1678
+ "application/json": {
1679
+ "schema": {
1680
+ "type": "array",
1681
+ "items": {
1682
+ "$ref": "#/components/schemas/salesforceOpportunity"
1683
+ }
1684
+ }
1685
+ }
1686
+ }
1687
+ }
1688
+ },
1689
+ "security": [
1690
+ {
1691
+ "Implicit": [
1692
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
1693
+ ]
1694
+ }
1695
+ ]
1696
+ }
1697
+ },
1698
+ "/v1.0/salesforce/opportunity-stages": {
1699
+ "get": {
1700
+ "tags": [
1701
+ "Salesforce"
1702
+ ],
1703
+ "summary": "List the SF org's Opportunity pipeline stages in configured order.",
1704
+ "operationId": "ListSalesforceOpportunityStages",
1705
+ "responses": {
1706
+ "200": {
1707
+ "description": "Payload of Array of SalesforceOpportunityStage",
1708
+ "content": {
1709
+ "application/json": {
1710
+ "schema": {
1711
+ "type": "array",
1712
+ "items": {
1713
+ "$ref": "#/components/schemas/salesforceOpportunityStage"
1714
+ }
1715
+ }
1716
+ }
1717
+ }
1718
+ }
1719
+ },
1720
+ "security": [
1721
+ {
1722
+ "Implicit": [
1723
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
1724
+ ]
1725
+ }
1726
+ ]
1727
+ }
1728
+ },
1729
+ "/v1.0/salesforce/refresh": {
1730
+ "post": {
1731
+ "tags": [
1732
+ "Salesforce"
1733
+ ],
1734
+ "summary": "Batch-refresh the cached Salesforce state on every linked Snøkam tender.",
1735
+ "operationId": "RefreshAllSalesforceLinks",
1736
+ "responses": {
1737
+ "200": {
1738
+ "description": "Payload of SalesforceRefreshResult",
1739
+ "content": {
1740
+ "application/json": {
1741
+ "schema": {
1742
+ "$ref": "#/components/schemas/salesforceRefreshResult"
1743
+ }
1744
+ }
1745
+ }
1746
+ }
1747
+ },
1748
+ "security": [
1749
+ {
1750
+ "Implicit": [
1751
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
1752
+ ]
1753
+ }
1754
+ ]
1755
+ }
1756
+ },
1757
+ "/v1.0/tenders/{id}/salesforce/stage": {
1758
+ "post": {
1759
+ "tags": [
1760
+ "Salesforce"
1761
+ ],
1762
+ "summary": "Move the linked SF Opportunity to a new stage and refresh the cache.",
1763
+ "operationId": "UpdateTenderSalesforceStage",
1764
+ "parameters": [
1765
+ {
1766
+ "name": "id",
1767
+ "in": "path",
1768
+ "required": true,
1769
+ "schema": {
1770
+ "type": "string"
1771
+ }
1772
+ }
1773
+ ],
1774
+ "requestBody": {
1775
+ "description": "The SF stage masterLabel/apiName to switch to.",
1776
+ "content": {
1777
+ "application/json": {
1778
+ "schema": {
1779
+ "$ref": "#/components/schemas/updateSalesforceStageRequest"
1780
+ }
1781
+ }
1782
+ },
1783
+ "required": true
1784
+ },
1785
+ "responses": {
1786
+ "200": {
1787
+ "description": "Payload of Tender",
1788
+ "content": {
1789
+ "application/json": {
1790
+ "schema": {
1791
+ "$ref": "#/components/schemas/tender"
1792
+ }
1793
+ }
1794
+ }
1795
+ },
1796
+ "400": {
1797
+ "description": "Tender has no Salesforce link, or stageName is missing."
1798
+ },
1799
+ "404": {
1800
+ "description": "No description"
1801
+ }
1802
+ },
1803
+ "security": [
1804
+ {
1805
+ "Implicit": [
1806
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
1807
+ ]
1808
+ }
1809
+ ]
1810
+ }
1811
+ },
1812
+ "/v1.0/salesforce/opportunities/{sfId}/import": {
1813
+ "post": {
1814
+ "tags": [
1815
+ "Salesforce"
1816
+ ],
1817
+ "summary": "Create a Snøkam tender stub from an existing Salesforce Opportunity.",
1818
+ "operationId": "ImportSalesforceOpportunity",
1819
+ "parameters": [
1820
+ {
1821
+ "name": "sfId",
1822
+ "in": "path",
1823
+ "required": true,
1824
+ "schema": {
1825
+ "type": "string"
1826
+ },
1827
+ "x-ms-summary": "Salesforce Opportunity Id."
1828
+ }
1829
+ ],
1830
+ "responses": {
1831
+ "200": {
1832
+ "description": "Payload of Tender",
1833
+ "content": {
1834
+ "application/json": {
1835
+ "schema": {
1836
+ "$ref": "#/components/schemas/tender"
1837
+ }
1838
+ }
1839
+ }
1840
+ },
1841
+ "404": {
1842
+ "description": "No description"
1843
+ },
1844
+ "409": {
1845
+ "description": "A tender is already linked to this Opportunity."
1846
+ }
1847
+ },
1848
+ "security": [
1849
+ {
1850
+ "Implicit": [
1851
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
1852
+ ]
1853
+ }
1854
+ ]
1855
+ }
1856
+ },
1857
+ "/v1.0/tenders/{id}/salesforce": {
1858
+ "post": {
1859
+ "tags": [
1860
+ "Salesforce"
1861
+ ],
1862
+ "summary": "Create a Salesforce Opportunity from a Snøkam tender and cache the link.",
1863
+ "operationId": "PromoteTenderToSalesforce",
1864
+ "parameters": [
1865
+ {
1866
+ "name": "id",
1867
+ "in": "path",
1868
+ "required": true,
1869
+ "schema": {
1870
+ "type": "string"
1871
+ }
1872
+ }
1873
+ ],
1874
+ "responses": {
1875
+ "200": {
1876
+ "description": "Payload of Tender",
1877
+ "content": {
1878
+ "application/json": {
1879
+ "schema": {
1880
+ "$ref": "#/components/schemas/tender"
1881
+ }
1882
+ }
1883
+ }
1884
+ },
1885
+ "404": {
1886
+ "description": "No description"
1887
+ },
1888
+ "409": {
1889
+ "description": "Tender is already linked to a Salesforce Opportunity."
1890
+ }
1891
+ },
1892
+ "security": [
1893
+ {
1894
+ "Implicit": [
1895
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
1896
+ ]
1897
+ }
1898
+ ]
1899
+ }
1900
+ },
1901
+ "/v1.0/tenders/{id}/salesforce/refresh": {
1902
+ "post": {
1903
+ "tags": [
1904
+ "Salesforce"
1905
+ ],
1906
+ "summary": "Re-sync cached Salesforce Opportunity state (stage / closed / won) onto the tender.",
1907
+ "operationId": "RefreshTenderSalesforceLink",
1908
+ "parameters": [
1909
+ {
1910
+ "name": "id",
1911
+ "in": "path",
1912
+ "required": true,
1913
+ "schema": {
1914
+ "type": "string"
1915
+ }
1916
+ }
1917
+ ],
1918
+ "responses": {
1919
+ "200": {
1920
+ "description": "Payload of Tender",
1921
+ "content": {
1922
+ "application/json": {
1923
+ "schema": {
1924
+ "$ref": "#/components/schemas/tender"
1925
+ }
1926
+ }
1927
+ }
1928
+ },
1929
+ "404": {
1930
+ "description": "No description"
1931
+ }
1932
+ },
1933
+ "security": [
1934
+ {
1935
+ "Implicit": [
1936
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
1937
+ ]
1938
+ }
1939
+ ]
1940
+ }
1941
+ },
1942
+ "/v1.0/tenders": {
1943
+ "get": {
1944
+ "tags": [
1945
+ "Tenders"
1946
+ ],
1947
+ "summary": "List all tenders",
1948
+ "operationId": "ListTenders",
1949
+ "responses": {
1950
+ "200": {
1951
+ "description": "Payload of Array of Tender",
1952
+ "content": {
1953
+ "application/json": {
1954
+ "schema": {
1955
+ "type": "array",
1956
+ "items": {
1957
+ "$ref": "#/components/schemas/tender"
1958
+ }
1959
+ }
1960
+ }
1961
+ }
1962
+ }
1963
+ },
1964
+ "security": [
1965
+ {
1966
+ "Implicit": [
1967
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
1968
+ ]
1969
+ }
1970
+ ]
1971
+ },
1972
+ "post": {
1973
+ "tags": [
1974
+ "Tenders"
1975
+ ],
1976
+ "summary": "Create a new tender",
1977
+ "operationId": "CreateTender",
1978
+ "requestBody": {
1979
+ "content": {
1980
+ "application/json": {
1981
+ "schema": {
1982
+ "$ref": "#/components/schemas/tender"
1983
+ }
1984
+ }
1985
+ },
1986
+ "required": true
1987
+ },
1988
+ "responses": {
1989
+ "201": {
1990
+ "description": "Payload of Tender",
1991
+ "content": {
1992
+ "application/json": {
1993
+ "schema": {
1994
+ "$ref": "#/components/schemas/tender"
1995
+ }
1996
+ }
1997
+ }
1998
+ }
1999
+ },
2000
+ "security": [
2001
+ {
2002
+ "Implicit": [
2003
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
2004
+ ]
2005
+ }
2006
+ ]
2007
+ }
2008
+ },
2009
+ "/v1.0/tenders/{id}": {
2010
+ "get": {
2011
+ "tags": [
2012
+ "Tenders"
2013
+ ],
2014
+ "summary": "Get a tender by its URL slug (or internal id for admin use).",
2015
+ "operationId": "GetTender",
2016
+ "parameters": [
2017
+ {
2018
+ "name": "id",
2019
+ "in": "path",
2020
+ "description": "URL slug (canonical) or the internal guid id (admin/legacy).",
2021
+ "required": true,
2022
+ "schema": {
2023
+ "type": "string"
2024
+ }
2025
+ }
2026
+ ],
2027
+ "responses": {
2028
+ "200": {
2029
+ "description": "Payload of Tender",
2030
+ "content": {
2031
+ "application/json": {
2032
+ "schema": {
2033
+ "$ref": "#/components/schemas/tender"
2034
+ }
2035
+ }
2036
+ }
2037
+ },
2038
+ "404": {
2039
+ "description": "No description"
2040
+ }
2041
+ },
2042
+ "security": [
2043
+ {
2044
+ "Implicit": [
2045
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
2046
+ ]
2047
+ }
2048
+ ]
2049
+ },
2050
+ "put": {
2051
+ "tags": [
2052
+ "Tenders"
2053
+ ],
2054
+ "summary": "Update a tender",
2055
+ "operationId": "UpdateTender",
2056
+ "parameters": [
2057
+ {
2058
+ "name": "id",
2059
+ "in": "path",
2060
+ "required": true,
2061
+ "schema": {
2062
+ "type": "string"
2063
+ }
2064
+ }
2065
+ ],
2066
+ "requestBody": {
2067
+ "content": {
2068
+ "application/json": {
2069
+ "schema": {
2070
+ "$ref": "#/components/schemas/tender"
2071
+ }
2072
+ }
2073
+ },
2074
+ "required": true
2075
+ },
2076
+ "responses": {
2077
+ "200": {
2078
+ "description": "Payload of Tender",
2079
+ "content": {
2080
+ "application/json": {
2081
+ "schema": {
2082
+ "$ref": "#/components/schemas/tender"
2083
+ }
2084
+ }
2085
+ }
2086
+ },
2087
+ "404": {
2088
+ "description": "No description"
2089
+ }
2090
+ },
2091
+ "security": [
2092
+ {
2093
+ "Implicit": [
2094
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
2095
+ ]
2096
+ }
2097
+ ]
2098
+ },
2099
+ "delete": {
2100
+ "tags": [
2101
+ "Tenders"
2102
+ ],
2103
+ "summary": "Delete a tender",
2104
+ "operationId": "DeleteTender",
2105
+ "parameters": [
2106
+ {
2107
+ "name": "id",
2108
+ "in": "path",
2109
+ "required": true,
2110
+ "schema": {
2111
+ "type": "string"
2112
+ }
2113
+ }
2114
+ ],
2115
+ "responses": {
2116
+ "204": {
2117
+ "description": "No description"
2118
+ },
2119
+ "404": {
2120
+ "description": "No description"
2121
+ }
2122
+ },
2123
+ "security": [
2124
+ {
2125
+ "Implicit": [
2126
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
2127
+ ]
2128
+ }
2129
+ ]
2130
+ }
2131
+ },
2132
+ "/v1.0/tenders/backfill-slugs": {
2133
+ "post": {
2134
+ "tags": [
2135
+ "Tenders"
2136
+ ],
2137
+ "summary": "Assign a slug to every tender that doesn't have one yet. Idempotent — safe to re-run.",
2138
+ "operationId": "BackfillTenderSlugs",
2139
+ "responses": {
2140
+ "200": {
2141
+ "description": "Payload of BackfillSlugsResult",
2142
+ "content": {
2143
+ "application/json": {
2144
+ "schema": {
2145
+ "$ref": "#/components/schemas/backfillSlugsResult"
2146
+ }
2147
+ }
2148
+ }
2149
+ }
2150
+ },
2151
+ "security": [
2152
+ {
2153
+ "Implicit": [
2154
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
2155
+ ]
2156
+ }
2157
+ ]
2158
+ }
2159
+ },
2160
+ "/v1.0/tenders/{id}/reingest": {
2161
+ "post": {
2162
+ "tags": [
2163
+ "Tenders"
2164
+ ],
2165
+ "summary": "Re-run the ingestion pipeline on an existing tender, re-parsing documents and refreshing AI match / summary / classification.",
2166
+ "operationId": "ReingestTender",
2167
+ "parameters": [
2168
+ {
2169
+ "name": "id",
2170
+ "in": "path",
2171
+ "required": true,
2172
+ "schema": {
2173
+ "type": "string"
2174
+ }
2175
+ }
2176
+ ],
2177
+ "responses": {
2178
+ "200": {
2179
+ "description": "Payload of AgentJob",
2180
+ "content": {
2181
+ "application/json": {
2182
+ "schema": {
2183
+ "$ref": "#/components/schemas/agentJob"
2184
+ }
2185
+ }
2186
+ }
2187
+ },
2188
+ "404": {
2189
+ "description": "No description"
2190
+ }
2191
+ },
2192
+ "security": [
2193
+ {
2194
+ "Implicit": [
2195
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
2196
+ ]
2197
+ }
2198
+ ]
2199
+ }
2200
+ },
2201
+ "/v1.0/tenders/{id}/jobs/{jobId}/snapshot": {
2202
+ "get": {
2203
+ "tags": [
2204
+ "Tenders"
2205
+ ],
2206
+ "summary": "Return the tender as it looked right after a given agent job ran (time-travel view).",
2207
+ "operationId": "GetTenderJobSnapshot",
2208
+ "parameters": [
2209
+ {
2210
+ "name": "id",
2211
+ "in": "path",
2212
+ "required": true,
2213
+ "schema": {
2214
+ "type": "string"
2215
+ }
2216
+ },
2217
+ {
2218
+ "name": "jobId",
2219
+ "in": "path",
2220
+ "required": true,
2221
+ "schema": {
2222
+ "type": "string"
2223
+ }
2224
+ }
2225
+ ],
2226
+ "responses": {
2227
+ "200": {
2228
+ "description": "Payload of Tender",
2229
+ "content": {
2230
+ "application/json": {
2231
+ "schema": {
2232
+ "$ref": "#/components/schemas/tender"
2233
+ }
2234
+ }
2235
+ }
2236
+ },
2237
+ "404": {
2238
+ "description": "No description"
2239
+ }
2240
+ },
2241
+ "security": [
2242
+ {
2243
+ "Implicit": [
2244
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
2245
+ ]
2246
+ }
2247
+ ]
2248
+ }
2249
+ },
2250
+ "/v1.0/tenders/{id}/cv-proposal": {
2251
+ "put": {
2252
+ "tags": [
2253
+ "Tenders"
2254
+ ],
2255
+ "summary": "Set or replace the Flowcase proposal + tailored-CV mapping attached to a tender.",
2256
+ "operationId": "SetTenderCvProposal",
2257
+ "parameters": [
2258
+ {
2259
+ "name": "id",
2260
+ "in": "path",
2261
+ "required": true,
2262
+ "schema": {
2263
+ "type": "string"
2264
+ }
2265
+ }
2266
+ ],
2267
+ "requestBody": {
2268
+ "content": {
2269
+ "application/json": {
2270
+ "schema": {
2271
+ "$ref": "#/components/schemas/tenderCvProposal"
2272
+ }
2273
+ }
2274
+ },
2275
+ "required": true
2276
+ },
2277
+ "responses": {
2278
+ "200": {
2279
+ "description": "Payload of Tender",
2280
+ "content": {
2281
+ "application/json": {
2282
+ "schema": {
2283
+ "$ref": "#/components/schemas/tender"
2284
+ }
2285
+ }
2286
+ }
2287
+ },
2288
+ "404": {
2289
+ "description": "No description"
2290
+ }
2291
+ },
2292
+ "security": [
2293
+ {
2294
+ "Implicit": [
2295
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
2296
+ ]
2297
+ }
2298
+ ]
2299
+ }
2300
+ },
2301
+ "/v1.0/tenders/{id}/cv-proposal/variants": {
2302
+ "post": {
2303
+ "tags": [
2304
+ "Tenders"
2305
+ ],
2306
+ "summary": "Upsert a single tailored-CV variant on a tender's proposal (per consultant).",
2307
+ "operationId": "UpsertTenderCvVariant",
2308
+ "parameters": [
2309
+ {
2310
+ "name": "id",
2311
+ "in": "path",
2312
+ "required": true,
2313
+ "schema": {
2314
+ "type": "string"
2315
+ }
2316
+ }
2317
+ ],
2318
+ "requestBody": {
2319
+ "content": {
2320
+ "application/json": {
2321
+ "schema": {
2322
+ "$ref": "#/components/schemas/tenderCvVariant"
2323
+ }
2324
+ }
2325
+ },
2326
+ "required": true
2327
+ },
2328
+ "responses": {
2329
+ "200": {
2330
+ "description": "Payload of Tender",
2331
+ "content": {
2332
+ "application/json": {
2333
+ "schema": {
2334
+ "$ref": "#/components/schemas/tender"
2335
+ }
2336
+ }
2337
+ }
2338
+ },
2339
+ "404": {
2340
+ "description": "No description"
2341
+ }
2342
+ },
2343
+ "security": [
2344
+ {
2345
+ "Implicit": [
2346
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
2347
+ ]
2348
+ }
2349
+ ]
2350
+ }
2351
+ },
2352
+ "/v1.0/tenders/{id}/cv-proposal/variants/{email}": {
2353
+ "delete": {
2354
+ "tags": [
2355
+ "Tenders"
2356
+ ],
2357
+ "summary": "Remove a tailored-CV variant from a tender's proposal by consultant email.",
2358
+ "operationId": "RemoveTenderCvVariant",
2359
+ "parameters": [
2360
+ {
2361
+ "name": "id",
2362
+ "in": "path",
2363
+ "required": true,
2364
+ "schema": {
2365
+ "type": "string"
2366
+ }
2367
+ },
2368
+ {
2369
+ "name": "email",
2370
+ "in": "path",
2371
+ "required": true,
2372
+ "schema": {
2373
+ "type": "string"
2374
+ }
2375
+ }
2376
+ ],
2377
+ "responses": {
2378
+ "200": {
2379
+ "description": "Payload of Tender",
2380
+ "content": {
2381
+ "application/json": {
2382
+ "schema": {
2383
+ "$ref": "#/components/schemas/tender"
2384
+ }
2385
+ }
2386
+ }
2387
+ },
2388
+ "404": {
2389
+ "description": "No description"
2390
+ }
2391
+ },
2392
+ "security": [
2393
+ {
2394
+ "Implicit": [
2395
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
2396
+ ]
2397
+ }
2398
+ ]
2399
+ }
2400
+ },
2401
+ "/v1.0/tenders/{id}/consultants": {
2402
+ "post": {
2403
+ "tags": [
2404
+ "Tenders"
2405
+ ],
2406
+ "summary": "Assign a consultant to a tender. Idempotent: assigning the same email twice refreshes Name/Note but does not create duplicates.",
2407
+ "operationId": "AssignConsultant",
2408
+ "parameters": [
2409
+ {
2410
+ "name": "id",
2411
+ "in": "path",
2412
+ "required": true,
2413
+ "schema": {
2414
+ "type": "string"
2415
+ }
2416
+ }
2417
+ ],
2418
+ "requestBody": {
2419
+ "content": {
2420
+ "application/json": {
2421
+ "schema": {
2422
+ "$ref": "#/components/schemas/assignedConsultant"
2423
+ }
2424
+ }
2425
+ },
2426
+ "required": true
2427
+ },
2428
+ "responses": {
2429
+ "200": {
2430
+ "description": "Payload of Tender",
2431
+ "content": {
2432
+ "application/json": {
2433
+ "schema": {
2434
+ "$ref": "#/components/schemas/tender"
2435
+ }
2436
+ }
2437
+ }
2438
+ },
2439
+ "404": {
2440
+ "description": "No description"
2441
+ }
2442
+ },
2443
+ "security": [
2444
+ {
2445
+ "Implicit": [
2446
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
2447
+ ]
2448
+ }
2449
+ ]
2450
+ }
2451
+ },
2452
+ "/v1.0/tenders/{id}/slack-messages": {
2453
+ "post": {
2454
+ "tags": [
2455
+ "Tenders"
2456
+ ],
2457
+ "summary": "Queue a Slack message for a tender (Service Bus → notifications-function).",
2458
+ "operationId": "SendTenderSlackMessage",
2459
+ "parameters": [
2460
+ {
2461
+ "name": "id",
2462
+ "in": "path",
2463
+ "required": true,
2464
+ "schema": {
2465
+ "type": "string"
2466
+ }
2467
+ }
2468
+ ],
2469
+ "requestBody": {
2470
+ "content": {
2471
+ "application/json": {
2472
+ "schema": {
2473
+ "$ref": "#/components/schemas/sendTenderSlackMessageRequest"
2474
+ }
2475
+ }
2476
+ },
2477
+ "required": true
2478
+ },
2479
+ "responses": {
2480
+ "204": {
2481
+ "description": "No description"
2482
+ },
2483
+ "400": {
2484
+ "description": "No description"
2485
+ },
2486
+ "404": {
2487
+ "description": "No description"
2488
+ }
2489
+ },
2490
+ "security": [
2491
+ {
2492
+ "Implicit": [
2493
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
2494
+ ]
2495
+ }
2496
+ ]
2497
+ }
2498
+ },
2499
+ "/v1.0/tenders/{id}/consultants/{email}": {
2500
+ "delete": {
2501
+ "tags": [
2502
+ "Tenders"
2503
+ ],
2504
+ "summary": "Remove a consultant assignment from a tender. No-op if the email isn't assigned.",
2505
+ "operationId": "UnassignConsultant",
2506
+ "parameters": [
2507
+ {
2508
+ "name": "id",
2509
+ "in": "path",
2510
+ "required": true,
2511
+ "schema": {
2512
+ "type": "string"
2513
+ }
2514
+ },
2515
+ {
2516
+ "name": "email",
2517
+ "in": "path",
2518
+ "required": true,
2519
+ "schema": {
2520
+ "type": "string"
2521
+ }
2522
+ }
2523
+ ],
2524
+ "responses": {
2525
+ "200": {
2526
+ "description": "Payload of Tender",
2527
+ "content": {
2528
+ "application/json": {
2529
+ "schema": {
2530
+ "$ref": "#/components/schemas/tender"
2531
+ }
2532
+ }
2533
+ }
2534
+ },
2535
+ "404": {
2536
+ "description": "No description"
2537
+ }
2538
+ },
2539
+ "security": [
2540
+ {
2541
+ "Implicit": [
2542
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
2543
+ ]
2544
+ }
2545
+ ]
2546
+ }
2547
+ },
2548
+ "/v1.0/tenders/{id}/jobs": {
2549
+ "get": {
2550
+ "tags": [
2551
+ "Tenders"
2552
+ ],
2553
+ "summary": "Recent agent jobs (ingestion, CV matching, …) for a tender — newest first.",
2554
+ "operationId": "ListTenderJobs",
2555
+ "parameters": [
2556
+ {
2557
+ "name": "id",
2558
+ "in": "path",
2559
+ "required": true,
2560
+ "schema": {
2561
+ "type": "string"
2562
+ }
2563
+ },
2564
+ {
2565
+ "name": "limit",
2566
+ "in": "query",
2567
+ "schema": {
2568
+ "type": "integer",
2569
+ "format": "int32"
2570
+ },
2571
+ "x-ms-summary": "Max rows (default 10, capped at 100)."
2572
+ }
2573
+ ],
2574
+ "responses": {
2575
+ "200": {
2576
+ "description": "Payload of Array of AgentJob",
2577
+ "content": {
2578
+ "application/json": {
2579
+ "schema": {
2580
+ "type": "array",
2581
+ "items": {
2582
+ "$ref": "#/components/schemas/agentJob"
2583
+ }
2584
+ }
2585
+ }
2586
+ }
2587
+ }
2588
+ },
2589
+ "security": [
2590
+ {
2591
+ "Implicit": [
2592
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
2593
+ ]
2594
+ }
2595
+ ]
2596
+ }
2597
+ },
2598
+ "/v1.0/admin/tenders": {
2599
+ "delete": {
2600
+ "tags": [
2601
+ "Admin"
2602
+ ],
2603
+ "summary": "Delete all tenders",
2604
+ "operationId": "DeleteAllTenders",
2605
+ "responses": {
2606
+ "200": {
2607
+ "description": "Payload of Object",
2608
+ "content": {
2609
+ "application/json": {
2610
+ "schema": {
2611
+ "type": "object"
2612
+ }
2613
+ }
2614
+ }
2615
+ }
2616
+ }
2617
+ }
2618
+ },
2619
+ "/v1.0/admin/reprocess-matches": {
2620
+ "post": {
2621
+ "tags": [
2622
+ "Admin"
2623
+ ],
2624
+ "summary": "Trigger CV matching on all tenders",
2625
+ "operationId": "ReprocessMatches",
2626
+ "parameters": [
2627
+ {
2628
+ "name": "unmatchedOnly",
2629
+ "in": "query",
2630
+ "description": "If true, only re-match tenders with no existing consultant matches",
2631
+ "schema": {
2632
+ "type": "boolean"
2633
+ }
2634
+ }
2635
+ ],
2636
+ "responses": {
2637
+ "200": {
2638
+ "description": "Payload of Object",
2639
+ "content": {
2640
+ "application/json": {
2641
+ "schema": {
2642
+ "type": "object"
2643
+ }
2644
+ }
2645
+ }
2646
+ }
2647
+ },
2648
+ "security": [
2649
+ {
2650
+ "Implicit": [
2651
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
2652
+ ]
2653
+ }
2654
+ ]
2655
+ }
2656
+ },
2657
+ "/v1.0/tenders/export.csv": {
2658
+ "get": {
2659
+ "tags": [
2660
+ "Tenders"
2661
+ ],
2662
+ "summary": "Export tenders matching the given filters as RFC 4180 CSV",
2663
+ "operationId": "ExportTendersCsv",
2664
+ "parameters": [
2665
+ {
2666
+ "name": "stage",
2667
+ "in": "query",
2668
+ "description": "Filter by status.stage (e.g. discovery, qualification)",
2669
+ "schema": {
2670
+ "type": "string"
2671
+ }
2672
+ },
2673
+ {
2674
+ "name": "state",
2675
+ "in": "query",
2676
+ "description": "Filter by status.state (e.g. active, irrelevant, ingestion_failed)",
2677
+ "schema": {
2678
+ "type": "string"
2679
+ }
2680
+ },
2681
+ {
2682
+ "name": "fromDate",
2683
+ "in": "query",
2684
+ "description": "Only include tenders with foundAt >= fromDate (ISO 8601)",
2685
+ "schema": {
2686
+ "type": "string",
2687
+ "format": "date-time"
2688
+ }
2689
+ },
2690
+ {
2691
+ "name": "toDate",
2692
+ "in": "query",
2693
+ "description": "Only include tenders with foundAt <= toDate (ISO 8601)",
2694
+ "schema": {
2695
+ "type": "string",
2696
+ "format": "date-time"
2697
+ }
2698
+ }
2699
+ ],
2700
+ "responses": {
2701
+ "200": {
2702
+ "description": "Payload of String",
2703
+ "content": {
2704
+ "text/csv": {
2705
+ "schema": {
2706
+ "type": "string"
2707
+ }
2708
+ }
2709
+ },
2710
+ "x-ms-summary": "CSV file with one tender per row"
2711
+ }
2712
+ },
2713
+ "security": [
2714
+ {
2715
+ "Implicit": [
2716
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
2717
+ ]
2718
+ }
2719
+ ]
2720
+ }
2721
+ },
2722
+ "/v1.0/tenders/stream": {
2723
+ "get": {
2724
+ "tags": [
2725
+ "Tenders"
2726
+ ],
2727
+ "summary": "Server-sent-events stream of tender.created / tender.updated / tender.deleted events",
2728
+ "operationId": "StreamTenderEvents",
2729
+ "responses": {},
2730
+ "security": [
2731
+ {
2732
+ "Implicit": [
2733
+ "api://7e877854-e62d-4637-a655-1da7141f7ac9/.default"
2734
+ ]
2735
+ }
2736
+ ]
2737
+ }
2738
+ }
2739
+ },
2740
+ "components": {
2741
+ "schemas": {
2742
+ "agentJob": {
2743
+ "type": "object",
2744
+ "properties": {
2745
+ "id": {
2746
+ "type": "string",
2747
+ "nullable": true
2748
+ },
2749
+ "type": {
2750
+ "type": "string",
2751
+ "nullable": true
2752
+ },
2753
+ "jobType": {
2754
+ "type": "string",
2755
+ "nullable": true
2756
+ },
2757
+ "tenderId": {
2758
+ "type": "string",
2759
+ "nullable": true
2760
+ },
2761
+ "status": {
2762
+ "type": "string",
2763
+ "nullable": true
2764
+ },
2765
+ "error": {
2766
+ "type": "string",
2767
+ "nullable": true
2768
+ },
2769
+ "result": {
2770
+ "type": "string",
2771
+ "nullable": true
2772
+ },
2773
+ "startedAt": {
2774
+ "type": "string",
2775
+ "format": "date-time",
2776
+ "nullable": true
2777
+ },
2778
+ "completedAt": {
2779
+ "type": "string",
2780
+ "format": "date-time",
2781
+ "nullable": true
2782
+ },
2783
+ "triggeredBy": {
2784
+ "type": "string",
2785
+ "nullable": true
2786
+ },
2787
+ "orchestrationId": {
2788
+ "type": "string",
2789
+ "nullable": true
2790
+ },
2791
+ "externalId": {
2792
+ "type": "string",
2793
+ "nullable": true
2794
+ },
2795
+ "sourceName": {
2796
+ "type": "string",
2797
+ "nullable": true
2798
+ },
2799
+ "inputUrl": {
2800
+ "type": "string",
2801
+ "nullable": true
2802
+ },
2803
+ "inputTitle": {
2804
+ "type": "string",
2805
+ "nullable": true
2806
+ },
2807
+ "logs": {
2808
+ "type": "array",
2809
+ "items": {
2810
+ "$ref": "#/components/schemas/agentJobLogEntry"
2811
+ },
2812
+ "nullable": true
2813
+ },
2814
+ "afterSnapshot": {
2815
+ "type": "string",
2816
+ "nullable": true
2817
+ }
2818
+ }
2819
+ },
2820
+ "agentJobLogEntry": {
2821
+ "type": "object",
2822
+ "properties": {
2823
+ "at": {
2824
+ "type": "string",
2825
+ "format": "date-time",
2826
+ "nullable": true
2827
+ },
2828
+ "level": {
2829
+ "type": "string",
2830
+ "nullable": true
2831
+ },
2832
+ "message": {
2833
+ "type": "string",
2834
+ "nullable": true
2835
+ },
2836
+ "data": {
2837
+ "type": "object",
2838
+ "additionalProperties": {
2839
+ "type": "object"
2840
+ },
2841
+ "nullable": true
2842
+ }
2843
+ }
2844
+ },
2845
+ "assignedConsultant": {
2846
+ "type": "object",
2847
+ "properties": {
2848
+ "email": {
2849
+ "type": "string",
2850
+ "nullable": true
2851
+ },
2852
+ "name": {
2853
+ "type": "string",
2854
+ "nullable": true
2855
+ },
2856
+ "assignedAt": {
2857
+ "type": "string",
2858
+ "format": "date-time",
2859
+ "nullable": true
2860
+ },
2861
+ "assignedBy": {
2862
+ "type": "string",
2863
+ "nullable": true
2864
+ },
2865
+ "note": {
2866
+ "type": "string",
2867
+ "nullable": true
2868
+ }
2869
+ }
2870
+ },
2871
+ "auditEvent": {
2872
+ "type": "object",
2873
+ "properties": {
2874
+ "id": {
2875
+ "type": "string",
2876
+ "nullable": true
2877
+ },
2878
+ "type": {
2879
+ "type": "string",
2880
+ "nullable": true
2881
+ },
2882
+ "tenderId": {
2883
+ "type": "string",
2884
+ "nullable": true
2885
+ },
2886
+ "actorEmail": {
2887
+ "type": "string",
2888
+ "nullable": true
2889
+ },
2890
+ "actorSource": {
2891
+ "type": "string",
2892
+ "nullable": true
2893
+ },
2894
+ "summary": {
2895
+ "type": "string",
2896
+ "nullable": true
2897
+ },
2898
+ "beforeSnapshot": {
2899
+ "$ref": "#/components/schemas/auditSnapshot"
2900
+ },
2901
+ "afterSnapshot": {
2902
+ "$ref": "#/components/schemas/auditSnapshot"
2903
+ },
2904
+ "timestamp": {
2905
+ "type": "string",
2906
+ "format": "date-time",
2907
+ "nullable": true
2908
+ }
2909
+ }
2910
+ },
2911
+ "auditSnapshot": {
2912
+ "type": "object",
2913
+ "properties": {
2914
+ "stage": {
2915
+ "type": "string",
2916
+ "nullable": true
2917
+ },
2918
+ "state": {
2919
+ "type": "string",
2920
+ "nullable": true
2921
+ },
2922
+ "consultantMatchCount": {
2923
+ "type": "integer",
2924
+ "format": "int32",
2925
+ "nullable": true
2926
+ },
2927
+ "selectedConsultantIds": {
2928
+ "type": "array",
2929
+ "items": {
2930
+ "type": "string"
2931
+ },
2932
+ "nullable": true
2933
+ }
2934
+ },
2935
+ "nullable": true
2936
+ },
2937
+ "backfillSlugsResult": {
2938
+ "type": "object",
2939
+ "properties": {
2940
+ "total": {
2941
+ "type": "integer",
2942
+ "format": "int32"
2943
+ },
2944
+ "alreadyHad": {
2945
+ "type": "integer",
2946
+ "format": "int32"
2947
+ },
2948
+ "updated": {
2949
+ "type": "integer",
2950
+ "format": "int32"
2951
+ }
2952
+ }
2953
+ },
2954
+ "bulkDeleteJobError": {
2955
+ "type": "object",
2956
+ "properties": {
2957
+ "jobId": {
2958
+ "type": "string"
2959
+ },
2960
+ "message": {
2961
+ "type": "string"
2962
+ }
2963
+ }
2964
+ },
2965
+ "bulkDeleteJobsRequest": {
2966
+ "type": "object",
2967
+ "properties": {
2968
+ "jobIds": {
2969
+ "type": "array",
2970
+ "items": {
2971
+ "type": "string"
2972
+ }
2973
+ }
2974
+ }
2975
+ },
2976
+ "bulkDeleteJobsResponse": {
2977
+ "type": "object",
2978
+ "properties": {
2979
+ "deleted": {
2980
+ "type": "integer",
2981
+ "format": "int32"
2982
+ },
2983
+ "errors": {
2984
+ "type": "array",
2985
+ "items": {
2986
+ "$ref": "#/components/schemas/bulkDeleteJobError"
2987
+ }
2988
+ }
2989
+ }
2990
+ },
2991
+ "consultantAnswers": {
2992
+ "type": "object",
2993
+ "properties": {
2994
+ "consultantId": {
2995
+ "type": "string",
2996
+ "nullable": true
2997
+ },
2998
+ "email": {
2999
+ "type": "string",
3000
+ "nullable": true
3001
+ },
3002
+ "name": {
3003
+ "type": "string",
3004
+ "nullable": true
3005
+ },
3006
+ "generatedAt": {
3007
+ "type": "string",
3008
+ "format": "date-time",
3009
+ "nullable": true
3010
+ },
3011
+ "filledDocumentId": {
3012
+ "type": "string",
3013
+ "nullable": true
3014
+ }
3015
+ }
3016
+ },
3017
+ "consultantMatch": {
3018
+ "type": "object",
3019
+ "properties": {
3020
+ "consultantId": {
3021
+ "type": "string",
3022
+ "nullable": true
3023
+ },
3024
+ "name": {
3025
+ "type": "string",
3026
+ "nullable": true
3027
+ },
3028
+ "fitScore": {
3029
+ "type": "number",
3030
+ "format": "double",
3031
+ "nullable": true
3032
+ },
3033
+ "availabilityStatus": {
3034
+ "type": "string",
3035
+ "nullable": true
3036
+ },
329
3037
  "availableFrom": {
330
3038
  "type": "string",
331
3039
  "nullable": true
332
3040
  },
333
- "matchedTechnologies": {
3041
+ "matchedTechnologies": {
3042
+ "type": "array",
3043
+ "items": {
3044
+ "type": "string"
3045
+ },
3046
+ "nullable": true
3047
+ },
3048
+ "missingTechnologies": {
3049
+ "type": "array",
3050
+ "items": {
3051
+ "type": "string"
3052
+ },
3053
+ "nullable": true
3054
+ },
3055
+ "selected": {
3056
+ "type": "boolean",
3057
+ "nullable": true
3058
+ },
3059
+ "fitExplanation": {
3060
+ "type": "string",
3061
+ "nullable": true
3062
+ },
3063
+ "cvSummary": {
3064
+ "type": "string",
3065
+ "nullable": true
3066
+ },
3067
+ "seniority": {
3068
+ "type": "string",
3069
+ "nullable": true
3070
+ },
3071
+ "email": {
3072
+ "type": "string",
3073
+ "nullable": true
3074
+ },
3075
+ "notifiedAt": {
3076
+ "type": "string",
3077
+ "format": "date-time",
3078
+ "nullable": true
3079
+ },
3080
+ "consultantChannelNotifiedAt": {
3081
+ "type": "string",
3082
+ "format": "date-time",
3083
+ "nullable": true
3084
+ }
3085
+ }
3086
+ },
3087
+ "consultantStatsResponse": {
3088
+ "type": "object",
3089
+ "properties": {
3090
+ "total": {
3091
+ "type": "integer",
3092
+ "format": "int32"
3093
+ },
3094
+ "available": {
3095
+ "type": "integer",
3096
+ "format": "int32"
3097
+ },
3098
+ "onAssignment": {
3099
+ "type": "integer",
3100
+ "format": "int32"
3101
+ },
3102
+ "unknownAvailability": {
3103
+ "type": "integer",
3104
+ "format": "int32"
3105
+ },
3106
+ "avgFitScore": {
3107
+ "type": "number",
3108
+ "format": "double",
3109
+ "nullable": true
3110
+ }
3111
+ }
3112
+ },
3113
+ "consultantSummary": {
3114
+ "type": "object",
3115
+ "properties": {
3116
+ "userId": {
3117
+ "type": "string",
3118
+ "nullable": true
3119
+ },
3120
+ "email": {
3121
+ "type": "string",
3122
+ "nullable": true
3123
+ },
3124
+ "name": {
3125
+ "type": "string",
3126
+ "nullable": true
3127
+ },
3128
+ "technologies": {
3129
+ "type": "array",
3130
+ "items": {
3131
+ "type": "string"
3132
+ },
3133
+ "nullable": true
3134
+ },
3135
+ "roles": {
3136
+ "type": "array",
3137
+ "items": {
3138
+ "type": "string"
3139
+ },
3140
+ "nullable": true
3141
+ },
3142
+ "yearsExperience": {
3143
+ "type": "integer",
3144
+ "format": "int32",
3145
+ "nullable": true
3146
+ }
3147
+ }
3148
+ },
3149
+ "crawlActivityResponse": {
3150
+ "type": "object",
3151
+ "properties": {
3152
+ "items": {
3153
+ "type": "array",
3154
+ "items": {
3155
+ "$ref": "#/components/schemas/agentJob"
3156
+ }
3157
+ },
3158
+ "total": {
3159
+ "type": "integer",
3160
+ "format": "int32"
3161
+ }
3162
+ }
3163
+ },
3164
+ "crawledNotice": {
3165
+ "type": "object",
3166
+ "properties": {
3167
+ "sourceName": {
3168
+ "type": "string"
3169
+ },
3170
+ "id": {
3171
+ "type": "string"
3172
+ },
3173
+ "title": {
3174
+ "type": "string"
3175
+ },
3176
+ "url": {
3177
+ "type": "string"
3178
+ }
3179
+ }
3180
+ },
3181
+ "crawlPattern": {
3182
+ "type": "object",
3183
+ "properties": {
3184
+ "sourceName": {
3185
+ "type": "string"
3186
+ },
3187
+ "detailUrlRegex": {
3188
+ "type": "string"
3189
+ },
3190
+ "paginationUrlRegex": {
3191
+ "type": "string"
3192
+ },
3193
+ "sampleCount": {
3194
+ "type": "integer",
3195
+ "format": "int32"
3196
+ },
3197
+ "bootstrappedAt": {
3198
+ "type": "string",
3199
+ "format": "date-time"
3200
+ }
3201
+ }
3202
+ },
3203
+ "crawlPreviewResponse": {
3204
+ "type": "object",
3205
+ "properties": {
3206
+ "sourceName": {
3207
+ "type": "string"
3208
+ },
3209
+ "notices": {
3210
+ "type": "array",
3211
+ "items": {
3212
+ "$ref": "#/components/schemas/crawledNotice"
3213
+ }
3214
+ },
3215
+ "pattern": {
3216
+ "$ref": "#/components/schemas/crawlPattern"
3217
+ },
3218
+ "startedAt": {
3219
+ "type": "string",
3220
+ "format": "date-time"
3221
+ },
3222
+ "finishedAt": {
3223
+ "type": "string",
3224
+ "format": "date-time"
3225
+ },
3226
+ "warnings": {
3227
+ "type": "array",
3228
+ "items": {
3229
+ "type": "string"
3230
+ }
3231
+ }
3232
+ }
3233
+ },
3234
+ "crawlScanResponse": {
3235
+ "type": "object",
3236
+ "properties": {
3237
+ "sourceName": {
3238
+ "type": "string"
3239
+ },
3240
+ "discovered": {
3241
+ "type": "integer",
3242
+ "format": "int32"
3243
+ },
3244
+ "queued": {
3245
+ "type": "integer",
3246
+ "format": "int32"
3247
+ },
3248
+ "merged": {
3249
+ "type": "integer",
3250
+ "format": "int32"
3251
+ }
3252
+ }
3253
+ },
3254
+ "crawlSourceConfig": {
3255
+ "type": "object",
3256
+ "properties": {
3257
+ "name": {
3258
+ "type": "string"
3259
+ },
3260
+ "seedUrl": {
3261
+ "type": "string"
3262
+ },
3263
+ "maxPages": {
3264
+ "type": "integer",
3265
+ "format": "int32"
3266
+ },
3267
+ "enabled": {
3268
+ "type": "boolean"
3269
+ },
3270
+ "createdAt": {
3271
+ "type": "string",
3272
+ "format": "date-time"
3273
+ },
3274
+ "updatedAt": {
3275
+ "type": "string",
3276
+ "format": "date-time"
3277
+ }
3278
+ }
3279
+ },
3280
+ "crawlSourceUpsertRequest": {
3281
+ "type": "object",
3282
+ "properties": {
3283
+ "seedUrl": {
3284
+ "type": "string"
3285
+ },
3286
+ "maxPages": {
3287
+ "type": "integer",
3288
+ "format": "int32",
3289
+ "nullable": true
3290
+ },
3291
+ "enabled": {
3292
+ "type": "boolean",
3293
+ "nullable": true
3294
+ }
3295
+ }
3296
+ },
3297
+ "crawlSourceWithPattern": {
3298
+ "type": "object",
3299
+ "properties": {
3300
+ "source": {
3301
+ "$ref": "#/components/schemas/crawlSourceConfig"
3302
+ },
3303
+ "pattern": {
3304
+ "$ref": "#/components/schemas/crawlPattern"
3305
+ },
3306
+ "lastActivityAt": {
3307
+ "type": "string",
3308
+ "format": "date-time",
3309
+ "nullable": true
3310
+ }
3311
+ }
3312
+ },
3313
+ "crawlStatsResponse": {
3314
+ "type": "object",
3315
+ "properties": {
3316
+ "sourceCount": {
3317
+ "type": "integer",
3318
+ "format": "int32"
3319
+ },
3320
+ "enabledSourceCount": {
3321
+ "type": "integer",
3322
+ "format": "int32"
3323
+ },
3324
+ "tendersActive": {
3325
+ "type": "integer",
3326
+ "format": "int32"
3327
+ },
3328
+ "tendersIrrelevant": {
3329
+ "type": "integer",
3330
+ "format": "int32"
3331
+ },
3332
+ "tendersIngestionFailed": {
3333
+ "type": "integer",
3334
+ "format": "int32"
3335
+ },
3336
+ "jobsPending": {
3337
+ "type": "integer",
3338
+ "format": "int32"
3339
+ },
3340
+ "jobsRunning": {
3341
+ "type": "integer",
3342
+ "format": "int32"
3343
+ },
3344
+ "jobsCompleted": {
3345
+ "type": "integer",
3346
+ "format": "int32"
3347
+ },
3348
+ "jobsFailed": {
3349
+ "type": "integer",
3350
+ "format": "int32"
3351
+ },
3352
+ "sources": {
3353
+ "type": "array",
3354
+ "items": {
3355
+ "$ref": "#/components/schemas/sourceSummary"
3356
+ }
3357
+ }
3358
+ }
3359
+ },
3360
+ "deleteFailedTendersResponse": {
3361
+ "type": "object",
3362
+ "properties": {
3363
+ "sourceName": {
3364
+ "type": "string"
3365
+ },
3366
+ "matched": {
3367
+ "type": "integer",
3368
+ "format": "int32"
3369
+ },
3370
+ "deleted": {
3371
+ "type": "integer",
3372
+ "format": "int32"
3373
+ }
3374
+ }
3375
+ },
3376
+ "discoverListingRequest": {
3377
+ "type": "object",
3378
+ "properties": {
3379
+ "homeUrl": {
3380
+ "type": "string"
3381
+ }
3382
+ }
3383
+ },
3384
+ "discoverListingResponse": {
3385
+ "type": "object",
3386
+ "properties": {
3387
+ "candidates": {
3388
+ "type": "array",
3389
+ "items": {
3390
+ "$ref": "#/components/schemas/listingCandidate"
3391
+ }
3392
+ }
3393
+ }
3394
+ },
3395
+ "externalSourceRef": {
3396
+ "type": "object",
3397
+ "properties": {
3398
+ "system": {
3399
+ "type": "string",
3400
+ "nullable": true
3401
+ },
3402
+ "externalId": {
3403
+ "type": "string",
3404
+ "nullable": true
3405
+ },
3406
+ "url": {
3407
+ "type": "string",
3408
+ "nullable": true
3409
+ },
3410
+ "discoveredAt": {
3411
+ "type": "string",
3412
+ "format": "date-time",
3413
+ "nullable": true
3414
+ }
3415
+ }
3416
+ },
3417
+ "extractedQuestion": {
3418
+ "type": "object",
3419
+ "properties": {
3420
+ "id": {
3421
+ "type": "string",
3422
+ "nullable": true
3423
+ },
3424
+ "text": {
3425
+ "type": "string",
3426
+ "nullable": true
3427
+ },
3428
+ "kind": {
3429
+ "type": "string",
3430
+ "nullable": true
3431
+ },
3432
+ "expectedAnswerShape": {
3433
+ "type": "string",
3434
+ "nullable": true
3435
+ },
3436
+ "section": {
3437
+ "type": "string",
3438
+ "nullable": true
3439
+ },
3440
+ "sourceExcerpt": {
3441
+ "type": "string",
3442
+ "nullable": true
3443
+ },
3444
+ "placeholder": {
3445
+ "type": "string",
3446
+ "nullable": true
3447
+ },
3448
+ "currentValue": {
3449
+ "type": "string",
3450
+ "nullable": true
3451
+ },
3452
+ "sourceStrategy": {
3453
+ "type": "string",
3454
+ "nullable": true
3455
+ },
3456
+ "suggestedDataSource": {
3457
+ "type": "string",
3458
+ "nullable": true
3459
+ },
3460
+ "location": {
3461
+ "$ref": "#/components/schemas/questionLocation"
3462
+ }
3463
+ }
3464
+ },
3465
+ "extractedQuestionSet": {
3466
+ "type": "object",
3467
+ "properties": {
3468
+ "isFillable": {
3469
+ "type": "boolean",
3470
+ "nullable": true
3471
+ },
3472
+ "questions": {
334
3473
  "type": "array",
335
3474
  "items": {
336
- "type": "string"
3475
+ "$ref": "#/components/schemas/extractedQuestion"
337
3476
  },
338
3477
  "nullable": true
339
3478
  },
340
- "missingTechnologies": {
3479
+ "extractedAt": {
3480
+ "type": "string",
3481
+ "format": "date-time",
3482
+ "nullable": true
3483
+ }
3484
+ },
3485
+ "nullable": true
3486
+ },
3487
+ "funnelResponse": {
3488
+ "type": "object",
3489
+ "properties": {
3490
+ "windowDays": {
3491
+ "type": "integer",
3492
+ "format": "int32"
3493
+ },
3494
+ "countByStage": {
3495
+ "type": "object",
3496
+ "additionalProperties": {
3497
+ "type": "integer",
3498
+ "format": "int32"
3499
+ }
3500
+ },
3501
+ "conversionRates": {
3502
+ "type": "object",
3503
+ "additionalProperties": {
3504
+ "type": "number",
3505
+ "format": "double"
3506
+ }
3507
+ },
3508
+ "avgCycleDays": {
3509
+ "type": "object",
3510
+ "additionalProperties": {
3511
+ "type": "number",
3512
+ "format": "double"
3513
+ }
3514
+ },
3515
+ "wonCount": {
3516
+ "type": "integer",
3517
+ "format": "int32"
3518
+ },
3519
+ "lostCount": {
3520
+ "type": "integer",
3521
+ "format": "int32"
3522
+ },
3523
+ "winRatePct": {
3524
+ "type": "number",
3525
+ "format": "double",
3526
+ "nullable": true
3527
+ },
3528
+ "stageTransitionsInWindow": {
3529
+ "type": "object",
3530
+ "additionalProperties": {
3531
+ "type": "integer",
3532
+ "format": "int32"
3533
+ }
3534
+ }
3535
+ }
3536
+ },
3537
+ "ingestionAttachment": {
3538
+ "type": "object",
3539
+ "properties": {
3540
+ "name": {
3541
+ "type": "string",
3542
+ "nullable": true
3543
+ },
3544
+ "contentType": {
3545
+ "type": "string",
3546
+ "nullable": true
3547
+ },
3548
+ "blobPath": {
3549
+ "type": "string",
3550
+ "nullable": true
3551
+ },
3552
+ "sizeBytes": {
3553
+ "type": "integer",
3554
+ "format": "int64",
3555
+ "nullable": true
3556
+ }
3557
+ }
3558
+ },
3559
+ "ingestionRequest": {
3560
+ "type": "object",
3561
+ "properties": {
3562
+ "sourceType": {
3563
+ "type": "string",
3564
+ "nullable": true
3565
+ },
3566
+ "content": {
3567
+ "type": "string",
3568
+ "nullable": true
3569
+ },
3570
+ "title": {
3571
+ "type": "string",
3572
+ "nullable": true
3573
+ },
3574
+ "existingTenderId": {
3575
+ "type": "string",
3576
+ "nullable": true
3577
+ },
3578
+ "externalId": {
3579
+ "type": "string",
3580
+ "nullable": true
3581
+ },
3582
+ "attachments": {
341
3583
  "type": "array",
342
3584
  "items": {
343
- "type": "string"
3585
+ "$ref": "#/components/schemas/ingestionAttachment"
344
3586
  },
345
3587
  "nullable": true
3588
+ }
3589
+ }
3590
+ },
3591
+ "listingCandidate": {
3592
+ "type": "object",
3593
+ "properties": {
3594
+ "url": {
3595
+ "type": "string"
346
3596
  },
347
- "selected": {
3597
+ "label": {
3598
+ "type": "string"
3599
+ },
3600
+ "confidence": {
3601
+ "type": "number",
3602
+ "format": "double"
3603
+ }
3604
+ }
3605
+ },
3606
+ "negotiateRequest": {
3607
+ "type": "object",
3608
+ "properties": {
3609
+ "groups": {
3610
+ "type": "array",
3611
+ "items": {
3612
+ "type": "string"
3613
+ }
3614
+ }
3615
+ }
3616
+ },
3617
+ "negotiateResponse": {
3618
+ "type": "object",
3619
+ "properties": {
3620
+ "url": {
3621
+ "type": "string"
3622
+ },
3623
+ "accessToken": {
3624
+ "type": "string"
3625
+ },
3626
+ "hubName": {
3627
+ "type": "string"
3628
+ },
3629
+ "groups": {
3630
+ "type": "array",
3631
+ "items": {
3632
+ "type": "string"
3633
+ }
3634
+ }
3635
+ }
3636
+ },
3637
+ "patchDocumentRequest": {
3638
+ "type": "object",
3639
+ "properties": {
3640
+ "isCompetenceMatrixSource": {
348
3641
  "type": "boolean",
349
3642
  "nullable": true
350
3643
  }
351
3644
  }
352
3645
  },
353
- "parseRun": {
3646
+ "patchDocumentResponse": {
354
3647
  "type": "object",
355
3648
  "properties": {
356
- "id": {
3649
+ "document": {
3650
+ "$ref": "#/components/schemas/tenderDocument"
3651
+ },
3652
+ "extractionJob": {
3653
+ "$ref": "#/components/schemas/agentJob"
3654
+ }
3655
+ }
3656
+ },
3657
+ "questionFillRequest": {
3658
+ "type": "object",
3659
+ "properties": {
3660
+ "consultantEmails": {
3661
+ "type": "array",
3662
+ "items": {
3663
+ "type": "string"
3664
+ },
3665
+ "nullable": true
3666
+ }
3667
+ }
3668
+ },
3669
+ "questionLocation": {
3670
+ "type": "object",
3671
+ "properties": {
3672
+ "xmlPart": {
3673
+ "type": "string",
3674
+ "nullable": true
3675
+ },
3676
+ "bodyIndex": {
3677
+ "type": "integer",
3678
+ "format": "int32",
3679
+ "nullable": true
3680
+ },
3681
+ "tableIndex": {
3682
+ "type": "integer",
3683
+ "format": "int32",
3684
+ "nullable": true
3685
+ },
3686
+ "rowIndex": {
3687
+ "type": "integer",
3688
+ "format": "int32",
3689
+ "nullable": true
3690
+ },
3691
+ "colIndex": {
3692
+ "type": "integer",
3693
+ "format": "int32",
3694
+ "nullable": true
3695
+ },
3696
+ "sdtId": {
357
3697
  "type": "string",
358
3698
  "nullable": true
359
3699
  },
3700
+ "sheetName": {
3701
+ "type": "string",
3702
+ "nullable": true
3703
+ },
3704
+ "cellReference": {
3705
+ "type": "string",
3706
+ "nullable": true
3707
+ }
3708
+ },
3709
+ "nullable": true
3710
+ },
3711
+ "salesforceAttributes": {
3712
+ "type": "object",
3713
+ "properties": {
360
3714
  "type": {
361
3715
  "type": "string",
362
3716
  "nullable": true
363
3717
  },
364
- "tenderId": {
3718
+ "url": {
365
3719
  "type": "string",
366
3720
  "nullable": true
3721
+ }
3722
+ },
3723
+ "nullable": true
3724
+ },
3725
+ "salesforceOpportunity": {
3726
+ "type": "object",
3727
+ "properties": {
3728
+ "attributes": {
3729
+ "$ref": "#/components/schemas/salesforceAttributes"
367
3730
  },
368
- "sourceFiles": {
369
- "type": "array",
370
- "items": {
371
- "$ref": "#/components/schemas/sourceFile"
372
- },
3731
+ "Id": {
3732
+ "type": "string",
373
3733
  "nullable": true
374
3734
  },
375
- "status": {
3735
+ "Name": {
376
3736
  "type": "string",
377
3737
  "nullable": true
378
3738
  },
379
- "version": {
3739
+ "StageName": {
380
3740
  "type": "string",
381
3741
  "nullable": true
382
3742
  },
383
- "confidence": {
3743
+ "CloseDate": {
3744
+ "type": "string",
3745
+ "format": "date-time",
3746
+ "nullable": true
3747
+ },
3748
+ "IsClosed": {
3749
+ "type": "boolean",
3750
+ "nullable": true
3751
+ },
3752
+ "IsWon": {
3753
+ "type": "boolean",
3754
+ "nullable": true
3755
+ },
3756
+ "Amount": {
384
3757
  "type": "number",
385
3758
  "format": "double",
386
3759
  "nullable": true
387
3760
  },
388
- "warnings": {
389
- "type": "array",
390
- "items": {
391
- "type": "string"
392
- },
3761
+ "Account": {
3762
+ "$ref": "#/components/schemas/salesforceReference"
3763
+ },
3764
+ "Owner": {
3765
+ "$ref": "#/components/schemas/salesforceReference"
3766
+ },
3767
+ "Snokam_Tender_Id__c": {
3768
+ "type": "string",
3769
+ "nullable": true
3770
+ }
3771
+ }
3772
+ },
3773
+ "salesforceOpportunityStage": {
3774
+ "type": "object",
3775
+ "properties": {
3776
+ "MasterLabel": {
3777
+ "type": "string",
3778
+ "nullable": true
3779
+ },
3780
+ "ApiName": {
3781
+ "type": "string",
3782
+ "nullable": true
3783
+ },
3784
+ "IsActive": {
3785
+ "type": "boolean",
3786
+ "nullable": true
3787
+ },
3788
+ "IsClosed": {
3789
+ "type": "boolean",
3790
+ "nullable": true
3791
+ },
3792
+ "IsWon": {
3793
+ "type": "boolean",
3794
+ "nullable": true
3795
+ },
3796
+ "SortOrder": {
3797
+ "type": "integer",
3798
+ "format": "int32",
3799
+ "nullable": true
3800
+ }
3801
+ }
3802
+ },
3803
+ "salesforceReference": {
3804
+ "type": "object",
3805
+ "properties": {
3806
+ "Name": {
3807
+ "type": "string",
3808
+ "nullable": true
3809
+ },
3810
+ "Id": {
3811
+ "type": "string",
393
3812
  "nullable": true
394
3813
  },
395
- "startedAt": {
3814
+ "Email": {
396
3815
  "type": "string",
397
- "format": "date-time",
398
3816
  "nullable": true
3817
+ }
3818
+ },
3819
+ "nullable": true
3820
+ },
3821
+ "salesforceRefreshResult": {
3822
+ "type": "object",
3823
+ "properties": {
3824
+ "checked": {
3825
+ "type": "integer",
3826
+ "format": "int32"
399
3827
  },
400
- "completedAt": {
3828
+ "updated": {
3829
+ "type": "integer",
3830
+ "format": "int32"
3831
+ }
3832
+ }
3833
+ },
3834
+ "sendTenderSlackMessageRequest": {
3835
+ "type": "object",
3836
+ "properties": {
3837
+ "employeeName": {
401
3838
  "type": "string",
402
- "format": "date-time",
403
3839
  "nullable": true
404
3840
  },
405
- "triggeredBy": {
3841
+ "message": {
406
3842
  "type": "string",
407
3843
  "nullable": true
408
3844
  }
@@ -421,6 +3857,32 @@
421
3857
  }
422
3858
  }
423
3859
  },
3860
+ "sourceSummary": {
3861
+ "type": "object",
3862
+ "properties": {
3863
+ "name": {
3864
+ "type": "string"
3865
+ },
3866
+ "seedUrl": {
3867
+ "type": "string"
3868
+ },
3869
+ "enabled": {
3870
+ "type": "boolean"
3871
+ },
3872
+ "hasPattern": {
3873
+ "type": "boolean"
3874
+ },
3875
+ "patternSampleCount": {
3876
+ "type": "integer",
3877
+ "format": "int32"
3878
+ },
3879
+ "patternBootstrappedAt": {
3880
+ "type": "string",
3881
+ "format": "date-time",
3882
+ "nullable": true
3883
+ }
3884
+ }
3885
+ },
424
3886
  "tender": {
425
3887
  "type": "object",
426
3888
  "properties": {
@@ -432,6 +3894,10 @@
432
3894
  "type": "string",
433
3895
  "nullable": true
434
3896
  },
3897
+ "slug": {
3898
+ "type": "string",
3899
+ "nullable": true
3900
+ },
435
3901
  "source": {
436
3902
  "$ref": "#/components/schemas/tenderSource"
437
3903
  },
@@ -471,8 +3937,40 @@
471
3937
  },
472
3938
  "nullable": true
473
3939
  },
3940
+ "assignedConsultants": {
3941
+ "type": "array",
3942
+ "items": {
3943
+ "$ref": "#/components/schemas/assignedConsultant"
3944
+ },
3945
+ "nullable": true
3946
+ },
3947
+ "cvProposal": {
3948
+ "$ref": "#/components/schemas/tenderCvProposal"
3949
+ },
474
3950
  "audit": {
475
3951
  "$ref": "#/components/schemas/tenderAudit"
3952
+ },
3953
+ "description": {
3954
+ "type": "string",
3955
+ "nullable": true
3956
+ },
3957
+ "summary": {
3958
+ "type": "string",
3959
+ "nullable": true
3960
+ },
3961
+ "timeline": {
3962
+ "type": "array",
3963
+ "items": {
3964
+ "$ref": "#/components/schemas/timelineEvent"
3965
+ },
3966
+ "nullable": true
3967
+ },
3968
+ "blobContainer": {
3969
+ "type": "string",
3970
+ "nullable": true
3971
+ },
3972
+ "salesforce": {
3973
+ "$ref": "#/components/schemas/tenderSalesforce"
476
3974
  }
477
3975
  }
478
3976
  },
@@ -544,6 +4042,61 @@
544
4042
  },
545
4043
  "nullable": true
546
4044
  },
4045
+ "tenderCvProposal": {
4046
+ "type": "object",
4047
+ "properties": {
4048
+ "proposalId": {
4049
+ "type": "string",
4050
+ "nullable": true
4051
+ },
4052
+ "createdAt": {
4053
+ "type": "string",
4054
+ "format": "date-time",
4055
+ "nullable": true
4056
+ },
4057
+ "createdBy": {
4058
+ "type": "string",
4059
+ "nullable": true
4060
+ },
4061
+ "variants": {
4062
+ "type": "array",
4063
+ "items": {
4064
+ "$ref": "#/components/schemas/tenderCvVariant"
4065
+ },
4066
+ "nullable": true
4067
+ }
4068
+ }
4069
+ },
4070
+ "tenderCvVariant": {
4071
+ "type": "object",
4072
+ "properties": {
4073
+ "consultantEmail": {
4074
+ "type": "string",
4075
+ "nullable": true
4076
+ },
4077
+ "consultantName": {
4078
+ "type": "string",
4079
+ "nullable": true
4080
+ },
4081
+ "userId": {
4082
+ "type": "string",
4083
+ "nullable": true
4084
+ },
4085
+ "tailoredCvId": {
4086
+ "type": "string",
4087
+ "nullable": true
4088
+ },
4089
+ "attachmentId": {
4090
+ "type": "string",
4091
+ "nullable": true
4092
+ },
4093
+ "createdAt": {
4094
+ "type": "string",
4095
+ "format": "date-time",
4096
+ "nullable": true
4097
+ }
4098
+ }
4099
+ },
547
4100
  "tenderDates": {
548
4101
  "type": "object",
549
4102
  "properties": {
@@ -610,6 +4163,67 @@
610
4163
  "type": "string",
611
4164
  "format": "date-time",
612
4165
  "nullable": true
4166
+ },
4167
+ "blobPath": {
4168
+ "type": "string",
4169
+ "nullable": true
4170
+ },
4171
+ "blobUrl": {
4172
+ "type": "string",
4173
+ "nullable": true
4174
+ },
4175
+ "sourceUrl": {
4176
+ "type": "string",
4177
+ "nullable": true
4178
+ },
4179
+ "mimeType": {
4180
+ "type": "string",
4181
+ "nullable": true
4182
+ },
4183
+ "sizeBytes": {
4184
+ "type": "integer",
4185
+ "format": "int64",
4186
+ "nullable": true
4187
+ },
4188
+ "downloadedAt": {
4189
+ "type": "string",
4190
+ "format": "date-time",
4191
+ "nullable": true
4192
+ },
4193
+ "textContent": {
4194
+ "type": "string",
4195
+ "nullable": true
4196
+ },
4197
+ "isCompetenceMatrixSource": {
4198
+ "type": "boolean",
4199
+ "nullable": true
4200
+ },
4201
+ "classificationReasoning": {
4202
+ "type": "string",
4203
+ "nullable": true
4204
+ },
4205
+ "extractedQuestions": {
4206
+ "$ref": "#/components/schemas/extractedQuestionSet"
4207
+ },
4208
+ "questionAnswers": {
4209
+ "type": "array",
4210
+ "items": {
4211
+ "$ref": "#/components/schemas/consultantAnswers"
4212
+ },
4213
+ "nullable": true
4214
+ },
4215
+ "extractionStatus": {
4216
+ "type": "string",
4217
+ "nullable": true
4218
+ },
4219
+ "extractionError": {
4220
+ "type": "string",
4221
+ "nullable": true
4222
+ },
4223
+ "extractionStartedAt": {
4224
+ "type": "string",
4225
+ "format": "date-time",
4226
+ "nullable": true
613
4227
  }
614
4228
  }
615
4229
  },
@@ -627,6 +4241,14 @@
627
4241
  "country": {
628
4242
  "type": "string",
629
4243
  "nullable": true
4244
+ },
4245
+ "location": {
4246
+ "type": "string",
4247
+ "nullable": true
4248
+ },
4249
+ "workMode": {
4250
+ "type": "string",
4251
+ "nullable": true
630
4252
  }
631
4253
  },
632
4254
  "nullable": true
@@ -662,6 +4284,37 @@
662
4284
  },
663
4285
  "nullable": true
664
4286
  },
4287
+ "tenderSalesforce": {
4288
+ "type": "object",
4289
+ "properties": {
4290
+ "opportunityId": {
4291
+ "type": "string",
4292
+ "nullable": true
4293
+ },
4294
+ "stageName": {
4295
+ "type": "string",
4296
+ "nullable": true
4297
+ },
4298
+ "isClosed": {
4299
+ "type": "boolean",
4300
+ "nullable": true
4301
+ },
4302
+ "isWon": {
4303
+ "type": "boolean",
4304
+ "nullable": true
4305
+ },
4306
+ "url": {
4307
+ "type": "string",
4308
+ "nullable": true
4309
+ },
4310
+ "lastSyncedAt": {
4311
+ "type": "string",
4312
+ "format": "date-time",
4313
+ "nullable": true
4314
+ }
4315
+ },
4316
+ "nullable": true
4317
+ },
665
4318
  "tenderSource": {
666
4319
  "type": "object",
667
4320
  "properties": {
@@ -673,16 +4326,74 @@
673
4326
  "type": "string",
674
4327
  "nullable": true
675
4328
  },
4329
+ "sourceUrl": {
4330
+ "type": "string",
4331
+ "nullable": true
4332
+ },
676
4333
  "sourceFiles": {
677
4334
  "type": "array",
678
4335
  "items": {
679
4336
  "$ref": "#/components/schemas/sourceFile"
680
4337
  },
681
4338
  "nullable": true
4339
+ },
4340
+ "additionalSources": {
4341
+ "type": "array",
4342
+ "items": {
4343
+ "$ref": "#/components/schemas/externalSourceRef"
4344
+ },
4345
+ "nullable": true
682
4346
  }
683
4347
  },
684
4348
  "nullable": true
685
4349
  },
4350
+ "tenderStatsResponse": {
4351
+ "type": "object",
4352
+ "properties": {
4353
+ "byStatus": {
4354
+ "type": "object",
4355
+ "additionalProperties": {
4356
+ "type": "integer",
4357
+ "format": "int32"
4358
+ }
4359
+ },
4360
+ "byStage": {
4361
+ "type": "object",
4362
+ "additionalProperties": {
4363
+ "type": "integer",
4364
+ "format": "int32"
4365
+ }
4366
+ },
4367
+ "byHealth": {
4368
+ "type": "object",
4369
+ "additionalProperties": {
4370
+ "type": "integer",
4371
+ "format": "int32"
4372
+ }
4373
+ },
4374
+ "total": {
4375
+ "type": "integer",
4376
+ "format": "int32"
4377
+ },
4378
+ "windowDays": {
4379
+ "type": "integer",
4380
+ "format": "int32"
4381
+ },
4382
+ "tendersInWindow": {
4383
+ "type": "integer",
4384
+ "format": "int32"
4385
+ },
4386
+ "consultantsMatched": {
4387
+ "type": "integer",
4388
+ "format": "int32"
4389
+ },
4390
+ "avgTimeToMatchHours": {
4391
+ "type": "number",
4392
+ "format": "double",
4393
+ "nullable": true
4394
+ }
4395
+ }
4396
+ },
686
4397
  "tenderStatus": {
687
4398
  "type": "object",
688
4399
  "properties": {
@@ -747,6 +4458,67 @@
747
4458
  "nullable": true
748
4459
  }
749
4460
  }
4461
+ },
4462
+ "timelineEvent": {
4463
+ "type": "object",
4464
+ "properties": {
4465
+ "id": {
4466
+ "type": "string",
4467
+ "nullable": true
4468
+ },
4469
+ "title": {
4470
+ "type": "string",
4471
+ "nullable": true
4472
+ },
4473
+ "description": {
4474
+ "type": "string",
4475
+ "nullable": true
4476
+ },
4477
+ "dueAt": {
4478
+ "type": "string",
4479
+ "format": "date-time",
4480
+ "nullable": true
4481
+ },
4482
+ "category": {
4483
+ "type": "string",
4484
+ "nullable": true
4485
+ },
4486
+ "mandatory": {
4487
+ "type": "boolean",
4488
+ "nullable": true
4489
+ },
4490
+ "status": {
4491
+ "type": "string",
4492
+ "nullable": true
4493
+ }
4494
+ }
4495
+ },
4496
+ "updateSalesforceStageRequest": {
4497
+ "type": "object",
4498
+ "properties": {
4499
+ "stageName": {
4500
+ "type": "string"
4501
+ }
4502
+ }
4503
+ },
4504
+ "zombieReapResult": {
4505
+ "type": "object",
4506
+ "properties": {
4507
+ "scanned": {
4508
+ "type": "integer",
4509
+ "format": "int32"
4510
+ },
4511
+ "reaped": {
4512
+ "type": "integer",
4513
+ "format": "int32"
4514
+ },
4515
+ "reapedJobIds": {
4516
+ "type": "array",
4517
+ "items": {
4518
+ "type": "string"
4519
+ }
4520
+ }
4521
+ }
750
4522
  }
751
4523
  },
752
4524
  "securitySchemes": {