airbyte-agent-greenhouse 0.17.48__py3-none-any.whl

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.
Files changed (57) hide show
  1. airbyte_agent_greenhouse/__init__.py +105 -0
  2. airbyte_agent_greenhouse/_vendored/__init__.py +1 -0
  3. airbyte_agent_greenhouse/_vendored/connector_sdk/__init__.py +82 -0
  4. airbyte_agent_greenhouse/_vendored/connector_sdk/auth_strategies.py +1120 -0
  5. airbyte_agent_greenhouse/_vendored/connector_sdk/auth_template.py +135 -0
  6. airbyte_agent_greenhouse/_vendored/connector_sdk/cloud_utils/__init__.py +5 -0
  7. airbyte_agent_greenhouse/_vendored/connector_sdk/cloud_utils/client.py +213 -0
  8. airbyte_agent_greenhouse/_vendored/connector_sdk/connector_model_loader.py +965 -0
  9. airbyte_agent_greenhouse/_vendored/connector_sdk/constants.py +78 -0
  10. airbyte_agent_greenhouse/_vendored/connector_sdk/exceptions.py +23 -0
  11. airbyte_agent_greenhouse/_vendored/connector_sdk/executor/__init__.py +31 -0
  12. airbyte_agent_greenhouse/_vendored/connector_sdk/executor/hosted_executor.py +196 -0
  13. airbyte_agent_greenhouse/_vendored/connector_sdk/executor/local_executor.py +1724 -0
  14. airbyte_agent_greenhouse/_vendored/connector_sdk/executor/models.py +190 -0
  15. airbyte_agent_greenhouse/_vendored/connector_sdk/extensions.py +693 -0
  16. airbyte_agent_greenhouse/_vendored/connector_sdk/http/__init__.py +37 -0
  17. airbyte_agent_greenhouse/_vendored/connector_sdk/http/adapters/__init__.py +9 -0
  18. airbyte_agent_greenhouse/_vendored/connector_sdk/http/adapters/httpx_adapter.py +251 -0
  19. airbyte_agent_greenhouse/_vendored/connector_sdk/http/config.py +98 -0
  20. airbyte_agent_greenhouse/_vendored/connector_sdk/http/exceptions.py +119 -0
  21. airbyte_agent_greenhouse/_vendored/connector_sdk/http/protocols.py +114 -0
  22. airbyte_agent_greenhouse/_vendored/connector_sdk/http/response.py +104 -0
  23. airbyte_agent_greenhouse/_vendored/connector_sdk/http_client.py +693 -0
  24. airbyte_agent_greenhouse/_vendored/connector_sdk/introspection.py +262 -0
  25. airbyte_agent_greenhouse/_vendored/connector_sdk/logging/__init__.py +11 -0
  26. airbyte_agent_greenhouse/_vendored/connector_sdk/logging/logger.py +273 -0
  27. airbyte_agent_greenhouse/_vendored/connector_sdk/logging/types.py +93 -0
  28. airbyte_agent_greenhouse/_vendored/connector_sdk/observability/__init__.py +11 -0
  29. airbyte_agent_greenhouse/_vendored/connector_sdk/observability/config.py +179 -0
  30. airbyte_agent_greenhouse/_vendored/connector_sdk/observability/models.py +19 -0
  31. airbyte_agent_greenhouse/_vendored/connector_sdk/observability/redactor.py +81 -0
  32. airbyte_agent_greenhouse/_vendored/connector_sdk/observability/session.py +103 -0
  33. airbyte_agent_greenhouse/_vendored/connector_sdk/performance/__init__.py +6 -0
  34. airbyte_agent_greenhouse/_vendored/connector_sdk/performance/instrumentation.py +57 -0
  35. airbyte_agent_greenhouse/_vendored/connector_sdk/performance/metrics.py +93 -0
  36. airbyte_agent_greenhouse/_vendored/connector_sdk/schema/__init__.py +75 -0
  37. airbyte_agent_greenhouse/_vendored/connector_sdk/schema/base.py +164 -0
  38. airbyte_agent_greenhouse/_vendored/connector_sdk/schema/components.py +239 -0
  39. airbyte_agent_greenhouse/_vendored/connector_sdk/schema/connector.py +120 -0
  40. airbyte_agent_greenhouse/_vendored/connector_sdk/schema/extensions.py +230 -0
  41. airbyte_agent_greenhouse/_vendored/connector_sdk/schema/operations.py +146 -0
  42. airbyte_agent_greenhouse/_vendored/connector_sdk/schema/security.py +223 -0
  43. airbyte_agent_greenhouse/_vendored/connector_sdk/secrets.py +182 -0
  44. airbyte_agent_greenhouse/_vendored/connector_sdk/telemetry/__init__.py +10 -0
  45. airbyte_agent_greenhouse/_vendored/connector_sdk/telemetry/config.py +32 -0
  46. airbyte_agent_greenhouse/_vendored/connector_sdk/telemetry/events.py +59 -0
  47. airbyte_agent_greenhouse/_vendored/connector_sdk/telemetry/tracker.py +155 -0
  48. airbyte_agent_greenhouse/_vendored/connector_sdk/types.py +245 -0
  49. airbyte_agent_greenhouse/_vendored/connector_sdk/utils.py +60 -0
  50. airbyte_agent_greenhouse/_vendored/connector_sdk/validation.py +828 -0
  51. airbyte_agent_greenhouse/connector.py +1391 -0
  52. airbyte_agent_greenhouse/connector_model.py +2356 -0
  53. airbyte_agent_greenhouse/models.py +281 -0
  54. airbyte_agent_greenhouse/types.py +136 -0
  55. airbyte_agent_greenhouse-0.17.48.dist-info/METADATA +116 -0
  56. airbyte_agent_greenhouse-0.17.48.dist-info/RECORD +57 -0
  57. airbyte_agent_greenhouse-0.17.48.dist-info/WHEEL +4 -0
