fathom-python 0.0.23__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 (47) hide show
  1. fathom/__init__.py +57 -0
  2. fathom/base_client.py +453 -0
  3. fathom/client.py +25 -0
  4. fathom/core/__init__.py +52 -0
  5. fathom/core/api_error.py +23 -0
  6. fathom/core/client_wrapper.py +76 -0
  7. fathom/core/datetime_utils.py +28 -0
  8. fathom/core/file.py +67 -0
  9. fathom/core/force_multipart.py +16 -0
  10. fathom/core/http_client.py +543 -0
  11. fathom/core/http_response.py +55 -0
  12. fathom/core/jsonable_encoder.py +100 -0
  13. fathom/core/pydantic_utilities.py +255 -0
  14. fathom/core/query_encoder.py +58 -0
  15. fathom/core/remove_none_from_dict.py +11 -0
  16. fathom/core/request_options.py +35 -0
  17. fathom/core/serialization.py +276 -0
  18. fathom/environment.py +7 -0
  19. fathom/errors/__init__.py +8 -0
  20. fathom/errors/bad_request_error.py +10 -0
  21. fathom/errors/unauthorized_error.py +10 -0
  22. fathom/py.typed +0 -0
  23. fathom/raw_base_client.py +512 -0
  24. fathom/types/__init__.py +45 -0
  25. fathom/types/action_item.py +29 -0
  26. fathom/types/assignee.py +21 -0
  27. fathom/types/crm_company_match.py +20 -0
  28. fathom/types/crm_contact_match.py +21 -0
  29. fathom/types/crm_deal_match.py +21 -0
  30. fathom/types/crm_matches.py +30 -0
  31. fathom/types/fathom_user.py +21 -0
  32. fathom/types/invitee.py +22 -0
  33. fathom/types/list_meetings_request_meeting_type.py +5 -0
  34. fathom/types/meeting.py +51 -0
  35. fathom/types/meeting_list_response.py +22 -0
  36. fathom/types/meeting_meeting_type.py +5 -0
  37. fathom/types/meeting_summary.py +20 -0
  38. fathom/types/team.py +21 -0
  39. fathom/types/team_list_response.py +22 -0
  40. fathom/types/team_member.py +22 -0
  41. fathom/types/team_member_list_response.py +22 -0
  42. fathom/types/transcript_item.py +25 -0
  43. fathom/types/transcript_item_speaker.py +20 -0
  44. fathom/version.py +3 -0
  45. fathom_python-0.0.23.dist-info/METADATA +151 -0
  46. fathom_python-0.0.23.dist-info/RECORD +47 -0
  47. fathom_python-0.0.23.dist-info/WHEEL +4 -0
