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.
- fathom/__init__.py +57 -0
- fathom/base_client.py +453 -0
- fathom/client.py +25 -0
- fathom/core/__init__.py +52 -0
- fathom/core/api_error.py +23 -0
- fathom/core/client_wrapper.py +76 -0
- fathom/core/datetime_utils.py +28 -0
- fathom/core/file.py +67 -0
- fathom/core/force_multipart.py +16 -0
- fathom/core/http_client.py +543 -0
- fathom/core/http_response.py +55 -0
- fathom/core/jsonable_encoder.py +100 -0
- fathom/core/pydantic_utilities.py +255 -0
- fathom/core/query_encoder.py +58 -0
- fathom/core/remove_none_from_dict.py +11 -0
- fathom/core/request_options.py +35 -0
- fathom/core/serialization.py +276 -0
- fathom/environment.py +7 -0
- fathom/errors/__init__.py +8 -0
- fathom/errors/bad_request_error.py +10 -0
- fathom/errors/unauthorized_error.py +10 -0
- fathom/py.typed +0 -0
- fathom/raw_base_client.py +512 -0
- fathom/types/__init__.py +45 -0
- fathom/types/action_item.py +29 -0
- fathom/types/assignee.py +21 -0
- fathom/types/crm_company_match.py +20 -0
- fathom/types/crm_contact_match.py +21 -0
- fathom/types/crm_deal_match.py +21 -0
- fathom/types/crm_matches.py +30 -0
- fathom/types/fathom_user.py +21 -0
- fathom/types/invitee.py +22 -0
- fathom/types/list_meetings_request_meeting_type.py +5 -0
- fathom/types/meeting.py +51 -0
- fathom/types/meeting_list_response.py +22 -0
- fathom/types/meeting_meeting_type.py +5 -0
- fathom/types/meeting_summary.py +20 -0
- fathom/types/team.py +21 -0
- fathom/types/team_list_response.py +22 -0
- fathom/types/team_member.py +22 -0
- fathom/types/team_member_list_response.py +22 -0
- fathom/types/transcript_item.py +25 -0
- fathom/types/transcript_item_speaker.py +20 -0
- fathom/version.py +3 -0
- fathom_python-0.0.23.dist-info/METADATA +151 -0
- fathom_python-0.0.23.dist-info/RECORD +47 -0
- 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)
|
fathom/types/__init__.py
ADDED
|
@@ -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
|
fathom/types/assignee.py
ADDED
|
@@ -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
|