@@ -0,0 +1,2356 @@
1
+ """
2
+ Connector model for greenhouse.
3
+
4
+ This file is auto-generated from the connector definition at build time.
5
+ DO NOT EDIT MANUALLY - changes will be overwritten on next generation.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from ._vendored.connector_sdk.types import (
11
+ Action,
12
+ AuthConfig,
13
+ AuthType,
14
+ ConnectorModel,
15
+ EndpointDefinition,
16
+ EntityDefinition,
17
+ )
18
+ from ._vendored.connector_sdk.schema.security import (
19
+ AirbyteAuthConfig,
20
+ AuthConfigFieldSpec,
21
+ )
22
+ from ._vendored.connector_sdk.schema.components import (
23
+ PathOverrideConfig,
24
+ )
25
+ from uuid import (
26
+ UUID,
27
+ )
28
+
29
+ GreenhouseConnectorModel: ConnectorModel = ConnectorModel(
30
+ id=UUID('59f1e50a-331f-4f09-b3e8-2e8d4d355f44'),
31
+ name='greenhouse',
32
+ version='0.1.2',
33
+ base_url='https://harvest.greenhouse.io/v1',
34
+ auth=AuthConfig(
35
+ type=AuthType.BASIC,
36
+ user_config_spec=AirbyteAuthConfig(
37
+ title='Harvest API Key Authentication',
38
+ type='object',
39
+ required=['api_key'],
40
+ properties={
41
+ 'api_key': AuthConfigFieldSpec(
42
+ title='Harvest API Key',
43
+ description='Your Greenhouse Harvest API Key from the Dev Center',
44
+ airbyte_secret=True,
45
+ ),
46
+ },
47
+ auth_mapping={'username': '${api_key}', 'password': ''},
48
+ replication_auth_key_mapping={'api_key': 'api_key'},
49
+ ),
50
+ ),
51
+ entities=[
52
+ EntityDefinition(
53
+ name='candidates',
54
+ actions=[Action.LIST, Action.GET],
55
+ endpoints={
56
+ Action.LIST: EndpointDefinition(
57
+ method='GET',
58
+ path='/candidates',
59
+ action=Action.LIST,
60
+ description='Returns a paginated list of all candidates in the organization',
61
+ query_params=['per_page', 'page'],
62
+ query_params_schema={
63
+ 'per_page': {
64
+ 'type': 'integer',
65
+ 'required': False,
66
+ 'default': 100,
67
+ },
68
+ 'page': {
69
+ 'type': 'integer',
70
+ 'required': False,
71
+ 'default': 1,
72
+ },
73
+ },
74
+ response_schema={
75
+ 'type': 'array',
76
+ 'items': {
77
+ 'type': 'object',
78
+ 'description': 'Greenhouse candidate object',
79
+ 'properties': {
80
+ 'id': {'type': 'integer', 'description': 'Unique candidate identifier'},
81
+ 'first_name': {'type': 'string', 'description': "Candidate's first name"},
82
+ 'last_name': {'type': 'string', 'description': "Candidate's last name"},
83
+ 'company': {
84
+ 'type': ['string', 'null'],
85
+ 'description': "Candidate's current company",
86
+ },
87
+ 'title': {
88
+ 'type': ['string', 'null'],
89
+ 'description': "Candidate's current title",
90
+ },
91
+ 'created_at': {
92
+ 'type': 'string',
93
+ 'format': 'date-time',
94
+ 'description': 'When the candidate was created',
95
+ },
96
+ 'updated_at': {
97
+ 'type': 'string',
98
+ 'format': 'date-time',
99
+ 'description': 'When the candidate was last updated',
100
+ },
101
+ 'last_activity': {
102
+ 'type': 'string',
103
+ 'format': 'date-time',
104
+ 'description': 'When the last activity occurred',
105
+ },
106
+ 'is_private': {'type': 'boolean', 'description': 'Whether the candidate is private'},
107
+ 'photo_url': {
108
+ 'type': ['string', 'null'],
109
+ 'description': "URL to candidate's photo",
110
+ },
111
+ 'attachments': {
112
+ 'type': 'array',
113
+ 'items': {
114
+ 'type': 'object',
115
+ 'description': 'File attachment (resume, cover letter, etc.)',
116
+ 'properties': {
117
+ 'filename': {'type': 'string', 'description': 'Name of the attached file'},
118
+ 'url': {
119
+ 'type': 'string',
120
+ 'format': 'uri',
121
+ 'description': 'Temporary signed AWS S3 URL to download the file.\nThis URL expires within 7 days - download immediately after retrieval.\n',
122
+ },
123
+ 'type': {
124
+ 'type': 'string',
125
+ 'enum': [
126
+ 'resume',
127
+ 'cover_letter',
128
+ 'admin_only',
129
+ 'take_home_test',
130
+ 'offer_packet',
131
+ 'offer_letter',
132
+ 'signed_offer_letter',
133
+ 'other',
134
+ ],
135
+ 'description': 'Type of attachment',
136
+ },
137
+ 'created_at': {
138
+ 'type': 'string',
139
+ 'format': 'date-time',
140
+ 'description': 'When the attachment was uploaded',
141
+ },
142
+ },
143
+ },
144
+ 'description': 'Candidate attachments (resumes, cover letters, etc.)',
145
+ },
146
+ 'application_ids': {
147
+ 'type': 'array',
148
+ 'items': {'type': 'integer'},
149
+ 'description': "IDs of candidate's applications",
150
+ },
151
+ 'phone_numbers': {
152
+ 'type': 'array',
153
+ 'items': {'type': 'object'},
154
+ 'description': 'Candidate phone numbers',
155
+ },
156
+ 'addresses': {
157
+ 'type': 'array',
158
+ 'items': {'type': 'object'},
159
+ 'description': 'Candidate addresses',
160
+ },
161
+ 'email_addresses': {
162
+ 'type': 'array',
163
+ 'items': {'type': 'object'},
164
+ 'description': 'Candidate email addresses',
165
+ },
166
+ 'website_addresses': {
167
+ 'type': 'array',
168
+ 'items': {'type': 'object'},
169
+ 'description': 'Candidate website addresses',
170
+ },
171
+ 'social_media_addresses': {
172
+ 'type': 'array',
173
+ 'items': {'type': 'object'},
174
+ 'description': 'Candidate social media addresses',
175
+ },
176
+ 'recruiter': {
177
+ 'type': ['object', 'null'],
178
+ 'description': 'Recruiter information',
179
+ },
180
+ 'coordinator': {
181
+ 'type': ['object', 'null'],
182
+ 'description': 'Coordinator information',
183
+ },
184
+ 'can_email': {'type': 'boolean', 'description': 'Whether the candidate can be emailed'},
185
+ 'tags': {
186
+ 'type': 'array',
187
+ 'items': {'type': 'string'},
188
+ 'description': 'Candidate tags',
189
+ },
190
+ 'custom_fields': {'type': 'object', 'description': 'Custom field values'},
191
+ },
192
+ 'x-airbyte-entity-name': 'candidates',
193
+ },
194
+ },
195
+ ),
196
+ Action.GET: EndpointDefinition(
197
+ method='GET',
198
+ path='/candidates/{id}',
199
+ action=Action.GET,
200
+ description='Get a single candidate by ID',
201
+ path_params=['id'],
202
+ path_params_schema={
203
+ 'id': {'type': 'integer', 'required': True},
204
+ },
205
+ response_schema={
206
+ 'type': 'object',
207
+ 'description': 'Greenhouse candidate object',
208
+ 'properties': {
209
+ 'id': {'type': 'integer', 'description': 'Unique candidate identifier'},
210
+ 'first_name': {'type': 'string', 'description': "Candidate's first name"},
211
+ 'last_name': {'type': 'string', 'description': "Candidate's last name"},
212
+ 'company': {
213
+ 'type': ['string', 'null'],
214
+ 'description': "Candidate's current company",
215
+ },
216
+ 'title': {
217
+ 'type': ['string', 'null'],
218
+ 'description': "Candidate's current title",
219
+ },
220
+ 'created_at': {
221
+ 'type': 'string',
222
+ 'format': 'date-time',
223
+ 'description': 'When the candidate was created',
224
+ },
225
+ 'updated_at': {
226
+ 'type': 'string',
227
+ 'format': 'date-time',
228
+ 'description': 'When the candidate was last updated',
229
+ },
230
+ 'last_activity': {
231
+ 'type': 'string',
232
+ 'format': 'date-time',
233
+ 'description': 'When the last activity occurred',
234
+ },
235
+ 'is_private': {'type': 'boolean', 'description': 'Whether the candidate is private'},
236
+ 'photo_url': {
237
+ 'type': ['string', 'null'],
238
+ 'description': "URL to candidate's photo",
239
+ },
240
+ 'attachments': {
241
+ 'type': 'array',
242
+ 'items': {
243
+ 'type': 'object',
244
+ 'description': 'File attachment (resume, cover letter, etc.)',
245
+ 'properties': {
246
+ 'filename': {'type': 'string', 'description': 'Name of the attached file'},
247
+ 'url': {
248
+ 'type': 'string',
249
+ 'format': 'uri',
250
+ 'description': 'Temporary signed AWS S3 URL to download the file.\nThis URL expires within 7 days - download immediately after retrieval.\n',
251
+ },
252
+ 'type': {
253
+ 'type': 'string',
254
+ 'enum': [
255
+ 'resume',
256
+ 'cover_letter',
257
+ 'admin_only',
258
+ 'take_home_test',
259
+ 'offer_packet',
260
+ 'offer_letter',
261
+ 'signed_offer_letter',
262
+ 'other',
263
+ ],
264
+ 'description': 'Type of attachment',
265
+ },
266
+ 'created_at': {
267
+ 'type': 'string',
268
+ 'format': 'date-time',
269
+ 'description': 'When the attachment was uploaded',
270
+ },
271
+ },
272
+ },
273
+ 'description': 'Candidate attachments (resumes, cover letters, etc.)',
274
+ },
275
+ 'application_ids': {
276
+ 'type': 'array',
277
+ 'items': {'type': 'integer'},
278
+ 'description': "IDs of candidate's applications",
279
+ },
280
+ 'phone_numbers': {
281
+ 'type': 'array',
282
+ 'items': {'type': 'object'},
283
+ 'description': 'Candidate phone numbers',
284
+ },
285
+ 'addresses': {
286
+ 'type': 'array',
287
+ 'items': {'type': 'object'},
288
+ 'description': 'Candidate addresses',
289
+ },
290
+ 'email_addresses': {
291
+ 'type': 'array',
292
+ 'items': {'type': 'object'},
293
+ 'description': 'Candidate email addresses',
294
+ },
295
+ 'website_addresses': {
296
+ 'type': 'array',
297
+ 'items': {'type': 'object'},
298
+ 'description': 'Candidate website addresses',
299
+ },
300
+ 'social_media_addresses': {
301
+ 'type': 'array',
302
+ 'items': {'type': 'object'},
303
+ 'description': 'Candidate social media addresses',
304
+ },
305
+ 'recruiter': {
306
+ 'type': ['object', 'null'],
307
+ 'description': 'Recruiter information',
308
+ },
309
+ 'coordinator': {
310
+ 'type': ['object', 'null'],
311
+ 'description': 'Coordinator information',
312
+ },
313
+ 'can_email': {'type': 'boolean', 'description': 'Whether the candidate can be emailed'},
314
+ 'tags': {
315
+ 'type': 'array',
316
+ 'items': {'type': 'string'},
317
+ 'description': 'Candidate tags',
318
+ },
319
+ 'custom_fields': {'type': 'object', 'description': 'Custom field values'},
320
+ },
321
+ 'x-airbyte-entity-name': 'candidates',
322
+ },
323
+ ),
324
+ },
325
+ entity_schema={
326
+ 'type': 'object',
327
+ 'description': 'Greenhouse candidate object',
328
+ 'properties': {
329
+ 'id': {'type': 'integer', 'description': 'Unique candidate identifier'},
330
+ 'first_name': {'type': 'string', 'description': "Candidate's first name"},
331
+ 'last_name': {'type': 'string', 'description': "Candidate's last name"},
332
+ 'company': {
333
+ 'type': ['string', 'null'],
334
+ 'description': "Candidate's current company",
335
+ },
336
+ 'title': {
337
+ 'type': ['string', 'null'],
338
+ 'description': "Candidate's current title",
339
+ },
340
+ 'created_at': {
341
+ 'type': 'string',
342
+ 'format': 'date-time',
343
+ 'description': 'When the candidate was created',
344
+ },
345
+ 'updated_at': {
346
+ 'type': 'string',
347
+ 'format': 'date-time',
348
+ 'description': 'When the candidate was last updated',
349
+ },
350
+ 'last_activity': {
351
+ 'type': 'string',
352
+ 'format': 'date-time',
353
+ 'description': 'When the last activity occurred',
354
+ },
355
+ 'is_private': {'type': 'boolean', 'description': 'Whether the candidate is private'},
356
+ 'photo_url': {
357
+ 'type': ['string', 'null'],
358
+ 'description': "URL to candidate's photo",
359
+ },
360
+ 'attachments': {
361
+ 'type': 'array',
362
+ 'items': {'$ref': '#/components/schemas/Attachment'},
363
+ 'description': 'Candidate attachments (resumes, cover letters, etc.)',
364
+ },
365
+ 'application_ids': {
366
+ 'type': 'array',
367
+ 'items': {'type': 'integer'},
368
+ 'description': "IDs of candidate's applications",
369
+ },
370
+ 'phone_numbers': {
371
+ 'type': 'array',
372
+ 'items': {'type': 'object'},
373
+ 'description': 'Candidate phone numbers',
374
+ },
375
+ 'addresses': {
376
+ 'type': 'array',
377
+ 'items': {'type': 'object'},
378
+ 'description': 'Candidate addresses',
379
+ },
380
+ 'email_addresses': {
381
+ 'type': 'array',
382
+ 'items': {'type': 'object'},
383
+ 'description': 'Candidate email addresses',
384
+ },
385
+ 'website_addresses': {
386
+ 'type': 'array',
387
+ 'items': {'type': 'object'},
388
+ 'description': 'Candidate website addresses',
389
+ },
390
+ 'social_media_addresses': {
391
+ 'type': 'array',
392
+ 'items': {'type': 'object'},
393
+ 'description': 'Candidate social media addresses',
394
+ },
395
+ 'recruiter': {
396
+ 'type': ['object', 'null'],
397
+ 'description': 'Recruiter information',
398
+ },
399
+ 'coordinator': {
400
+ 'type': ['object', 'null'],
401
+ 'description': 'Coordinator information',
402
+ },
403
+ 'can_email': {'type': 'boolean', 'description': 'Whether the candidate can be emailed'},
404
+ 'tags': {
405
+ 'type': 'array',
406
+ 'items': {'type': 'string'},
407
+ 'description': 'Candidate tags',
408
+ },
409
+ 'custom_fields': {'type': 'object', 'description': 'Custom field values'},
410
+ },
411
+ 'x-airbyte-entity-name': 'candidates',
412
+ },
413
+ ),
414
+ EntityDefinition(
415
+ name='applications',
416
+ actions=[Action.LIST, Action.GET],
417
+ endpoints={
418
+ Action.LIST: EndpointDefinition(
419
+ method='GET',
420
+ path='/applications',
421
+ action=Action.LIST,
422
+ description='Returns a paginated list of all applications',
423
+ query_params=[
424
+ 'per_page',
425
+ 'page',
426
+ 'created_before',
427
+ 'created_after',
428
+ 'last_activity_after',
429
+ 'job_id',
430
+ 'status',
431
+ ],
432
+ query_params_schema={
433
+ 'per_page': {
434
+ 'type': 'integer',
435
+ 'required': False,
436
+ 'default': 100,
437
+ },
438
+ 'page': {
439
+ 'type': 'integer',
440
+ 'required': False,
441
+ 'default': 1,
442
+ },
443
+ 'created_before': {'type': 'string', 'required': False},
444
+ 'created_after': {'type': 'string', 'required': False},
445
+ 'last_activity_after': {'type': 'string', 'required': False},
446
+ 'job_id': {'type': 'integer', 'required': False},
447
+ 'status': {'type': 'string', 'required': False},
448
+ },
449
+ response_schema={
450
+ 'type': 'array',
451
+ 'items': {
452
+ 'type': 'object',
453
+ 'description': 'Greenhouse application object',
454
+ 'properties': {
455
+ 'id': {'type': 'integer', 'description': 'Unique application identifier'},
456
+ 'candidate_id': {'type': 'integer', 'description': 'ID of the associated candidate'},
457
+ 'prospect': {'type': 'boolean', 'description': 'Whether this is a prospect application'},
458
+ 'applied_at': {
459
+ 'type': 'string',
460
+ 'format': 'date-time',
461
+ 'description': 'When the application was submitted',
462
+ },
463
+ 'rejected_at': {
464
+ 'type': ['string', 'null'],
465
+ 'format': 'date-time',
466
+ 'description': 'When the application was rejected',
467
+ },
468
+ 'last_activity_at': {
469
+ 'type': 'string',
470
+ 'format': 'date-time',
471
+ 'description': 'When the last activity occurred',
472
+ },
473
+ 'location': {
474
+ 'type': ['object', 'null'],
475
+ 'description': 'Application location',
476
+ },
477
+ 'source': {'type': 'object', 'description': 'Application source'},
478
+ 'credited_to': {'type': 'object', 'description': 'User credited with the application'},
479
+ 'rejection_reason': {
480
+ 'type': ['object', 'null'],
481
+ 'description': 'Rejection reason if rejected',
482
+ },
483
+ 'rejection_details': {
484
+ 'type': ['object', 'null'],
485
+ 'description': 'Additional rejection details',
486
+ },
487
+ 'jobs': {
488
+ 'type': 'array',
489
+ 'items': {'type': 'object'},
490
+ 'description': 'Jobs associated with the application',
491
+ },
492
+ 'job_post_id': {
493
+ 'type': ['integer', 'null'],
494
+ 'description': 'ID of the job post',
495
+ },
496
+ 'status': {'type': 'string', 'description': 'Application status'},
497
+ 'current_stage': {
498
+ 'type': ['object', 'null'],
499
+ 'description': 'Current stage of the application',
500
+ },
501
+ 'answers': {
502
+ 'type': 'array',
503
+ 'items': {'type': 'object'},
504
+ 'description': 'Application question answers',
505
+ },
506
+ 'prospective_office': {
507
+ 'type': ['object', 'null'],
508
+ 'description': 'Prospective office',
509
+ },
510
+ 'prospective_department': {
511
+ 'type': ['object', 'null'],
512
+ 'description': 'Prospective department',
513
+ },
514
+ 'prospect_detail': {'type': 'object', 'description': 'Prospect details'},
515
+ 'attachments': {
516
+ 'type': 'array',
517
+ 'items': {
518
+ 'type': 'object',
519
+ 'description': 'File attachment (resume, cover letter, etc.)',
520
+ 'properties': {
521
+ 'filename': {'type': 'string', 'description': 'Name of the attached file'},
522
+ 'url': {
523
+ 'type': 'string',
524
+ 'format': 'uri',
525
+ 'description': 'Temporary signed AWS S3 URL to download the file.\nThis URL expires within 7 days - download immediately after retrieval.\n',
526
+ },
527
+ 'type': {
528
+ 'type': 'string',
529
+ 'enum': [
530
+ 'resume',
531
+ 'cover_letter',
532
+ 'admin_only',
533
+ 'take_home_test',
534
+ 'offer_packet',
535
+ 'offer_letter',
536
+ 'signed_offer_letter',
537
+ 'other',
538
+ ],
539
+ 'description': 'Type of attachment',
540
+ },
541
+ 'created_at': {
542
+ 'type': 'string',
543
+ 'format': 'date-time',
544
+ 'description': 'When the attachment was uploaded',
545
+ },
546
+ },
547
+ },
548
+ 'description': 'Application attachments (resumes, cover letters, etc.)',
549
+ },
550
+ 'custom_fields': {'type': 'object', 'description': 'Custom field values'},
551
+ },
552
+ 'x-airbyte-entity-name': 'applications',
553
+ },
554
+ },
555
+ ),
556
+ Action.GET: EndpointDefinition(
557
+ method='GET',
558
+ path='/applications/{id}',
559
+ action=Action.GET,
560
+ description='Get a single application by ID',
561
+ path_params=['id'],
562
+ path_params_schema={
563
+ 'id': {'type': 'integer', 'required': True},
564
+ },
565
+ response_schema={
566
+ 'type': 'object',
567
+ 'description': 'Greenhouse application object',
568
+ 'properties': {
569
+ 'id': {'type': 'integer', 'description': 'Unique application identifier'},
570
+ 'candidate_id': {'type': 'integer', 'description': 'ID of the associated candidate'},
571
+ 'prospect': {'type': 'boolean', 'description': 'Whether this is a prospect application'},
572
+ 'applied_at': {
573
+ 'type': 'string',
574
+ 'format': 'date-time',
575
+ 'description': 'When the application was submitted',
576
+ },
577
+ 'rejected_at': {
578
+ 'type': ['string', 'null'],
579
+ 'format': 'date-time',
580
+ 'description': 'When the application was rejected',
581
+ },
582
+ 'last_activity_at': {
583
+ 'type': 'string',
584
+ 'format': 'date-time',
585
+ 'description': 'When the last activity occurred',
586
+ },
587
+ 'location': {
588
+ 'type': ['object', 'null'],
589
+ 'description': 'Application location',
590
+ },
591
+ 'source': {'type': 'object', 'description': 'Application source'},
592
+ 'credited_to': {'type': 'object', 'description': 'User credited with the application'},
593
+ 'rejection_reason': {
594
+ 'type': ['object', 'null'],
595
+ 'description': 'Rejection reason if rejected',
596
+ },
597
+ 'rejection_details': {
598
+ 'type': ['object', 'null'],
599
+ 'description': 'Additional rejection details',
600
+ },
601
+ 'jobs': {
602
+ 'type': 'array',
603
+ 'items': {'type': 'object'},
604
+ 'description': 'Jobs associated with the application',
605
+ },
606
+ 'job_post_id': {
607
+ 'type': ['integer', 'null'],
608
+ 'description': 'ID of the job post',
609
+ },
610
+ 'status': {'type': 'string', 'description': 'Application status'},
611
+ 'current_stage': {
612
+ 'type': ['object', 'null'],
613
+ 'description': 'Current stage of the application',
614
+ },
615
+ 'answers': {
616
+ 'type': 'array',
617
+ 'items': {'type': 'object'},
618
+ 'description': 'Application question answers',
619
+ },
620
+ 'prospective_office': {
621
+ 'type': ['object', 'null'],
622
+ 'description': 'Prospective office',
623
+ },
624
+ 'prospective_department': {
625
+ 'type': ['object', 'null'],
626
+ 'description': 'Prospective department',
627
+ },
628
+ 'prospect_detail': {'type': 'object', 'description': 'Prospect details'},
629
+ 'attachments': {
630
+ 'type': 'array',
631
+ 'items': {
632
+ 'type': 'object',
633
+ 'description': 'File attachment (resume, cover letter, etc.)',
634
+ 'properties': {
635
+ 'filename': {'type': 'string', 'description': 'Name of the attached file'},
636
+ 'url': {
637
+ 'type': 'string',
638
+ 'format': 'uri',
639
+ 'description': 'Temporary signed AWS S3 URL to download the file.\nThis URL expires within 7 days - download immediately after retrieval.\n',
640
+ },
641
+ 'type': {
642
+ 'type': 'string',
643
+ 'enum': [
644
+ 'resume',
645
+ 'cover_letter',
646
+ 'admin_only',
647
+ 'take_home_test',
648
+ 'offer_packet',
649
+ 'offer_letter',
650
+ 'signed_offer_letter',
651
+ 'other',
652
+ ],
653
+ 'description': 'Type of attachment',
654
+ },
655
+ 'created_at': {
656
+ 'type': 'string',
657
+ 'format': 'date-time',
658
+ 'description': 'When the attachment was uploaded',
659
+ },
660
+ },
661
+ },
662
+ 'description': 'Application attachments (resumes, cover letters, etc.)',
663
+ },
664
+ 'custom_fields': {'type': 'object', 'description': 'Custom field values'},
665
+ },
666
+ 'x-airbyte-entity-name': 'applications',
667
+ },
668
+ ),
669
+ },
670
+ entity_schema={
671
+ 'type': 'object',
672
+ 'description': 'Greenhouse application object',
673
+ 'properties': {
674
+ 'id': {'type': 'integer', 'description': 'Unique application identifier'},
675
+ 'candidate_id': {'type': 'integer', 'description': 'ID of the associated candidate'},
676
+ 'prospect': {'type': 'boolean', 'description': 'Whether this is a prospect application'},
677
+ 'applied_at': {
678
+ 'type': 'string',
679
+ 'format': 'date-time',
680
+ 'description': 'When the application was submitted',
681
+ },
682
+ 'rejected_at': {
683
+ 'type': ['string', 'null'],
684
+ 'format': 'date-time',
685
+ 'description': 'When the application was rejected',
686
+ },
687
+ 'last_activity_at': {
688
+ 'type': 'string',
689
+ 'format': 'date-time',
690
+ 'description': 'When the last activity occurred',
691
+ },
692
+ 'location': {
693
+ 'type': ['object', 'null'],
694
+ 'description': 'Application location',
695
+ },
696
+ 'source': {'type': 'object', 'description': 'Application source'},
697
+ 'credited_to': {'type': 'object', 'description': 'User credited with the application'},
698
+ 'rejection_reason': {
699
+ 'type': ['object', 'null'],
700
+ 'description': 'Rejection reason if rejected',
701
+ },
702
+ 'rejection_details': {
703
+ 'type': ['object', 'null'],
704
+ 'description': 'Additional rejection details',
705
+ },
706
+ 'jobs': {
707
+ 'type': 'array',
708
+ 'items': {'type': 'object'},
709
+ 'description': 'Jobs associated with the application',
710
+ },
711
+ 'job_post_id': {
712
+ 'type': ['integer', 'null'],
713
+ 'description': 'ID of the job post',
714
+ },
715
+ 'status': {'type': 'string', 'description': 'Application status'},
716
+ 'current_stage': {
717
+ 'type': ['object', 'null'],
718
+ 'description': 'Current stage of the application',
719
+ },
720
+ 'answers': {
721
+ 'type': 'array',
722
+ 'items': {'type': 'object'},
723
+ 'description': 'Application question answers',
724
+ },
725
+ 'prospective_office': {
726
+ 'type': ['object', 'null'],
727
+ 'description': 'Prospective office',
728
+ },
729
+ 'prospective_department': {
730
+ 'type': ['object', 'null'],
731
+ 'description': 'Prospective department',
732
+ },
733
+ 'prospect_detail': {'type': 'object', 'description': 'Prospect details'},
734
+ 'attachments': {
735
+ 'type': 'array',
736
+ 'items': {'$ref': '#/components/schemas/Attachment'},
737
+ 'description': 'Application attachments (resumes, cover letters, etc.)',
738
+ },
739
+ 'custom_fields': {'type': 'object', 'description': 'Custom field values'},
740
+ },
741
+ 'x-airbyte-entity-name': 'applications',
742
+ },
743
+ ),
744
+ EntityDefinition(
745
+ name='jobs',
746
+ actions=[Action.LIST, Action.GET],
747
+ endpoints={
748
+ Action.LIST: EndpointDefinition(
749
+ method='GET',
750
+ path='/jobs',
751
+ action=Action.LIST,
752
+ description='Returns a paginated list of all jobs in the organization',
753
+ query_params=['per_page', 'page'],
754
+ query_params_schema={
755
+ 'per_page': {
756
+ 'type': 'integer',
757
+ 'required': False,
758
+ 'default': 100,
759
+ },
760
+ 'page': {
761
+ 'type': 'integer',
762
+ 'required': False,
763
+ 'default': 1,
764
+ },
765
+ },
766
+ response_schema={
767
+ 'type': 'array',
768
+ 'items': {
769
+ 'type': 'object',
770
+ 'description': 'Greenhouse job object',
771
+ 'properties': {
772
+ 'id': {'type': 'integer', 'description': 'Unique job identifier'},
773
+ 'name': {'type': 'string', 'description': 'Job name'},
774
+ 'requisition_id': {
775
+ 'type': ['string', 'null'],
776
+ 'description': 'Job requisition ID',
777
+ },
778
+ 'notes': {
779
+ 'type': ['string', 'null'],
780
+ 'description': 'Job notes',
781
+ },
782
+ 'confidential': {'type': 'boolean', 'description': 'Whether the job is confidential'},
783
+ 'status': {'type': 'string', 'description': 'Job status'},
784
+ 'created_at': {
785
+ 'type': 'string',
786
+ 'format': 'date-time',
787
+ 'description': 'When the job was created',
788
+ },
789
+ 'opened_at': {
790
+ 'type': 'string',
791
+ 'format': 'date-time',
792
+ 'description': 'When the job was opened',
793
+ },
794
+ 'closed_at': {
795
+ 'type': ['string', 'null'],
796
+ 'format': 'date-time',
797
+ 'description': 'When the job was closed',
798
+ },
799
+ 'updated_at': {
800
+ 'type': 'string',
801
+ 'format': 'date-time',
802
+ 'description': 'When the job was last updated',
803
+ },
804
+ 'departments': {
805
+ 'type': 'array',
806
+ 'items': {
807
+ 'type': ['object', 'null'],
808
+ },
809
+ 'description': 'Departments associated with the job',
810
+ },
811
+ 'offices': {
812
+ 'type': 'array',
813
+ 'items': {'type': 'object'},
814
+ 'description': 'Offices associated with the job',
815
+ },
816
+ 'custom_fields': {'type': 'object', 'description': 'Custom field values'},
817
+ 'hiring_team': {'type': 'object', 'description': 'Hiring team information'},
818
+ 'openings': {
819
+ 'type': 'array',
820
+ 'items': {'type': 'object'},
821
+ 'description': 'Job openings',
822
+ },
823
+ },
824
+ 'x-airbyte-entity-name': 'jobs',
825
+ },
826
+ },
827
+ ),
828
+ Action.GET: EndpointDefinition(
829
+ method='GET',
830
+ path='/jobs/{id}',
831
+ action=Action.GET,
832
+ description='Get a single job by ID',
833
+ path_params=['id'],
834
+ path_params_schema={
835
+ 'id': {'type': 'integer', 'required': True},
836
+ },
837
+ response_schema={
838
+ 'type': 'object',
839
+ 'description': 'Greenhouse job object',
840
+ 'properties': {
841
+ 'id': {'type': 'integer', 'description': 'Unique job identifier'},
842
+ 'name': {'type': 'string', 'description': 'Job name'},
843
+ 'requisition_id': {
844
+ 'type': ['string', 'null'],
845
+ 'description': 'Job requisition ID',
846
+ },
847
+ 'notes': {
848
+ 'type': ['string', 'null'],
849
+ 'description': 'Job notes',
850
+ },
851
+ 'confidential': {'type': 'boolean', 'description': 'Whether the job is confidential'},
852
+ 'status': {'type': 'string', 'description': 'Job status'},
853
+ 'created_at': {
854
+ 'type': 'string',
855
+ 'format': 'date-time',
856
+ 'description': 'When the job was created',
857
+ },
858
+ 'opened_at': {
859
+ 'type': 'string',
860
+ 'format': 'date-time',
861
+ 'description': 'When the job was opened',
862
+ },
863
+ 'closed_at': {
864
+ 'type': ['string', 'null'],
865
+ 'format': 'date-time',
866
+ 'description': 'When the job was closed',
867
+ },
868
+ 'updated_at': {
869
+ 'type': 'string',
870
+ 'format': 'date-time',
871
+ 'description': 'When the job was last updated',
872
+ },
873
+ 'departments': {
874
+ 'type': 'array',
875
+ 'items': {
876
+ 'type': ['object', 'null'],
877
+ },
878
+ 'description': 'Departments associated with the job',
879
+ },
880
+ 'offices': {
881
+ 'type': 'array',
882
+ 'items': {'type': 'object'},
883
+ 'description': 'Offices associated with the job',
884
+ },
885
+ 'custom_fields': {'type': 'object', 'description': 'Custom field values'},
886
+ 'hiring_team': {'type': 'object', 'description': 'Hiring team information'},
887
+ 'openings': {
888
+ 'type': 'array',
889
+ 'items': {'type': 'object'},
890
+ 'description': 'Job openings',
891
+ },
892
+ },
893
+ 'x-airbyte-entity-name': 'jobs',
894
+ },
895
+ ),
896
+ },
897
+ entity_schema={
898
+ 'type': 'object',
899
+ 'description': 'Greenhouse job object',
900
+ 'properties': {
901
+ 'id': {'type': 'integer', 'description': 'Unique job identifier'},
902
+ 'name': {'type': 'string', 'description': 'Job name'},
903
+ 'requisition_id': {
904
+ 'type': ['string', 'null'],
905
+ 'description': 'Job requisition ID',
906
+ },
907
+ 'notes': {
908
+ 'type': ['string', 'null'],
909
+ 'description': 'Job notes',
910
+ },
911
+ 'confidential': {'type': 'boolean', 'description': 'Whether the job is confidential'},
912
+ 'status': {'type': 'string', 'description': 'Job status'},
913
+ 'created_at': {
914
+ 'type': 'string',
915
+ 'format': 'date-time',
916
+ 'description': 'When the job was created',
917
+ },
918
+ 'opened_at': {
919
+ 'type': 'string',
920
+ 'format': 'date-time',
921
+ 'description': 'When the job was opened',
922
+ },
923
+ 'closed_at': {
924
+ 'type': ['string', 'null'],
925
+ 'format': 'date-time',
926
+ 'description': 'When the job was closed',
927
+ },
928
+ 'updated_at': {
929
+ 'type': 'string',
930
+ 'format': 'date-time',
931
+ 'description': 'When the job was last updated',
932
+ },
933
+ 'departments': {
934
+ 'type': 'array',
935
+ 'items': {
936
+ 'type': ['object', 'null'],
937
+ },
938
+ 'description': 'Departments associated with the job',
939
+ },
940
+ 'offices': {
941
+ 'type': 'array',
942
+ 'items': {'type': 'object'},
943
+ 'description': 'Offices associated with the job',
944
+ },
945
+ 'custom_fields': {'type': 'object', 'description': 'Custom field values'},
946
+ 'hiring_team': {'type': 'object', 'description': 'Hiring team information'},
947
+ 'openings': {
948
+ 'type': 'array',
949
+ 'items': {'type': 'object'},
950
+ 'description': 'Job openings',
951
+ },
952
+ },
953
+ 'x-airbyte-entity-name': 'jobs',
954
+ },
955
+ ),
956
+ EntityDefinition(
957
+ name='offers',
958
+ actions=[Action.LIST, Action.GET],
959
+ endpoints={
960
+ Action.LIST: EndpointDefinition(
961
+ method='GET',
962
+ path='/offers',
963
+ action=Action.LIST,
964
+ description='Returns a paginated list of all offers',
965
+ query_params=[
966
+ 'per_page',
967
+ 'page',
968
+ 'created_before',
969
+ 'created_after',
970
+ 'resolved_after',
971
+ ],
972
+ query_params_schema={
973
+ 'per_page': {
974
+ 'type': 'integer',
975
+ 'required': False,
976
+ 'default': 100,
977
+ },
978
+ 'page': {
979
+ 'type': 'integer',
980
+ 'required': False,
981
+ 'default': 1,
982
+ },
983
+ 'created_before': {'type': 'string', 'required': False},
984
+ 'created_after': {'type': 'string', 'required': False},
985
+ 'resolved_after': {'type': 'string', 'required': False},
986
+ },
987
+ response_schema={
988
+ 'type': 'array',
989
+ 'items': {
990
+ 'type': 'object',
991
+ 'description': 'Greenhouse offer object',
992
+ 'properties': {
993
+ 'id': {'type': 'integer', 'description': 'Unique offer identifier'},
994
+ 'version': {'type': 'integer', 'description': 'Offer version number'},
995
+ 'application_id': {'type': 'integer', 'description': 'Associated application ID'},
996
+ 'job_id': {'type': 'integer', 'description': 'Associated job ID'},
997
+ 'candidate_id': {'type': 'integer', 'description': 'Associated candidate ID'},
998
+ 'opening': {
999
+ 'type': ['object', 'null'],
1000
+ 'description': 'Associated job opening',
1001
+ },
1002
+ 'created_at': {
1003
+ 'type': 'string',
1004
+ 'format': 'date-time',
1005
+ 'description': 'When the offer was created',
1006
+ },
1007
+ 'updated_at': {
1008
+ 'type': 'string',
1009
+ 'format': 'date-time',
1010
+ 'description': 'When the offer was last updated',
1011
+ },
1012
+ 'sent_at': {
1013
+ 'type': ['string', 'null'],
1014
+ 'format': 'date-time',
1015
+ 'description': 'When the offer was sent',
1016
+ },
1017
+ 'resolved_at': {
1018
+ 'type': ['string', 'null'],
1019
+ 'format': 'date-time',
1020
+ 'description': 'When the offer was resolved',
1021
+ },
1022
+ 'starts_at': {
1023
+ 'type': ['string', 'null'],
1024
+ 'description': 'Employment start date',
1025
+ },
1026
+ 'status': {'type': 'string', 'description': 'Offer status'},
1027
+ 'custom_fields': {'type': 'object', 'description': 'Custom field values'},
1028
+ },
1029
+ 'x-airbyte-entity-name': 'offers',
1030
+ },
1031
+ },
1032
+ ),
1033
+ Action.GET: EndpointDefinition(
1034
+ method='GET',
1035
+ path='/offers/{id}',
1036
+ action=Action.GET,
1037
+ description='Get a single offer by ID',
1038
+ path_params=['id'],
1039
+ path_params_schema={
1040
+ 'id': {'type': 'integer', 'required': True},
1041
+ },
1042
+ response_schema={
1043
+ 'type': 'object',
1044
+ 'description': 'Greenhouse offer object',
1045
+ 'properties': {
1046
+ 'id': {'type': 'integer', 'description': 'Unique offer identifier'},
1047
+ 'version': {'type': 'integer', 'description': 'Offer version number'},
1048
+ 'application_id': {'type': 'integer', 'description': 'Associated application ID'},
1049
+ 'job_id': {'type': 'integer', 'description': 'Associated job ID'},
1050
+ 'candidate_id': {'type': 'integer', 'description': 'Associated candidate ID'},
1051
+ 'opening': {
1052
+ 'type': ['object', 'null'],
1053
+ 'description': 'Associated job opening',
1054
+ },
1055
+ 'created_at': {
1056
+ 'type': 'string',
1057
+ 'format': 'date-time',
1058
+ 'description': 'When the offer was created',
1059
+ },
1060
+ 'updated_at': {
1061
+ 'type': 'string',
1062
+ 'format': 'date-time',
1063
+ 'description': 'When the offer was last updated',
1064
+ },
1065
+ 'sent_at': {
1066
+ 'type': ['string', 'null'],
1067
+ 'format': 'date-time',
1068
+ 'description': 'When the offer was sent',
1069
+ },
1070
+ 'resolved_at': {
1071
+ 'type': ['string', 'null'],
1072
+ 'format': 'date-time',
1073
+ 'description': 'When the offer was resolved',
1074
+ },
1075
+ 'starts_at': {
1076
+ 'type': ['string', 'null'],
1077
+ 'description': 'Employment start date',
1078
+ },
1079
+ 'status': {'type': 'string', 'description': 'Offer status'},
1080
+ 'custom_fields': {'type': 'object', 'description': 'Custom field values'},
1081
+ },
1082
+ 'x-airbyte-entity-name': 'offers',
1083
+ },
1084
+ untested=True,
1085
+ ),
1086
+ },
1087
+ entity_schema={
1088
+ 'type': 'object',
1089
+ 'description': 'Greenhouse offer object',
1090
+ 'properties': {
1091
+ 'id': {'type': 'integer', 'description': 'Unique offer identifier'},
1092
+ 'version': {'type': 'integer', 'description': 'Offer version number'},
1093
+ 'application_id': {'type': 'integer', 'description': 'Associated application ID'},
1094
+ 'job_id': {'type': 'integer', 'description': 'Associated job ID'},
1095
+ 'candidate_id': {'type': 'integer', 'description': 'Associated candidate ID'},
1096
+ 'opening': {
1097
+ 'type': ['object', 'null'],
1098
+ 'description': 'Associated job opening',
1099
+ },
1100
+ 'created_at': {
1101
+ 'type': 'string',
1102
+ 'format': 'date-time',
1103
+ 'description': 'When the offer was created',
1104
+ },
1105
+ 'updated_at': {
1106
+ 'type': 'string',
1107
+ 'format': 'date-time',
1108
+ 'description': 'When the offer was last updated',
1109
+ },
1110
+ 'sent_at': {
1111
+ 'type': ['string', 'null'],
1112
+ 'format': 'date-time',
1113
+ 'description': 'When the offer was sent',
1114
+ },
1115
+ 'resolved_at': {
1116
+ 'type': ['string', 'null'],
1117
+ 'format': 'date-time',
1118
+ 'description': 'When the offer was resolved',
1119
+ },
1120
+ 'starts_at': {
1121
+ 'type': ['string', 'null'],
1122
+ 'description': 'Employment start date',
1123
+ },
1124
+ 'status': {'type': 'string', 'description': 'Offer status'},
1125
+ 'custom_fields': {'type': 'object', 'description': 'Custom field values'},
1126
+ },
1127
+ 'x-airbyte-entity-name': 'offers',
1128
+ },
1129
+ ),
1130
+ EntityDefinition(
1131
+ name='users',
1132
+ actions=[Action.LIST, Action.GET],
1133
+ endpoints={
1134
+ Action.LIST: EndpointDefinition(
1135
+ method='GET',
1136
+ path='/users',
1137
+ action=Action.LIST,
1138
+ description='Returns a paginated list of all users',
1139
+ query_params=[
1140
+ 'per_page',
1141
+ 'page',
1142
+ 'created_before',
1143
+ 'created_after',
1144
+ 'updated_before',
1145
+ 'updated_after',
1146
+ ],
1147
+ query_params_schema={
1148
+ 'per_page': {
1149
+ 'type': 'integer',
1150
+ 'required': False,
1151
+ 'default': 100,
1152
+ },
1153
+ 'page': {
1154
+ 'type': 'integer',
1155
+ 'required': False,
1156
+ 'default': 1,
1157
+ },
1158
+ 'created_before': {'type': 'string', 'required': False},
1159
+ 'created_after': {'type': 'string', 'required': False},
1160
+ 'updated_before': {'type': 'string', 'required': False},
1161
+ 'updated_after': {'type': 'string', 'required': False},
1162
+ },
1163
+ response_schema={
1164
+ 'type': 'array',
1165
+ 'items': {
1166
+ 'type': 'object',
1167
+ 'description': 'Greenhouse user object',
1168
+ 'properties': {
1169
+ 'id': {'type': 'integer', 'description': 'Unique user identifier'},
1170
+ 'name': {'type': 'string', 'description': "User's full name"},
1171
+ 'first_name': {'type': 'string', 'description': "User's first name"},
1172
+ 'last_name': {'type': 'string', 'description': "User's last name"},
1173
+ 'primary_email_address': {
1174
+ 'type': 'string',
1175
+ 'format': 'email',
1176
+ 'description': "User's primary email address",
1177
+ },
1178
+ 'updated_at': {
1179
+ 'type': 'string',
1180
+ 'format': 'date-time',
1181
+ 'description': 'When the user was last updated',
1182
+ },
1183
+ 'created_at': {
1184
+ 'type': 'string',
1185
+ 'format': 'date-time',
1186
+ 'description': 'When the user was created',
1187
+ },
1188
+ 'disabled': {'type': 'boolean', 'description': 'Whether the user is disabled'},
1189
+ 'site_admin': {'type': 'boolean', 'description': 'Whether the user is a site admin'},
1190
+ 'emails': {
1191
+ 'type': 'array',
1192
+ 'items': {'type': 'string'},
1193
+ 'description': 'All user email addresses',
1194
+ },
1195
+ 'employee_id': {
1196
+ 'type': ['string', 'null'],
1197
+ 'description': 'Employee ID',
1198
+ },
1199
+ 'linked_candidate_ids': {
1200
+ 'type': 'array',
1201
+ 'items': {'type': 'integer'},
1202
+ 'description': 'IDs of linked candidates',
1203
+ },
1204
+ 'offices': {
1205
+ 'type': 'array',
1206
+ 'items': {'type': 'object'},
1207
+ 'description': 'Associated offices',
1208
+ },
1209
+ 'departments': {
1210
+ 'type': 'array',
1211
+ 'items': {'type': 'object'},
1212
+ 'description': 'Associated departments',
1213
+ },
1214
+ },
1215
+ 'x-airbyte-entity-name': 'users',
1216
+ },
1217
+ },
1218
+ ),
1219
+ Action.GET: EndpointDefinition(
1220
+ method='GET',
1221
+ path='/users/{id}',
1222
+ action=Action.GET,
1223
+ description='Get a single user by ID',
1224
+ path_params=['id'],
1225
+ path_params_schema={
1226
+ 'id': {'type': 'integer', 'required': True},
1227
+ },
1228
+ response_schema={
1229
+ 'type': 'object',
1230
+ 'description': 'Greenhouse user object',
1231
+ 'properties': {
1232
+ 'id': {'type': 'integer', 'description': 'Unique user identifier'},
1233
+ 'name': {'type': 'string', 'description': "User's full name"},
1234
+ 'first_name': {'type': 'string', 'description': "User's first name"},
1235
+ 'last_name': {'type': 'string', 'description': "User's last name"},
1236
+ 'primary_email_address': {
1237
+ 'type': 'string',
1238
+ 'format': 'email',
1239
+ 'description': "User's primary email address",
1240
+ },
1241
+ 'updated_at': {
1242
+ 'type': 'string',
1243
+ 'format': 'date-time',
1244
+ 'description': 'When the user was last updated',
1245
+ },
1246
+ 'created_at': {
1247
+ 'type': 'string',
1248
+ 'format': 'date-time',
1249
+ 'description': 'When the user was created',
1250
+ },
1251
+ 'disabled': {'type': 'boolean', 'description': 'Whether the user is disabled'},
1252
+ 'site_admin': {'type': 'boolean', 'description': 'Whether the user is a site admin'},
1253
+ 'emails': {
1254
+ 'type': 'array',
1255
+ 'items': {'type': 'string'},
1256
+ 'description': 'All user email addresses',
1257
+ },
1258
+ 'employee_id': {
1259
+ 'type': ['string', 'null'],
1260
+ 'description': 'Employee ID',
1261
+ },
1262
+ 'linked_candidate_ids': {
1263
+ 'type': 'array',
1264
+ 'items': {'type': 'integer'},
1265
+ 'description': 'IDs of linked candidates',
1266
+ },
1267
+ 'offices': {
1268
+ 'type': 'array',
1269
+ 'items': {'type': 'object'},
1270
+ 'description': 'Associated offices',
1271
+ },
1272
+ 'departments': {
1273
+ 'type': 'array',
1274
+ 'items': {'type': 'object'},
1275
+ 'description': 'Associated departments',
1276
+ },
1277
+ },
1278
+ 'x-airbyte-entity-name': 'users',
1279
+ },
1280
+ ),
1281
+ },
1282
+ entity_schema={
1283
+ 'type': 'object',
1284
+ 'description': 'Greenhouse user object',
1285
+ 'properties': {
1286
+ 'id': {'type': 'integer', 'description': 'Unique user identifier'},
1287
+ 'name': {'type': 'string', 'description': "User's full name"},
1288
+ 'first_name': {'type': 'string', 'description': "User's first name"},
1289
+ 'last_name': {'type': 'string', 'description': "User's last name"},
1290
+ 'primary_email_address': {
1291
+ 'type': 'string',
1292
+ 'format': 'email',
1293
+ 'description': "User's primary email address",
1294
+ },
1295
+ 'updated_at': {
1296
+ 'type': 'string',
1297
+ 'format': 'date-time',
1298
+ 'description': 'When the user was last updated',
1299
+ },
1300
+ 'created_at': {
1301
+ 'type': 'string',
1302
+ 'format': 'date-time',
1303
+ 'description': 'When the user was created',
1304
+ },
1305
+ 'disabled': {'type': 'boolean', 'description': 'Whether the user is disabled'},
1306
+ 'site_admin': {'type': 'boolean', 'description': 'Whether the user is a site admin'},
1307
+ 'emails': {
1308
+ 'type': 'array',
1309
+ 'items': {'type': 'string'},
1310
+ 'description': 'All user email addresses',
1311
+ },
1312
+ 'employee_id': {
1313
+ 'type': ['string', 'null'],
1314
+ 'description': 'Employee ID',
1315
+ },
1316
+ 'linked_candidate_ids': {
1317
+ 'type': 'array',
1318
+ 'items': {'type': 'integer'},
1319
+ 'description': 'IDs of linked candidates',
1320
+ },
1321
+ 'offices': {
1322
+ 'type': 'array',
1323
+ 'items': {'type': 'object'},
1324
+ 'description': 'Associated offices',
1325
+ },
1326
+ 'departments': {
1327
+ 'type': 'array',
1328
+ 'items': {'type': 'object'},
1329
+ 'description': 'Associated departments',
1330
+ },
1331
+ },
1332
+ 'x-airbyte-entity-name': 'users',
1333
+ },
1334
+ ),
1335
+ EntityDefinition(
1336
+ name='departments',
1337
+ actions=[Action.LIST, Action.GET],
1338
+ endpoints={
1339
+ Action.LIST: EndpointDefinition(
1340
+ method='GET',
1341
+ path='/departments',
1342
+ action=Action.LIST,
1343
+ description='Returns a paginated list of all departments',
1344
+ query_params=['per_page', 'page'],
1345
+ query_params_schema={
1346
+ 'per_page': {
1347
+ 'type': 'integer',
1348
+ 'required': False,
1349
+ 'default': 100,
1350
+ },
1351
+ 'page': {
1352
+ 'type': 'integer',
1353
+ 'required': False,
1354
+ 'default': 1,
1355
+ },
1356
+ },
1357
+ response_schema={
1358
+ 'type': 'array',
1359
+ 'items': {
1360
+ 'type': 'object',
1361
+ 'description': 'Greenhouse department object',
1362
+ 'properties': {
1363
+ 'id': {'type': 'integer', 'description': 'Unique department identifier'},
1364
+ 'name': {'type': 'string', 'description': 'Department name'},
1365
+ 'parent_id': {
1366
+ 'type': ['integer', 'null'],
1367
+ 'description': 'Parent department ID',
1368
+ },
1369
+ 'parent_department_external_id': {
1370
+ 'type': ['string', 'null'],
1371
+ 'description': 'Parent department external ID',
1372
+ },
1373
+ 'child_ids': {
1374
+ 'type': 'array',
1375
+ 'items': {'type': 'integer'},
1376
+ 'description': 'Child department IDs',
1377
+ },
1378
+ 'child_department_external_ids': {
1379
+ 'type': 'array',
1380
+ 'items': {'type': 'string'},
1381
+ 'description': 'Child department external IDs',
1382
+ },
1383
+ 'external_id': {
1384
+ 'type': ['string', 'null'],
1385
+ 'description': 'External ID',
1386
+ },
1387
+ },
1388
+ 'x-airbyte-entity-name': 'departments',
1389
+ },
1390
+ },
1391
+ ),
1392
+ Action.GET: EndpointDefinition(
1393
+ method='GET',
1394
+ path='/departments/{id}',
1395
+ action=Action.GET,
1396
+ description='Get a single department by ID',
1397
+ path_params=['id'],
1398
+ path_params_schema={
1399
+ 'id': {'type': 'integer', 'required': True},
1400
+ },
1401
+ response_schema={
1402
+ 'type': 'object',
1403
+ 'description': 'Greenhouse department object',
1404
+ 'properties': {
1405
+ 'id': {'type': 'integer', 'description': 'Unique department identifier'},
1406
+ 'name': {'type': 'string', 'description': 'Department name'},
1407
+ 'parent_id': {
1408
+ 'type': ['integer', 'null'],
1409
+ 'description': 'Parent department ID',
1410
+ },
1411
+ 'parent_department_external_id': {
1412
+ 'type': ['string', 'null'],
1413
+ 'description': 'Parent department external ID',
1414
+ },
1415
+ 'child_ids': {
1416
+ 'type': 'array',
1417
+ 'items': {'type': 'integer'},
1418
+ 'description': 'Child department IDs',
1419
+ },
1420
+ 'child_department_external_ids': {
1421
+ 'type': 'array',
1422
+ 'items': {'type': 'string'},
1423
+ 'description': 'Child department external IDs',
1424
+ },
1425
+ 'external_id': {
1426
+ 'type': ['string', 'null'],
1427
+ 'description': 'External ID',
1428
+ },
1429
+ },
1430
+ 'x-airbyte-entity-name': 'departments',
1431
+ },
1432
+ ),
1433
+ },
1434
+ entity_schema={
1435
+ 'type': 'object',
1436
+ 'description': 'Greenhouse department object',
1437
+ 'properties': {
1438
+ 'id': {'type': 'integer', 'description': 'Unique department identifier'},
1439
+ 'name': {'type': 'string', 'description': 'Department name'},
1440
+ 'parent_id': {
1441
+ 'type': ['integer', 'null'],
1442
+ 'description': 'Parent department ID',
1443
+ },
1444
+ 'parent_department_external_id': {
1445
+ 'type': ['string', 'null'],
1446
+ 'description': 'Parent department external ID',
1447
+ },
1448
+ 'child_ids': {
1449
+ 'type': 'array',
1450
+ 'items': {'type': 'integer'},
1451
+ 'description': 'Child department IDs',
1452
+ },
1453
+ 'child_department_external_ids': {
1454
+ 'type': 'array',
1455
+ 'items': {'type': 'string'},
1456
+ 'description': 'Child department external IDs',
1457
+ },
1458
+ 'external_id': {
1459
+ 'type': ['string', 'null'],
1460
+ 'description': 'External ID',
1461
+ },
1462
+ },
1463
+ 'x-airbyte-entity-name': 'departments',
1464
+ },
1465
+ ),
1466
+ EntityDefinition(
1467
+ name='offices',
1468
+ actions=[Action.LIST, Action.GET],
1469
+ endpoints={
1470
+ Action.LIST: EndpointDefinition(
1471
+ method='GET',
1472
+ path='/offices',
1473
+ action=Action.LIST,
1474
+ description='Returns a paginated list of all offices',
1475
+ query_params=['per_page', 'page'],
1476
+ query_params_schema={
1477
+ 'per_page': {
1478
+ 'type': 'integer',
1479
+ 'required': False,
1480
+ 'default': 100,
1481
+ },
1482
+ 'page': {
1483
+ 'type': 'integer',
1484
+ 'required': False,
1485
+ 'default': 1,
1486
+ },
1487
+ },
1488
+ response_schema={
1489
+ 'type': 'array',
1490
+ 'items': {
1491
+ 'type': 'object',
1492
+ 'description': 'Greenhouse office object',
1493
+ 'properties': {
1494
+ 'id': {'type': 'integer', 'description': 'Unique office identifier'},
1495
+ 'name': {'type': 'string', 'description': 'Office name'},
1496
+ 'location': {
1497
+ 'type': ['object', 'null'],
1498
+ 'description': 'Office location details',
1499
+ },
1500
+ 'primary_contact_user_id': {
1501
+ 'type': ['integer', 'null'],
1502
+ 'description': 'Primary contact user ID',
1503
+ },
1504
+ 'parent_id': {
1505
+ 'type': ['integer', 'null'],
1506
+ 'description': 'Parent office ID',
1507
+ },
1508
+ 'parent_office_external_id': {
1509
+ 'type': ['string', 'null'],
1510
+ 'description': 'Parent office external ID',
1511
+ },
1512
+ 'child_ids': {
1513
+ 'type': 'array',
1514
+ 'items': {'type': 'integer'},
1515
+ 'description': 'Child office IDs',
1516
+ },
1517
+ 'child_office_external_ids': {
1518
+ 'type': 'array',
1519
+ 'items': {'type': 'string'},
1520
+ 'description': 'Child office external IDs',
1521
+ },
1522
+ 'external_id': {
1523
+ 'type': ['string', 'null'],
1524
+ 'description': 'External ID',
1525
+ },
1526
+ },
1527
+ 'x-airbyte-entity-name': 'offices',
1528
+ },
1529
+ },
1530
+ ),
1531
+ Action.GET: EndpointDefinition(
1532
+ method='GET',
1533
+ path='/offices/{id}',
1534
+ action=Action.GET,
1535
+ description='Get a single office by ID',
1536
+ path_params=['id'],
1537
+ path_params_schema={
1538
+ 'id': {'type': 'integer', 'required': True},
1539
+ },
1540
+ response_schema={
1541
+ 'type': 'object',
1542
+ 'description': 'Greenhouse office object',
1543
+ 'properties': {
1544
+ 'id': {'type': 'integer', 'description': 'Unique office identifier'},
1545
+ 'name': {'type': 'string', 'description': 'Office name'},
1546
+ 'location': {
1547
+ 'type': ['object', 'null'],
1548
+ 'description': 'Office location details',
1549
+ },
1550
+ 'primary_contact_user_id': {
1551
+ 'type': ['integer', 'null'],
1552
+ 'description': 'Primary contact user ID',
1553
+ },
1554
+ 'parent_id': {
1555
+ 'type': ['integer', 'null'],
1556
+ 'description': 'Parent office ID',
1557
+ },
1558
+ 'parent_office_external_id': {
1559
+ 'type': ['string', 'null'],
1560
+ 'description': 'Parent office external ID',
1561
+ },
1562
+ 'child_ids': {
1563
+ 'type': 'array',
1564
+ 'items': {'type': 'integer'},
1565
+ 'description': 'Child office IDs',
1566
+ },
1567
+ 'child_office_external_ids': {
1568
+ 'type': 'array',
1569
+ 'items': {'type': 'string'},
1570
+ 'description': 'Child office external IDs',
1571
+ },
1572
+ 'external_id': {
1573
+ 'type': ['string', 'null'],
1574
+ 'description': 'External ID',
1575
+ },
1576
+ },
1577
+ 'x-airbyte-entity-name': 'offices',
1578
+ },
1579
+ ),
1580
+ },
1581
+ entity_schema={
1582
+ 'type': 'object',
1583
+ 'description': 'Greenhouse office object',
1584
+ 'properties': {
1585
+ 'id': {'type': 'integer', 'description': 'Unique office identifier'},
1586
+ 'name': {'type': 'string', 'description': 'Office name'},
1587
+ 'location': {
1588
+ 'type': ['object', 'null'],
1589
+ 'description': 'Office location details',
1590
+ },
1591
+ 'primary_contact_user_id': {
1592
+ 'type': ['integer', 'null'],
1593
+ 'description': 'Primary contact user ID',
1594
+ },
1595
+ 'parent_id': {
1596
+ 'type': ['integer', 'null'],
1597
+ 'description': 'Parent office ID',
1598
+ },
1599
+ 'parent_office_external_id': {
1600
+ 'type': ['string', 'null'],
1601
+ 'description': 'Parent office external ID',
1602
+ },
1603
+ 'child_ids': {
1604
+ 'type': 'array',
1605
+ 'items': {'type': 'integer'},
1606
+ 'description': 'Child office IDs',
1607
+ },
1608
+ 'child_office_external_ids': {
1609
+ 'type': 'array',
1610
+ 'items': {'type': 'string'},
1611
+ 'description': 'Child office external IDs',
1612
+ },
1613
+ 'external_id': {
1614
+ 'type': ['string', 'null'],
1615
+ 'description': 'External ID',
1616
+ },
1617
+ },
1618
+ 'x-airbyte-entity-name': 'offices',
1619
+ },
1620
+ ),
1621
+ EntityDefinition(
1622
+ name='job_posts',
1623
+ actions=[Action.LIST, Action.GET],
1624
+ endpoints={
1625
+ Action.LIST: EndpointDefinition(
1626
+ method='GET',
1627
+ path='/job_posts',
1628
+ action=Action.LIST,
1629
+ description='Returns a paginated list of all job posts',
1630
+ query_params=[
1631
+ 'per_page',
1632
+ 'page',
1633
+ 'live',
1634
+ 'active',
1635
+ ],
1636
+ query_params_schema={
1637
+ 'per_page': {
1638
+ 'type': 'integer',
1639
+ 'required': False,
1640
+ 'default': 100,
1641
+ },
1642
+ 'page': {
1643
+ 'type': 'integer',
1644
+ 'required': False,
1645
+ 'default': 1,
1646
+ },
1647
+ 'live': {'type': 'boolean', 'required': False},
1648
+ 'active': {'type': 'boolean', 'required': False},
1649
+ },
1650
+ response_schema={
1651
+ 'type': 'array',
1652
+ 'items': {
1653
+ 'type': 'object',
1654
+ 'description': 'Greenhouse job post object',
1655
+ 'properties': {
1656
+ 'id': {'type': 'integer', 'description': 'Unique job post identifier'},
1657
+ 'title': {'type': 'string', 'description': 'Job post title'},
1658
+ 'location': {
1659
+ 'type': ['object', 'null'],
1660
+ 'description': 'Job post location',
1661
+ },
1662
+ 'internal': {'type': 'boolean', 'description': 'Whether this is an internal job post'},
1663
+ 'external': {'type': 'boolean', 'description': 'Whether this is an external job post'},
1664
+ 'active': {'type': 'boolean', 'description': 'Whether the job post is active'},
1665
+ 'live': {'type': 'boolean', 'description': 'Whether the job post is live'},
1666
+ 'first_published_at': {
1667
+ 'type': ['string', 'null'],
1668
+ 'format': 'date-time',
1669
+ 'description': 'When the job post was first published',
1670
+ },
1671
+ 'job_id': {'type': 'integer', 'description': 'Associated job ID'},
1672
+ 'content': {
1673
+ 'type': ['string', 'null'],
1674
+ 'description': 'Job post content/description',
1675
+ },
1676
+ 'internal_content': {
1677
+ 'type': ['string', 'null'],
1678
+ 'description': 'Internal job post content',
1679
+ },
1680
+ 'updated_at': {
1681
+ 'type': 'string',
1682
+ 'format': 'date-time',
1683
+ 'description': 'When the job post was last updated',
1684
+ },
1685
+ 'created_at': {
1686
+ 'type': 'string',
1687
+ 'format': 'date-time',
1688
+ 'description': 'When the job post was created',
1689
+ },
1690
+ 'demographic_question_set_id': {
1691
+ 'type': ['integer', 'null'],
1692
+ 'description': 'Demographic question set ID',
1693
+ },
1694
+ 'questions': {
1695
+ 'type': 'array',
1696
+ 'items': {'type': 'object'},
1697
+ 'description': 'Application questions',
1698
+ },
1699
+ },
1700
+ 'x-airbyte-entity-name': 'job_posts',
1701
+ },
1702
+ },
1703
+ ),
1704
+ Action.GET: EndpointDefinition(
1705
+ method='GET',
1706
+ path='/job_posts/{id}',
1707
+ action=Action.GET,
1708
+ description='Get a single job post by ID',
1709
+ path_params=['id'],
1710
+ path_params_schema={
1711
+ 'id': {'type': 'integer', 'required': True},
1712
+ },
1713
+ response_schema={
1714
+ 'type': 'object',
1715
+ 'description': 'Greenhouse job post object',
1716
+ 'properties': {
1717
+ 'id': {'type': 'integer', 'description': 'Unique job post identifier'},
1718
+ 'title': {'type': 'string', 'description': 'Job post title'},
1719
+ 'location': {
1720
+ 'type': ['object', 'null'],
1721
+ 'description': 'Job post location',
1722
+ },
1723
+ 'internal': {'type': 'boolean', 'description': 'Whether this is an internal job post'},
1724
+ 'external': {'type': 'boolean', 'description': 'Whether this is an external job post'},
1725
+ 'active': {'type': 'boolean', 'description': 'Whether the job post is active'},
1726
+ 'live': {'type': 'boolean', 'description': 'Whether the job post is live'},
1727
+ 'first_published_at': {
1728
+ 'type': ['string', 'null'],
1729
+ 'format': 'date-time',
1730
+ 'description': 'When the job post was first published',
1731
+ },
1732
+ 'job_id': {'type': 'integer', 'description': 'Associated job ID'},
1733
+ 'content': {
1734
+ 'type': ['string', 'null'],
1735
+ 'description': 'Job post content/description',
1736
+ },
1737
+ 'internal_content': {
1738
+ 'type': ['string', 'null'],
1739
+ 'description': 'Internal job post content',
1740
+ },
1741
+ 'updated_at': {
1742
+ 'type': 'string',
1743
+ 'format': 'date-time',
1744
+ 'description': 'When the job post was last updated',
1745
+ },
1746
+ 'created_at': {
1747
+ 'type': 'string',
1748
+ 'format': 'date-time',
1749
+ 'description': 'When the job post was created',
1750
+ },
1751
+ 'demographic_question_set_id': {
1752
+ 'type': ['integer', 'null'],
1753
+ 'description': 'Demographic question set ID',
1754
+ },
1755
+ 'questions': {
1756
+ 'type': 'array',
1757
+ 'items': {'type': 'object'},
1758
+ 'description': 'Application questions',
1759
+ },
1760
+ },
1761
+ 'x-airbyte-entity-name': 'job_posts',
1762
+ },
1763
+ untested=True,
1764
+ ),
1765
+ },
1766
+ entity_schema={
1767
+ 'type': 'object',
1768
+ 'description': 'Greenhouse job post object',
1769
+ 'properties': {
1770
+ 'id': {'type': 'integer', 'description': 'Unique job post identifier'},
1771
+ 'title': {'type': 'string', 'description': 'Job post title'},
1772
+ 'location': {
1773
+ 'type': ['object', 'null'],
1774
+ 'description': 'Job post location',
1775
+ },
1776
+ 'internal': {'type': 'boolean', 'description': 'Whether this is an internal job post'},
1777
+ 'external': {'type': 'boolean', 'description': 'Whether this is an external job post'},
1778
+ 'active': {'type': 'boolean', 'description': 'Whether the job post is active'},
1779
+ 'live': {'type': 'boolean', 'description': 'Whether the job post is live'},
1780
+ 'first_published_at': {
1781
+ 'type': ['string', 'null'],
1782
+ 'format': 'date-time',
1783
+ 'description': 'When the job post was first published',
1784
+ },
1785
+ 'job_id': {'type': 'integer', 'description': 'Associated job ID'},
1786
+ 'content': {
1787
+ 'type': ['string', 'null'],
1788
+ 'description': 'Job post content/description',
1789
+ },
1790
+ 'internal_content': {
1791
+ 'type': ['string', 'null'],
1792
+ 'description': 'Internal job post content',
1793
+ },
1794
+ 'updated_at': {
1795
+ 'type': 'string',
1796
+ 'format': 'date-time',
1797
+ 'description': 'When the job post was last updated',
1798
+ },
1799
+ 'created_at': {
1800
+ 'type': 'string',
1801
+ 'format': 'date-time',
1802
+ 'description': 'When the job post was created',
1803
+ },
1804
+ 'demographic_question_set_id': {
1805
+ 'type': ['integer', 'null'],
1806
+ 'description': 'Demographic question set ID',
1807
+ },
1808
+ 'questions': {
1809
+ 'type': 'array',
1810
+ 'items': {'type': 'object'},
1811
+ 'description': 'Application questions',
1812
+ },
1813
+ },
1814
+ 'x-airbyte-entity-name': 'job_posts',
1815
+ },
1816
+ ),
1817
+ EntityDefinition(
1818
+ name='sources',
1819
+ actions=[Action.LIST],
1820
+ endpoints={
1821
+ Action.LIST: EndpointDefinition(
1822
+ method='GET',
1823
+ path='/sources',
1824
+ action=Action.LIST,
1825
+ description='Returns a paginated list of all sources',
1826
+ query_params=['per_page', 'page'],
1827
+ query_params_schema={
1828
+ 'per_page': {
1829
+ 'type': 'integer',
1830
+ 'required': False,
1831
+ 'default': 100,
1832
+ },
1833
+ 'page': {
1834
+ 'type': 'integer',
1835
+ 'required': False,
1836
+ 'default': 1,
1837
+ },
1838
+ },
1839
+ response_schema={
1840
+ 'type': 'array',
1841
+ 'items': {
1842
+ 'type': 'object',
1843
+ 'description': 'Greenhouse source object',
1844
+ 'properties': {
1845
+ 'id': {'type': 'integer', 'description': 'Unique source identifier'},
1846
+ 'name': {'type': 'string', 'description': 'Source name'},
1847
+ 'type': {
1848
+ 'type': ['object', 'null'],
1849
+ 'description': 'Source type information',
1850
+ },
1851
+ },
1852
+ 'x-airbyte-entity-name': 'sources',
1853
+ },
1854
+ },
1855
+ ),
1856
+ },
1857
+ entity_schema={
1858
+ 'type': 'object',
1859
+ 'description': 'Greenhouse source object',
1860
+ 'properties': {
1861
+ 'id': {'type': 'integer', 'description': 'Unique source identifier'},
1862
+ 'name': {'type': 'string', 'description': 'Source name'},
1863
+ 'type': {
1864
+ 'type': ['object', 'null'],
1865
+ 'description': 'Source type information',
1866
+ },
1867
+ },
1868
+ 'x-airbyte-entity-name': 'sources',
1869
+ },
1870
+ ),
1871
+ EntityDefinition(
1872
+ name='scheduled_interviews',
1873
+ actions=[Action.LIST, Action.GET],
1874
+ endpoints={
1875
+ Action.LIST: EndpointDefinition(
1876
+ method='GET',
1877
+ path='/scheduled_interviews',
1878
+ action=Action.LIST,
1879
+ description='Returns a paginated list of all scheduled interviews',
1880
+ query_params=[
1881
+ 'per_page',
1882
+ 'page',
1883
+ 'created_before',
1884
+ 'created_after',
1885
+ 'updated_before',
1886
+ 'updated_after',
1887
+ 'starts_after',
1888
+ 'ends_before',
1889
+ ],
1890
+ query_params_schema={
1891
+ 'per_page': {
1892
+ 'type': 'integer',
1893
+ 'required': False,
1894
+ 'default': 100,
1895
+ },
1896
+ 'page': {
1897
+ 'type': 'integer',
1898
+ 'required': False,
1899
+ 'default': 1,
1900
+ },
1901
+ 'created_before': {'type': 'string', 'required': False},
1902
+ 'created_after': {'type': 'string', 'required': False},
1903
+ 'updated_before': {'type': 'string', 'required': False},
1904
+ 'updated_after': {'type': 'string', 'required': False},
1905
+ 'starts_after': {'type': 'string', 'required': False},
1906
+ 'ends_before': {'type': 'string', 'required': False},
1907
+ },
1908
+ response_schema={
1909
+ 'type': 'array',
1910
+ 'items': {
1911
+ 'type': 'object',
1912
+ 'description': 'Greenhouse scheduled interview object',
1913
+ 'properties': {
1914
+ 'id': {'type': 'integer', 'description': 'Unique scheduled interview identifier'},
1915
+ 'application_id': {'type': 'integer', 'description': 'Associated application ID'},
1916
+ 'external_event_id': {
1917
+ 'type': ['string', 'null'],
1918
+ 'description': 'External calendar event ID',
1919
+ },
1920
+ 'created_at': {
1921
+ 'type': 'string',
1922
+ 'format': 'date-time',
1923
+ 'description': 'When the interview was created',
1924
+ },
1925
+ 'updated_at': {
1926
+ 'type': 'string',
1927
+ 'format': 'date-time',
1928
+ 'description': 'When the interview was last updated',
1929
+ },
1930
+ 'start': {
1931
+ 'type': ['object', 'null'],
1932
+ 'description': 'Interview start time details',
1933
+ },
1934
+ 'end': {
1935
+ 'type': ['object', 'null'],
1936
+ 'description': 'Interview end time details',
1937
+ },
1938
+ 'location': {
1939
+ 'type': ['string', 'null'],
1940
+ 'description': 'Interview location',
1941
+ },
1942
+ 'video_conferencing_url': {
1943
+ 'type': ['string', 'null'],
1944
+ 'description': 'Video conferencing URL',
1945
+ },
1946
+ 'status': {'type': 'string', 'description': 'Interview status'},
1947
+ 'interview': {
1948
+ 'type': ['object', 'null'],
1949
+ 'description': 'Interview details',
1950
+ },
1951
+ 'organizer': {
1952
+ 'type': ['object', 'null'],
1953
+ 'description': 'Interview organizer',
1954
+ },
1955
+ 'interviewers': {
1956
+ 'type': 'array',
1957
+ 'items': {'type': 'object'},
1958
+ 'description': 'List of interviewers',
1959
+ },
1960
+ },
1961
+ 'x-airbyte-entity-name': 'scheduled_interviews',
1962
+ },
1963
+ },
1964
+ ),
1965
+ Action.GET: EndpointDefinition(
1966
+ method='GET',
1967
+ path='/scheduled_interviews/{id}',
1968
+ action=Action.GET,
1969
+ description='Get a single scheduled interview by ID',
1970
+ path_params=['id'],
1971
+ path_params_schema={
1972
+ 'id': {'type': 'integer', 'required': True},
1973
+ },
1974
+ response_schema={
1975
+ 'type': 'object',
1976
+ 'description': 'Greenhouse scheduled interview object',
1977
+ 'properties': {
1978
+ 'id': {'type': 'integer', 'description': 'Unique scheduled interview identifier'},
1979
+ 'application_id': {'type': 'integer', 'description': 'Associated application ID'},
1980
+ 'external_event_id': {
1981
+ 'type': ['string', 'null'],
1982
+ 'description': 'External calendar event ID',
1983
+ },
1984
+ 'created_at': {
1985
+ 'type': 'string',
1986
+ 'format': 'date-time',
1987
+ 'description': 'When the interview was created',
1988
+ },
1989
+ 'updated_at': {
1990
+ 'type': 'string',
1991
+ 'format': 'date-time',
1992
+ 'description': 'When the interview was last updated',
1993
+ },
1994
+ 'start': {
1995
+ 'type': ['object', 'null'],
1996
+ 'description': 'Interview start time details',
1997
+ },
1998
+ 'end': {
1999
+ 'type': ['object', 'null'],
2000
+ 'description': 'Interview end time details',
2001
+ },
2002
+ 'location': {
2003
+ 'type': ['string', 'null'],
2004
+ 'description': 'Interview location',
2005
+ },
2006
+ 'video_conferencing_url': {
2007
+ 'type': ['string', 'null'],
2008
+ 'description': 'Video conferencing URL',
2009
+ },
2010
+ 'status': {'type': 'string', 'description': 'Interview status'},
2011
+ 'interview': {
2012
+ 'type': ['object', 'null'],
2013
+ 'description': 'Interview details',
2014
+ },
2015
+ 'organizer': {
2016
+ 'type': ['object', 'null'],
2017
+ 'description': 'Interview organizer',
2018
+ },
2019
+ 'interviewers': {
2020
+ 'type': 'array',
2021
+ 'items': {'type': 'object'},
2022
+ 'description': 'List of interviewers',
2023
+ },
2024
+ },
2025
+ 'x-airbyte-entity-name': 'scheduled_interviews',
2026
+ },
2027
+ untested=True,
2028
+ ),
2029
+ },
2030
+ entity_schema={
2031
+ 'type': 'object',
2032
+ 'description': 'Greenhouse scheduled interview object',
2033
+ 'properties': {
2034
+ 'id': {'type': 'integer', 'description': 'Unique scheduled interview identifier'},
2035
+ 'application_id': {'type': 'integer', 'description': 'Associated application ID'},
2036
+ 'external_event_id': {
2037
+ 'type': ['string', 'null'],
2038
+ 'description': 'External calendar event ID',
2039
+ },
2040
+ 'created_at': {
2041
+ 'type': 'string',
2042
+ 'format': 'date-time',
2043
+ 'description': 'When the interview was created',
2044
+ },
2045
+ 'updated_at': {
2046
+ 'type': 'string',
2047
+ 'format': 'date-time',
2048
+ 'description': 'When the interview was last updated',
2049
+ },
2050
+ 'start': {
2051
+ 'type': ['object', 'null'],
2052
+ 'description': 'Interview start time details',
2053
+ },
2054
+ 'end': {
2055
+ 'type': ['object', 'null'],
2056
+ 'description': 'Interview end time details',
2057
+ },
2058
+ 'location': {
2059
+ 'type': ['string', 'null'],
2060
+ 'description': 'Interview location',
2061
+ },
2062
+ 'video_conferencing_url': {
2063
+ 'type': ['string', 'null'],
2064
+ 'description': 'Video conferencing URL',
2065
+ },
2066
+ 'status': {'type': 'string', 'description': 'Interview status'},
2067
+ 'interview': {
2068
+ 'type': ['object', 'null'],
2069
+ 'description': 'Interview details',
2070
+ },
2071
+ 'organizer': {
2072
+ 'type': ['object', 'null'],
2073
+ 'description': 'Interview organizer',
2074
+ },
2075
+ 'interviewers': {
2076
+ 'type': 'array',
2077
+ 'items': {'type': 'object'},
2078
+ 'description': 'List of interviewers',
2079
+ },
2080
+ },
2081
+ 'x-airbyte-entity-name': 'scheduled_interviews',
2082
+ },
2083
+ ),
2084
+ EntityDefinition(
2085
+ name='application_attachment',
2086
+ actions=[Action.DOWNLOAD],
2087
+ endpoints={
2088
+ Action.DOWNLOAD: EndpointDefinition(
2089
+ method='GET',
2090
+ path='/applications/{id}/attachment:download/{attachment_index}',
2091
+ path_override=PathOverrideConfig(
2092
+ path='/applications/{id}',
2093
+ ),
2094
+ action=Action.DOWNLOAD,
2095
+ description='Downloads an attachment (resume, cover letter, etc.) for an application by index.\nThe attachment URL is a temporary signed AWS S3 URL that expires within 7 days.\nFiles should be downloaded immediately after retrieval.\n',
2096
+ path_params=['id', 'attachment_index'],
2097
+ path_params_schema={
2098
+ 'id': {'type': 'integer', 'required': True},
2099
+ 'attachment_index': {
2100
+ 'type': 'integer',
2101
+ 'required': True,
2102
+ 'default': 0,
2103
+ },
2104
+ },
2105
+ response_schema={
2106
+ 'type': 'object',
2107
+ 'description': 'Greenhouse application object',
2108
+ 'properties': {
2109
+ 'id': {'type': 'integer', 'description': 'Unique application identifier'},
2110
+ 'candidate_id': {'type': 'integer', 'description': 'ID of the associated candidate'},
2111
+ 'prospect': {'type': 'boolean', 'description': 'Whether this is a prospect application'},
2112
+ 'applied_at': {
2113
+ 'type': 'string',
2114
+ 'format': 'date-time',
2115
+ 'description': 'When the application was submitted',
2116
+ },
2117
+ 'rejected_at': {
2118
+ 'type': ['string', 'null'],
2119
+ 'format': 'date-time',
2120
+ 'description': 'When the application was rejected',
2121
+ },
2122
+ 'last_activity_at': {
2123
+ 'type': 'string',
2124
+ 'format': 'date-time',
2125
+ 'description': 'When the last activity occurred',
2126
+ },
2127
+ 'location': {
2128
+ 'type': ['object', 'null'],
2129
+ 'description': 'Application location',
2130
+ },
2131
+ 'source': {'type': 'object', 'description': 'Application source'},
2132
+ 'credited_to': {'type': 'object', 'description': 'User credited with the application'},
2133
+ 'rejection_reason': {
2134
+ 'type': ['object', 'null'],
2135
+ 'description': 'Rejection reason if rejected',
2136
+ },
2137
+ 'rejection_details': {
2138
+ 'type': ['object', 'null'],
2139
+ 'description': 'Additional rejection details',
2140
+ },
2141
+ 'jobs': {
2142
+ 'type': 'array',
2143
+ 'items': {'type': 'object'},
2144
+ 'description': 'Jobs associated with the application',
2145
+ },
2146
+ 'job_post_id': {
2147
+ 'type': ['integer', 'null'],
2148
+ 'description': 'ID of the job post',
2149
+ },
2150
+ 'status': {'type': 'string', 'description': 'Application status'},
2151
+ 'current_stage': {
2152
+ 'type': ['object', 'null'],
2153
+ 'description': 'Current stage of the application',
2154
+ },
2155
+ 'answers': {
2156
+ 'type': 'array',
2157
+ 'items': {'type': 'object'},
2158
+ 'description': 'Application question answers',
2159
+ },
2160
+ 'prospective_office': {
2161
+ 'type': ['object', 'null'],
2162
+ 'description': 'Prospective office',
2163
+ },
2164
+ 'prospective_department': {
2165
+ 'type': ['object', 'null'],
2166
+ 'description': 'Prospective department',
2167
+ },
2168
+ 'prospect_detail': {'type': 'object', 'description': 'Prospect details'},
2169
+ 'attachments': {
2170
+ 'type': 'array',
2171
+ 'items': {
2172
+ 'type': 'object',
2173
+ 'description': 'File attachment (resume, cover letter, etc.)',
2174
+ 'properties': {
2175
+ 'filename': {'type': 'string', 'description': 'Name of the attached file'},
2176
+ 'url': {
2177
+ 'type': 'string',
2178
+ 'format': 'uri',
2179
+ 'description': 'Temporary signed AWS S3 URL to download the file.\nThis URL expires within 7 days - download immediately after retrieval.\n',
2180
+ },
2181
+ 'type': {
2182
+ 'type': 'string',
2183
+ 'enum': [
2184
+ 'resume',
2185
+ 'cover_letter',
2186
+ 'admin_only',
2187
+ 'take_home_test',
2188
+ 'offer_packet',
2189
+ 'offer_letter',
2190
+ 'signed_offer_letter',
2191
+ 'other',
2192
+ ],
2193
+ 'description': 'Type of attachment',
2194
+ },
2195
+ 'created_at': {
2196
+ 'type': 'string',
2197
+ 'format': 'date-time',
2198
+ 'description': 'When the attachment was uploaded',
2199
+ },
2200
+ },
2201
+ },
2202
+ 'description': 'Application attachments (resumes, cover letters, etc.)',
2203
+ },
2204
+ 'custom_fields': {'type': 'object', 'description': 'Custom field values'},
2205
+ },
2206
+ 'x-airbyte-entity-name': 'applications',
2207
+ },
2208
+ file_field='attachments[{attachment_index}].url',
2209
+ ),
2210
+ },
2211
+ ),
2212
+ EntityDefinition(
2213
+ name='candidate_attachment',
2214
+ actions=[Action.DOWNLOAD],
2215
+ endpoints={
2216
+ Action.DOWNLOAD: EndpointDefinition(
2217
+ method='GET',
2218
+ path='/candidates/{id}/attachment:download/{attachment_index}',
2219
+ path_override=PathOverrideConfig(
2220
+ path='/candidates/{id}',
2221
+ ),
2222
+ action=Action.DOWNLOAD,
2223
+ description='Downloads an attachment (resume, cover letter, etc.) for a candidate by index.\nThe attachment URL is a temporary signed AWS S3 URL that expires within 7 days.\nFiles should be downloaded immediately after retrieval.\n',
2224
+ path_params=['id', 'attachment_index'],
2225
+ path_params_schema={
2226
+ 'id': {'type': 'integer', 'required': True},
2227
+ 'attachment_index': {
2228
+ 'type': 'integer',
2229
+ 'required': True,
2230
+ 'default': 0,
2231
+ },
2232
+ },
2233
+ response_schema={
2234
+ 'type': 'object',
2235
+ 'description': 'Greenhouse candidate object',
2236
+ 'properties': {
2237
+ 'id': {'type': 'integer', 'description': 'Unique candidate identifier'},
2238
+ 'first_name': {'type': 'string', 'description': "Candidate's first name"},
2239
+ 'last_name': {'type': 'string', 'description': "Candidate's last name"},
2240
+ 'company': {
2241
+ 'type': ['string', 'null'],
2242
+ 'description': "Candidate's current company",
2243
+ },
2244
+ 'title': {
2245
+ 'type': ['string', 'null'],
2246
+ 'description': "Candidate's current title",
2247
+ },
2248
+ 'created_at': {
2249
+ 'type': 'string',
2250
+ 'format': 'date-time',
2251
+ 'description': 'When the candidate was created',
2252
+ },
2253
+ 'updated_at': {
2254
+ 'type': 'string',
2255
+ 'format': 'date-time',
2256
+ 'description': 'When the candidate was last updated',
2257
+ },
2258
+ 'last_activity': {
2259
+ 'type': 'string',
2260
+ 'format': 'date-time',
2261
+ 'description': 'When the last activity occurred',
2262
+ },
2263
+ 'is_private': {'type': 'boolean', 'description': 'Whether the candidate is private'},
2264
+ 'photo_url': {
2265
+ 'type': ['string', 'null'],
2266
+ 'description': "URL to candidate's photo",
2267
+ },
2268
+ 'attachments': {
2269
+ 'type': 'array',
2270
+ 'items': {
2271
+ 'type': 'object',
2272
+ 'description': 'File attachment (resume, cover letter, etc.)',
2273
+ 'properties': {
2274
+ 'filename': {'type': 'string', 'description': 'Name of the attached file'},
2275
+ 'url': {
2276
+ 'type': 'string',
2277
+ 'format': 'uri',
2278
+ 'description': 'Temporary signed AWS S3 URL to download the file.\nThis URL expires within 7 days - download immediately after retrieval.\n',
2279
+ },
2280
+ 'type': {
2281
+ 'type': 'string',
2282
+ 'enum': [
2283
+ 'resume',
2284
+ 'cover_letter',
2285
+ 'admin_only',
2286
+ 'take_home_test',
2287
+ 'offer_packet',
2288
+ 'offer_letter',
2289
+ 'signed_offer_letter',
2290
+ 'other',
2291
+ ],
2292
+ 'description': 'Type of attachment',
2293
+ },
2294
+ 'created_at': {
2295
+ 'type': 'string',
2296
+ 'format': 'date-time',
2297
+ 'description': 'When the attachment was uploaded',
2298
+ },
2299
+ },
2300
+ },
2301
+ 'description': 'Candidate attachments (resumes, cover letters, etc.)',
2302
+ },
2303
+ 'application_ids': {
2304
+ 'type': 'array',
2305
+ 'items': {'type': 'integer'},
2306
+ 'description': "IDs of candidate's applications",
2307
+ },
2308
+ 'phone_numbers': {
2309
+ 'type': 'array',
2310
+ 'items': {'type': 'object'},
2311
+ 'description': 'Candidate phone numbers',
2312
+ },
2313
+ 'addresses': {
2314
+ 'type': 'array',
2315
+ 'items': {'type': 'object'},
2316
+ 'description': 'Candidate addresses',
2317
+ },
2318
+ 'email_addresses': {
2319
+ 'type': 'array',
2320
+ 'items': {'type': 'object'},
2321
+ 'description': 'Candidate email addresses',
2322
+ },
2323
+ 'website_addresses': {
2324
+ 'type': 'array',
2325
+ 'items': {'type': 'object'},
2326
+ 'description': 'Candidate website addresses',
2327
+ },
2328
+ 'social_media_addresses': {
2329
+ 'type': 'array',
2330
+ 'items': {'type': 'object'},
2331
+ 'description': 'Candidate social media addresses',
2332
+ },
2333
+ 'recruiter': {
2334
+ 'type': ['object', 'null'],
2335
+ 'description': 'Recruiter information',
2336
+ },
2337
+ 'coordinator': {
2338
+ 'type': ['object', 'null'],
2339
+ 'description': 'Coordinator information',
2340
+ },
2341
+ 'can_email': {'type': 'boolean', 'description': 'Whether the candidate can be emailed'},
2342
+ 'tags': {
2343
+ 'type': 'array',
2344
+ 'items': {'type': 'string'},
2345
+ 'description': 'Candidate tags',
2346
+ },
2347
+ 'custom_fields': {'type': 'object', 'description': 'Custom field values'},
2348
+ },
2349
+ 'x-airbyte-entity-name': 'candidates',
2350
+ },
2351
+ file_field='attachments[{attachment_index}].url',
2352
+ ),
2353
+ },
2354
+ ),
2355
+ ],
2356
+ )