@@ -0,0 +1,512 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+ from json.decoder import JSONDecodeError
5
+
6
+ from .core.api_error import ApiError
7
+ from .core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
8
+ from .core.http_response import AsyncHttpResponse, HttpResponse
9
+ from .core.pydantic_utilities import parse_obj_as
10
+ from .core.request_options import RequestOptions
11
+ from .errors.bad_request_error import BadRequestError
12
+ from .errors.unauthorized_error import UnauthorizedError
13
+ from .types.list_meetings_request_meeting_type import ListMeetingsRequestMeetingType
14
+ from .types.meeting_list_response import MeetingListResponse
15
+ from .types.team_list_response import TeamListResponse
16
+ from .types.team_member_list_response import TeamMemberListResponse
17
+
18
+
19
+ class RawBaseClient:
20
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
21
+ self._client_wrapper = client_wrapper
22
+
23
+ def list_meetings(
24
+ self,
25
+ *,
26
+ recorded_by: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None,
27
+ teams: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None,
28
+ calendar_invitees: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None,
29
+ created_after: typing.Optional[str] = None,
30
+ meeting_type: typing.Optional[ListMeetingsRequestMeetingType] = None,
31
+ include_transcript: typing.Optional[bool] = None,
32
+ cursor: typing.Optional[str] = None,
33
+ request_options: typing.Optional[RequestOptions] = None,
34
+ ) -> HttpResponse[MeetingListResponse]:
35
+ """
36
+ Parameters
37
+ ----------
38
+ recorded_by : typing.Optional[typing.Union[str, typing.Sequence[str]]]
39
+ Email addresses of meeting owners.
40
+
41
+ Pass the parameter once per value, e.g.
42
+ `recorded_by[]=ceo@acme.com&recorded_by[]=pm@acme.com`.
43
+
44
+ Returns meetings hosted by any of the specified users.
45
+
46
+ teams : typing.Optional[typing.Union[str, typing.Sequence[str]]]
47
+ Team names to filter by.
48
+
49
+ Pass the parameter once per value, e.g.
50
+ `teams[]=Sales&teams[]=Engineering`.
51
+
52
+ Returns meetings that belong to any of the specified teams.
53
+
54
+ calendar_invitees : typing.Optional[typing.Union[str, typing.Sequence[str]]]
55
+ Email addresses of calendar_invitees.
56
+
57
+ Pass the parameter once per value, e.g.
58
+ `calendar_invitees[]=cfo@acme.com&calendar_invitees[]=legal@acme.com`.
59
+
60
+ Returns meetings where any of the given email addresses appear
61
+ in the calendar_invitees list.
62
+
63
+ created_after : typing.Optional[str]
64
+ Filter to meetings with created_at after this timestamp, e.g. `created_after=2025-01-01T00:00:00Z`.
65
+
66
+ meeting_type : typing.Optional[ListMeetingsRequestMeetingType]
67
+ Filter by meeting type.
68
+
69
+ include_transcript : typing.Optional[bool]
70
+ Include the transcript for each meeting.
71
+
72
+ cursor : typing.Optional[str]
73
+ Cursor for pagination.
74
+
75
+ request_options : typing.Optional[RequestOptions]
76
+ Request-specific configuration.
77
+
78
+ Returns
79
+ -------
80
+ HttpResponse[MeetingListResponse]
81
+ Paginated list of meetings.
82
+ """
83
+ _response = self._client_wrapper.httpx_client.request(
84
+ "meetings",
85
+ method="GET",
86
+ params={
87
+ "recorded_by[]": recorded_by,
88
+ "teams[]": teams,
89
+ "calendar_invitees[]": calendar_invitees,
90
+ "created_after": created_after,
91
+ "meeting_type": meeting_type,
92
+ "include_transcript": include_transcript,
93
+ "cursor": cursor,
94
+ },
95
+ request_options=request_options,
96
+ )
97
+ try:
98
+ if 200 <= _response.status_code < 300:
99
+ _data = typing.cast(
100
+ MeetingListResponse,
101
+ parse_obj_as(
102
+ type_=MeetingListResponse, # type: ignore
103
+ object_=_response.json(),
104
+ ),
105
+ )
106
+ return HttpResponse(response=_response, data=_data)
107
+ if _response.status_code == 400:
108
+ raise BadRequestError(
109
+ headers=dict(_response.headers),
110
+ body=typing.cast(
111
+ typing.Optional[typing.Any],
112
+ parse_obj_as(
113
+ type_=typing.Optional[typing.Any], # type: ignore
114
+ object_=_response.json(),
115
+ ),
116
+ ),
117
+ )
118
+ if _response.status_code == 401:
119
+ raise UnauthorizedError(
120
+ headers=dict(_response.headers),
121
+ body=typing.cast(
122
+ typing.Optional[typing.Any],
123
+ parse_obj_as(
124
+ type_=typing.Optional[typing.Any], # type: ignore
125
+ object_=_response.json(),
126
+ ),
127
+ ),
128
+ )
129
+ _response_json = _response.json()
130
+ except JSONDecodeError:
131
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
132
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
133
+
134
+ def list_teams(
135
+ self, *, cursor: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
136
+ ) -> HttpResponse[TeamListResponse]:
137
+ """
138
+ Parameters
139
+ ----------
140
+ cursor : typing.Optional[str]
141
+ Cursor for pagination.
142
+
143
+ request_options : typing.Optional[RequestOptions]
144
+ Request-specific configuration.
145
+
146
+ Returns
147
+ -------
148
+ HttpResponse[TeamListResponse]
149
+ Paginated list of teams.
150
+ """
151
+ _response = self._client_wrapper.httpx_client.request(
152
+ "teams",
153
+ method="GET",
154
+ params={
155
+ "cursor": cursor,
156
+ },
157
+ request_options=request_options,
158
+ )
159
+ try:
160
+ if 200 <= _response.status_code < 300:
161
+ _data = typing.cast(
162
+ TeamListResponse,
163
+ parse_obj_as(
164
+ type_=TeamListResponse, # type: ignore
165
+ object_=_response.json(),
166
+ ),
167
+ )
168
+ return HttpResponse(response=_response, data=_data)
169
+ if _response.status_code == 400:
170
+ raise BadRequestError(
171
+ headers=dict(_response.headers),
172
+ body=typing.cast(
173
+ typing.Optional[typing.Any],
174
+ parse_obj_as(
175
+ type_=typing.Optional[typing.Any], # type: ignore
176
+ object_=_response.json(),
177
+ ),
178
+ ),
179
+ )
180
+ if _response.status_code == 401:
181
+ raise UnauthorizedError(
182
+ headers=dict(_response.headers),
183
+ body=typing.cast(
184
+ typing.Optional[typing.Any],
185
+ parse_obj_as(
186
+ type_=typing.Optional[typing.Any], # type: ignore
187
+ object_=_response.json(),
188
+ ),
189
+ ),
190
+ )
191
+ _response_json = _response.json()
192
+ except JSONDecodeError:
193
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
194
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
195
+
196
+ def list_team_members(
197
+ self,
198
+ *,
199
+ team: typing.Optional[str] = None,
200
+ cursor: typing.Optional[str] = None,
201
+ request_options: typing.Optional[RequestOptions] = None,
202
+ ) -> HttpResponse[TeamMemberListResponse]:
203
+ """
204
+ Parameters
205
+ ----------
206
+ team : typing.Optional[str]
207
+ Team name to filter by.
208
+
209
+ cursor : typing.Optional[str]
210
+ Cursor for pagination.
211
+
212
+ request_options : typing.Optional[RequestOptions]
213
+ Request-specific configuration.
214
+
215
+ Returns
216
+ -------
217
+ HttpResponse[TeamMemberListResponse]
218
+ Paginated list of team members.
219
+ """
220
+ _response = self._client_wrapper.httpx_client.request(
221
+ "team_members",
222
+ method="GET",
223
+ params={
224
+ "team": team,
225
+ "cursor": cursor,
226
+ },
227
+ request_options=request_options,
228
+ )
229
+ try:
230
+ if 200 <= _response.status_code < 300:
231
+ _data = typing.cast(
232
+ TeamMemberListResponse,
233
+ parse_obj_as(
234
+ type_=TeamMemberListResponse, # type: ignore
235
+ object_=_response.json(),
236
+ ),
237
+ )
238
+ return HttpResponse(response=_response, data=_data)
239
+ if _response.status_code == 400:
240
+ raise BadRequestError(
241
+ headers=dict(_response.headers),
242
+ body=typing.cast(
243
+ typing.Optional[typing.Any],
244
+ parse_obj_as(
245
+ type_=typing.Optional[typing.Any], # type: ignore
246
+ object_=_response.json(),
247
+ ),
248
+ ),
249
+ )
250
+ if _response.status_code == 401:
251
+ raise UnauthorizedError(
252
+ headers=dict(_response.headers),
253
+ body=typing.cast(
254
+ typing.Optional[typing.Any],
255
+ parse_obj_as(
256
+ type_=typing.Optional[typing.Any], # type: ignore
257
+ object_=_response.json(),
258
+ ),
259
+ ),
260
+ )
261
+ _response_json = _response.json()
262
+ except JSONDecodeError:
263
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
264
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
265
+
266
+
267
+ class AsyncRawBaseClient:
268
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
269
+ self._client_wrapper = client_wrapper
270
+
271
+ async def list_meetings(
272
+ self,
273
+ *,
274
+ recorded_by: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None,
275
+ teams: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None,
276
+ calendar_invitees: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None,
277
+ created_after: typing.Optional[str] = None,
278
+ meeting_type: typing.Optional[ListMeetingsRequestMeetingType] = None,
279
+ include_transcript: typing.Optional[bool] = None,
280
+ cursor: typing.Optional[str] = None,
281
+ request_options: typing.Optional[RequestOptions] = None,
282
+ ) -> AsyncHttpResponse[MeetingListResponse]:
283
+ """
284
+ Parameters
285
+ ----------
286
+ recorded_by : typing.Optional[typing.Union[str, typing.Sequence[str]]]
287
+ Email addresses of meeting owners.
288
+
289
+ Pass the parameter once per value, e.g.
290
+ `recorded_by[]=ceo@acme.com&recorded_by[]=pm@acme.com`.
291
+
292
+ Returns meetings hosted by any of the specified users.
293
+
294
+ teams : typing.Optional[typing.Union[str, typing.Sequence[str]]]
295
+ Team names to filter by.
296
+
297
+ Pass the parameter once per value, e.g.
298
+ `teams[]=Sales&teams[]=Engineering`.
299
+
300
+ Returns meetings that belong to any of the specified teams.
301
+
302
+ calendar_invitees : typing.Optional[typing.Union[str, typing.Sequence[str]]]
303
+ Email addresses of calendar_invitees.
304
+
305
+ Pass the parameter once per value, e.g.
306
+ `calendar_invitees[]=cfo@acme.com&calendar_invitees[]=legal@acme.com`.
307
+
308
+ Returns meetings where any of the given email addresses appear
309
+ in the calendar_invitees list.
310
+
311
+ created_after : typing.Optional[str]
312
+ Filter to meetings with created_at after this timestamp, e.g. `created_after=2025-01-01T00:00:00Z`.
313
+
314
+ meeting_type : typing.Optional[ListMeetingsRequestMeetingType]
315
+ Filter by meeting type.
316
+
317
+ include_transcript : typing.Optional[bool]
318
+ Include the transcript for each meeting.
319
+
320
+ cursor : typing.Optional[str]
321
+ Cursor for pagination.
322
+
323
+ request_options : typing.Optional[RequestOptions]
324
+ Request-specific configuration.
325
+
326
+ Returns
327
+ -------
328
+ AsyncHttpResponse[MeetingListResponse]
329
+ Paginated list of meetings.
330
+ """
331
+ _response = await self._client_wrapper.httpx_client.request(
332
+ "meetings",
333
+ method="GET",
334
+ params={
335
+ "recorded_by[]": recorded_by,
336
+ "teams[]": teams,
337
+ "calendar_invitees[]": calendar_invitees,
338
+ "created_after": created_after,
339
+ "meeting_type": meeting_type,
340
+ "include_transcript": include_transcript,
341
+ "cursor": cursor,
342
+ },
343
+ request_options=request_options,
344
+ )
345
+ try:
346
+ if 200 <= _response.status_code < 300:
347
+ _data = typing.cast(
348
+ MeetingListResponse,
349
+ parse_obj_as(
350
+ type_=MeetingListResponse, # type: ignore
351
+ object_=_response.json(),
352
+ ),
353
+ )
354
+ return AsyncHttpResponse(response=_response, data=_data)
355
+ if _response.status_code == 400:
356
+ raise BadRequestError(
357
+ headers=dict(_response.headers),
358
+ body=typing.cast(
359
+ typing.Optional[typing.Any],
360
+ parse_obj_as(
361
+ type_=typing.Optional[typing.Any], # type: ignore
362
+ object_=_response.json(),
363
+ ),
364
+ ),
365
+ )
366
+ if _response.status_code == 401:
367
+ raise UnauthorizedError(
368
+ headers=dict(_response.headers),
369
+ body=typing.cast(
370
+ typing.Optional[typing.Any],
371
+ parse_obj_as(
372
+ type_=typing.Optional[typing.Any], # type: ignore
373
+ object_=_response.json(),
374
+ ),
375
+ ),
376
+ )
377
+ _response_json = _response.json()
378
+ except JSONDecodeError:
379
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
380
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
381
+
382
+ async def list_teams(
383
+ self, *, cursor: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None
384
+ ) -> AsyncHttpResponse[TeamListResponse]:
385
+ """
386
+ Parameters
387
+ ----------
388
+ cursor : typing.Optional[str]
389
+ Cursor for pagination.
390
+
391
+ request_options : typing.Optional[RequestOptions]
392
+ Request-specific configuration.
393
+
394
+ Returns
395
+ -------
396
+ AsyncHttpResponse[TeamListResponse]
397
+ Paginated list of teams.
398
+ """
399
+ _response = await self._client_wrapper.httpx_client.request(
400
+ "teams",
401
+ method="GET",
402
+ params={
403
+ "cursor": cursor,
404
+ },
405
+ request_options=request_options,
406
+ )
407
+ try:
408
+ if 200 <= _response.status_code < 300:
409
+ _data = typing.cast(
410
+ TeamListResponse,
411
+ parse_obj_as(
412
+ type_=TeamListResponse, # type: ignore
413
+ object_=_response.json(),
414
+ ),
415
+ )
416
+ return AsyncHttpResponse(response=_response, data=_data)
417
+ if _response.status_code == 400:
418
+ raise BadRequestError(
419
+ headers=dict(_response.headers),
420
+ body=typing.cast(
421
+ typing.Optional[typing.Any],
422
+ parse_obj_as(
423
+ type_=typing.Optional[typing.Any], # type: ignore
424
+ object_=_response.json(),
425
+ ),
426
+ ),
427
+ )
428
+ if _response.status_code == 401:
429
+ raise UnauthorizedError(
430
+ headers=dict(_response.headers),
431
+ body=typing.cast(
432
+ typing.Optional[typing.Any],
433
+ parse_obj_as(
434
+ type_=typing.Optional[typing.Any], # type: ignore
435
+ object_=_response.json(),
436
+ ),
437
+ ),
438
+ )
439
+ _response_json = _response.json()
440
+ except JSONDecodeError:
441
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
442
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
443
+
444
+ async def list_team_members(
445
+ self,
446
+ *,
447
+ team: typing.Optional[str] = None,
448
+ cursor: typing.Optional[str] = None,
449
+ request_options: typing.Optional[RequestOptions] = None,
450
+ ) -> AsyncHttpResponse[TeamMemberListResponse]:
451
+ """
452
+ Parameters
453
+ ----------
454
+ team : typing.Optional[str]
455
+ Team name to filter by.
456
+
457
+ cursor : typing.Optional[str]
458
+ Cursor for pagination.
459
+
460
+ request_options : typing.Optional[RequestOptions]
461
+ Request-specific configuration.
462
+
463
+ Returns
464
+ -------
465
+ AsyncHttpResponse[TeamMemberListResponse]
466
+ Paginated list of team members.
467
+ """
468
+ _response = await self._client_wrapper.httpx_client.request(
469
+ "team_members",
470
+ method="GET",
471
+ params={
472
+ "team": team,
473
+ "cursor": cursor,
474
+ },
475
+ request_options=request_options,
476
+ )
477
+ try:
478
+ if 200 <= _response.status_code < 300:
479
+ _data = typing.cast(
480
+ TeamMemberListResponse,
481
+ parse_obj_as(
482
+ type_=TeamMemberListResponse, # type: ignore
483
+ object_=_response.json(),
484
+ ),
485
+ )
486
+ return AsyncHttpResponse(response=_response, data=_data)
487
+ if _response.status_code == 400:
488
+ raise BadRequestError(
489
+ headers=dict(_response.headers),
490
+ body=typing.cast(
491
+ typing.Optional[typing.Any],
492
+ parse_obj_as(
493
+ type_=typing.Optional[typing.Any], # type: ignore
494
+ object_=_response.json(),
495
+ ),
496
+ ),
497
+ )
498
+ if _response.status_code == 401:
499
+ raise UnauthorizedError(
500
+ headers=dict(_response.headers),
501
+ body=typing.cast(
502
+ typing.Optional[typing.Any],
503
+ parse_obj_as(
504
+ type_=typing.Optional[typing.Any], # type: ignore
505
+ object_=_response.json(),
506
+ ),
507
+ ),
508
+ )
509
+ _response_json = _response.json()
510
+ except JSONDecodeError:
511
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
512
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
@@ -0,0 +1,45 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ # isort: skip_file
4
+
5
+ from .action_item import ActionItem
6
+ from .assignee import Assignee
7
+ from .crm_company_match import CrmCompanyMatch
8
+ from .crm_contact_match import CrmContactMatch
9
+ from .crm_deal_match import CrmDealMatch
10
+ from .crm_matches import CrmMatches
11
+ from .fathom_user import FathomUser
12
+ from .invitee import Invitee
13
+ from .list_meetings_request_meeting_type import ListMeetingsRequestMeetingType
14
+ from .meeting import Meeting
15
+ from .meeting_list_response import MeetingListResponse
16
+ from .meeting_meeting_type import MeetingMeetingType
17
+ from .meeting_summary import MeetingSummary
18
+ from .team import Team
19
+ from .team_list_response import TeamListResponse
20
+ from .team_member import TeamMember
21
+ from .team_member_list_response import TeamMemberListResponse
22
+ from .transcript_item import TranscriptItem
23
+ from .transcript_item_speaker import TranscriptItemSpeaker
24
+
25
+ __all__ = [
26
+ "ActionItem",
27
+ "Assignee",
28
+ "CrmCompanyMatch",
29
+ "CrmContactMatch",
30
+ "CrmDealMatch",
31
+ "CrmMatches",
32
+ "FathomUser",
33
+ "Invitee",
34
+ "ListMeetingsRequestMeetingType",
35
+ "Meeting",
36
+ "MeetingListResponse",
37
+ "MeetingMeetingType",
38
+ "MeetingSummary",
39
+ "Team",
40
+ "TeamListResponse",
41
+ "TeamMember",
42
+ "TeamMemberListResponse",
43
+ "TranscriptItem",
44
+ "TranscriptItemSpeaker",
45
+ ]
@@ -0,0 +1,29 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ import pydantic
6
+ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
7
+ from .assignee import Assignee
8
+
9
+
10
+ class ActionItem(UniversalBaseModel):
11
+ description: str
12
+ user_generated: bool
13
+ completed: bool
14
+ recording_timestamp: str = pydantic.Field()
15
+ """
16
+ Timestamp relative to the start of the recording (HH:MM:SS).
17
+ """
18
+
19
+ recording_playback_url: str
20
+ assignee: Assignee
21
+
22
+ if IS_PYDANTIC_V2:
23
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
24
+ else:
25
+
26
+ class Config:
27
+ frozen = True
28
+ smart_union = True
29
+ extra = pydantic.Extra.allow
@@ -0,0 +1,21 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ import pydantic
6
+ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
7
+
8
+
9
+ class Assignee(UniversalBaseModel):
10
+ name: str
11
+ email: str
12
+ team: str
13
+
14
+ if IS_PYDANTIC_V2:
15
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
16
+ else:
17
+
18
+ class Config:
19
+ frozen = True
20
+ smart_union = True
21
+ extra = pydantic.Extra.allow
@@ -0,0 +1,20 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ import pydantic
6
+ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
7
+
8
+
9
+ class CrmCompanyMatch(UniversalBaseModel):
10
+ name: str
11
+ record_url: str
12
+
13
+ if IS_PYDANTIC_V2:
14
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
15
+ else:
16
+
17
+ class Config:
18
+ frozen = True
19
+ smart_union = True
20
+ extra = pydantic.Extra.allow
@@ -0,0 +1,21 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ import pydantic
6
+ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
7
+
8
+
9
+ class CrmContactMatch(UniversalBaseModel):
10
+ name: str
11
+ email: str
12
+ record_url: str
13
+
14
+ if IS_PYDANTIC_V2:
15
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
16
+ else:
17
+
18
+ class Config:
19
+ frozen = True
20
+ smart_union = True
21
+ extra = pydantic.Extra.allow
@@ -0,0 +1,21 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ import pydantic
6
+ from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
7
+
8
+
9
+ class CrmDealMatch(UniversalBaseModel):
10
+ name: str
11
+ amount: int
12
+ record_url: str
13
+
14
+ if IS_PYDANTIC_V2:
15
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
16
+ else:
17
+
18
+ class Config:
19
+ frozen = True
20
+ smart_union = True
21
+ extra = pydantic.Extra.allow