fathom-python 0.0.36__py3-none-any.whl → 0.0.38__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_python/_version.py CHANGED
@@ -3,10 +3,10 @@
3
3
  import importlib.metadata
4
4
 
5
5
  __title__: str = "fathom-python"
6
- __version__: str = "0.0.36"
6
+ __version__: str = "0.0.38"
7
7
  __openapi_doc_version__: str = "1.0.0"
8
- __gen_version__: str = "2.723.8"
9
- __user_agent__: str = "speakeasy-sdk/python 0.0.36 2.723.8 1.0.0 fathom-python"
8
+ __gen_version__: str = "2.762.0"
9
+ __user_agent__: str = "speakeasy-sdk/python 0.0.38 2.762.0 1.0.0 fathom-python"
10
10
 
11
11
  try:
12
12
  if __package__ is not None:
@@ -9,7 +9,7 @@ from fathom_python.errors import FathomError
9
9
  MAX_MESSAGE_LEN = 10_000
10
10
 
11
11
 
12
- @dataclass(frozen=True)
12
+ @dataclass(unsafe_hash=True)
13
13
  class APIError(FathomError):
14
14
  """The fallback error class if no more specific error class is matched."""
15
15
 
@@ -5,7 +5,7 @@ from typing import Optional
5
5
  from dataclasses import dataclass, field
6
6
 
7
7
 
8
- @dataclass(frozen=True)
8
+ @dataclass(unsafe_hash=True)
9
9
  class FathomError(Exception):
10
10
  """The base class for all HTTP error responses."""
11
11
 
@@ -3,7 +3,7 @@
3
3
  from dataclasses import dataclass
4
4
 
5
5
 
6
- @dataclass(frozen=True)
6
+ @dataclass(unsafe_hash=True)
7
7
  class NoResponseError(Exception):
8
8
  """Error raised when no HTTP response is received from the server."""
9
9
 
@@ -7,7 +7,7 @@ from dataclasses import dataclass
7
7
  from fathom_python.errors import FathomError
8
8
 
9
9
 
10
- @dataclass(frozen=True)
10
+ @dataclass(unsafe_hash=True)
11
11
  class ResponseValidationError(FathomError):
12
12
  """Error raised when there is a type mismatch between the response data and the expected Pydantic model."""
13
13
 
@@ -43,7 +43,12 @@ if TYPE_CHECKING:
43
43
  ListMeetingsRequestTypedDict,
44
44
  ListMeetingsResponse,
45
45
  ListMeetingsResponseTypedDict,
46
- MeetingType,
46
+ )
47
+ from .listmeetingtypesop import (
48
+ ListMeetingTypesRequest,
49
+ ListMeetingTypesRequestTypedDict,
50
+ ListMeetingTypesResponse,
51
+ ListMeetingTypesResponseTypedDict,
47
52
  )
48
53
  from .listteammembersop import (
49
54
  ListTeamMembersRequest,
@@ -60,6 +65,11 @@ if TYPE_CHECKING:
60
65
  from .meeting import CalendarInviteesDomainsType, Meeting, MeetingTypedDict
61
66
  from .meetinglistresponse import MeetingListResponse, MeetingListResponseTypedDict
62
67
  from .meetingsummary import MeetingSummary, MeetingSummaryTypedDict
68
+ from .meetingtype import MeetingType, MeetingTypeTypedDict, Status
69
+ from .meetingtypelistresponse import (
70
+ MeetingTypeListResponse,
71
+ MeetingTypeListResponseTypedDict,
72
+ )
63
73
  from .security import Security, SecurityTypedDict
64
74
  from .team import Team, TeamTypedDict
65
75
  from .teamlistresponse import TeamListResponse, TeamListResponseTypedDict
@@ -112,6 +122,10 @@ __all__ = [
112
122
  "GetRecordingTranscriptResponseTypedDict",
113
123
  "Invitee",
114
124
  "InviteeTypedDict",
125
+ "ListMeetingTypesRequest",
126
+ "ListMeetingTypesRequestTypedDict",
127
+ "ListMeetingTypesResponse",
128
+ "ListMeetingTypesResponseTypedDict",
115
129
  "ListMeetingsCalendarInviteesDomainsType",
116
130
  "ListMeetingsRequest",
117
131
  "ListMeetingsRequestTypedDict",
@@ -131,9 +145,13 @@ __all__ = [
131
145
  "MeetingSummary",
132
146
  "MeetingSummaryTypedDict",
133
147
  "MeetingType",
148
+ "MeetingTypeListResponse",
149
+ "MeetingTypeListResponseTypedDict",
150
+ "MeetingTypeTypedDict",
134
151
  "MeetingTypedDict",
135
152
  "Security",
136
153
  "SecurityTypedDict",
154
+ "Status",
137
155
  "Team",
138
156
  "TeamListResponse",
139
157
  "TeamListResponseTypedDict",
@@ -192,7 +210,10 @@ _dynamic_imports: dict[str, str] = {
192
210
  "ListMeetingsRequestTypedDict": ".listmeetingsop",
193
211
  "ListMeetingsResponse": ".listmeetingsop",
194
212
  "ListMeetingsResponseTypedDict": ".listmeetingsop",
195
- "MeetingType": ".listmeetingsop",
213
+ "ListMeetingTypesRequest": ".listmeetingtypesop",
214
+ "ListMeetingTypesRequestTypedDict": ".listmeetingtypesop",
215
+ "ListMeetingTypesResponse": ".listmeetingtypesop",
216
+ "ListMeetingTypesResponseTypedDict": ".listmeetingtypesop",
196
217
  "ListTeamMembersRequest": ".listteammembersop",
197
218
  "ListTeamMembersRequestTypedDict": ".listteammembersop",
198
219
  "ListTeamMembersResponse": ".listteammembersop",
@@ -208,6 +229,11 @@ _dynamic_imports: dict[str, str] = {
208
229
  "MeetingListResponseTypedDict": ".meetinglistresponse",
209
230
  "MeetingSummary": ".meetingsummary",
210
231
  "MeetingSummaryTypedDict": ".meetingsummary",
232
+ "MeetingType": ".meetingtype",
233
+ "MeetingTypeTypedDict": ".meetingtype",
234
+ "Status": ".meetingtype",
235
+ "MeetingTypeListResponse": ".meetingtypelistresponse",
236
+ "MeetingTypeListResponseTypedDict": ".meetingtypelistresponse",
211
237
  "Security": ".security",
212
238
  "SecurityTypedDict": ".security",
213
239
  "Team": ".team",
@@ -18,25 +18,7 @@ class ListMeetingsCalendarInviteesDomainsType(str, Enum):
18
18
  ONE_OR_MORE_EXTERNAL = "one_or_more_external"
19
19
 
20
20
 
21
- class MeetingType(str, Enum):
22
- r"""Filter by meeting type."""
23
-
24
- ALL = "all"
25
- INTERNAL = "internal"
26
- EXTERNAL = "external"
27
-
28
-
29
21
  class ListMeetingsRequestTypedDict(TypedDict):
30
- calendar_invitees: NotRequired[List[str]]
31
- r"""Email address of calendar_invitees to filter by.
32
-
33
- Pass the parameter once per value, e.g.
34
- `calendar_invitees[]=cfo@acme.com&calendar_invitees[]=legal@acme.com`.
35
-
36
- Returns meetings where any of the given email addresses appear
37
- in the calendar_invitees list.
38
-
39
- """
40
22
  calendar_invitees_domains: NotRequired[List[str]]
41
23
  r"""Domains of the companies to filter by. Exact match.
42
24
 
@@ -62,8 +44,12 @@ class ListMeetingsRequestTypedDict(TypedDict):
62
44
  r"""Include the summary for each meeting. Unavailable for OAuth connected apps (use /recordings instead)."""
63
45
  include_transcript: NotRequired[bool]
64
46
  r"""Include the transcript for each meeting. Unavailable for OAuth connected apps (use /recordings instead)."""
65
- meeting_type: NotRequired[MeetingType]
66
- r"""Filter by meeting type."""
47
+ meeting_type: NotRequired[str]
48
+ r"""Filter by meeting type name.
49
+
50
+ Returns only meetings assigned the meeting type with this name. Use /meeting_types to discover valid values. An unknown or non-matching name returns an empty list.
51
+
52
+ """
67
53
  recorded_by: NotRequired[List[str]]
68
54
  r"""Email addresses of users who recorded meetings.
69
55
 
@@ -85,21 +71,6 @@ class ListMeetingsRequestTypedDict(TypedDict):
85
71
 
86
72
 
87
73
  class ListMeetingsRequest(BaseModel):
88
- calendar_invitees: Annotated[
89
- Optional[List[str]],
90
- pydantic.Field(alias="calendar_invitees[]"),
91
- FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
92
- ] = None
93
- r"""Email address of calendar_invitees to filter by.
94
-
95
- Pass the parameter once per value, e.g.
96
- `calendar_invitees[]=cfo@acme.com&calendar_invitees[]=legal@acme.com`.
97
-
98
- Returns meetings where any of the given email addresses appear
99
- in the calendar_invitees list.
100
-
101
- """
102
-
103
74
  calendar_invitees_domains: Annotated[
104
75
  Optional[List[str]],
105
76
  pydantic.Field(alias="calendar_invitees_domains[]"),
@@ -163,13 +134,14 @@ class ListMeetingsRequest(BaseModel):
163
134
  r"""Include the transcript for each meeting. Unavailable for OAuth connected apps (use /recordings instead)."""
164
135
 
165
136
  meeting_type: Annotated[
166
- Optional[MeetingType],
167
- pydantic.Field(
168
- deprecated="warning: ** DEPRECATED ** - This will be removed in a future release, please migrate away from it as soon as possible."
169
- ),
137
+ Optional[str],
170
138
  FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
171
139
  ] = None
172
- r"""Filter by meeting type."""
140
+ r"""Filter by meeting type name.
141
+
142
+ Returns only meetings assigned the meeting type with this name. Use /meeting_types to discover valid values. An unknown or non-matching name returns an empty list.
143
+
144
+ """
173
145
 
174
146
  recorded_by: Annotated[
175
147
  Optional[List[str]],
@@ -0,0 +1,34 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+
3
+ from __future__ import annotations
4
+ from .meetingtypelistresponse import (
5
+ MeetingTypeListResponse,
6
+ MeetingTypeListResponseTypedDict,
7
+ )
8
+ from fathom_python.types import BaseModel
9
+ from fathom_python.utils import FieldMetadata, QueryParamMetadata
10
+ from typing import Callable, Optional
11
+ from typing_extensions import Annotated, NotRequired, TypedDict
12
+
13
+
14
+ class ListMeetingTypesRequestTypedDict(TypedDict):
15
+ cursor: NotRequired[str]
16
+ r"""Cursor for pagination."""
17
+
18
+
19
+ class ListMeetingTypesRequest(BaseModel):
20
+ cursor: Annotated[
21
+ Optional[str],
22
+ FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
23
+ ] = None
24
+ r"""Cursor for pagination."""
25
+
26
+
27
+ class ListMeetingTypesResponseTypedDict(TypedDict):
28
+ result: MeetingTypeListResponseTypedDict
29
+
30
+
31
+ class ListMeetingTypesResponse(BaseModel):
32
+ next: Callable[[], Optional[ListMeetingTypesResponse]]
33
+
34
+ result: MeetingTypeListResponse
@@ -30,6 +30,8 @@ class MeetingTypedDict(TypedDict):
30
30
  title: str
31
31
  meeting_title: Nullable[str]
32
32
  r"""Calendar event title."""
33
+ meeting_type: Nullable[str]
34
+ r"""The name of the meeting type assigned to this meeting, or `null` if none is assigned."""
33
35
  recording_id: int
34
36
  r"""The ID of the meeting recording."""
35
37
  url: str
@@ -59,6 +61,9 @@ class Meeting(BaseModel):
59
61
  meeting_title: Nullable[str]
60
62
  r"""Calendar event title."""
61
63
 
64
+ meeting_type: Nullable[str]
65
+ r"""The name of the meeting type assigned to this meeting, or `null` if none is assigned."""
66
+
62
67
  recording_id: int
63
68
  r"""The ID of the meeting recording."""
64
69
 
@@ -106,6 +111,7 @@ class Meeting(BaseModel):
106
111
  ]
107
112
  nullable_fields = [
108
113
  "meeting_title",
114
+ "meeting_type",
109
115
  "transcript",
110
116
  "default_summary",
111
117
  "action_items",
@@ -0,0 +1,34 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+
3
+ from __future__ import annotations
4
+ from datetime import datetime
5
+ from enum import Enum
6
+ from fathom_python.types import BaseModel
7
+ from typing_extensions import TypedDict
8
+
9
+
10
+ class Status(str, Enum):
11
+ r"""Whether the meeting type is currently assignable. `active` types can be assigned to meetings going forward; `inactive` types are no longer assigned going forward but may still appear on historical meetings."""
12
+
13
+ ACTIVE = "active"
14
+ INACTIVE = "inactive"
15
+
16
+
17
+ class MeetingTypeTypedDict(TypedDict):
18
+ name: str
19
+ status: Status
20
+ r"""Whether the meeting type is currently assignable. `active` types can be assigned to meetings going forward; `inactive` types are no longer assigned going forward but may still appear on historical meetings.
21
+
22
+ """
23
+ created_at: datetime
24
+
25
+
26
+ class MeetingType(BaseModel):
27
+ name: str
28
+
29
+ status: Status
30
+ r"""Whether the meeting type is currently assignable. `active` types can be assigned to meetings going forward; `inactive` types are no longer assigned going forward but may still appear on historical meetings.
31
+
32
+ """
33
+
34
+ created_at: datetime
@@ -0,0 +1,52 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+
3
+ from __future__ import annotations
4
+ from .meetingtype import MeetingType, MeetingTypeTypedDict
5
+ from fathom_python.types import BaseModel, Nullable, UNSET_SENTINEL
6
+ from pydantic import model_serializer
7
+ from typing import List
8
+ from typing_extensions import TypedDict
9
+
10
+
11
+ class MeetingTypeListResponseTypedDict(TypedDict):
12
+ limit: Nullable[int]
13
+ next_cursor: Nullable[str]
14
+ items: List[MeetingTypeTypedDict]
15
+
16
+
17
+ class MeetingTypeListResponse(BaseModel):
18
+ limit: Nullable[int]
19
+
20
+ next_cursor: Nullable[str]
21
+
22
+ items: List[MeetingType]
23
+
24
+ @model_serializer(mode="wrap")
25
+ def serialize_model(self, handler):
26
+ optional_fields = []
27
+ nullable_fields = ["limit", "next_cursor"]
28
+ null_default_fields = []
29
+
30
+ serialized = handler(self)
31
+
32
+ m = {}
33
+
34
+ for n, f in type(self).model_fields.items():
35
+ k = f.alias or n
36
+ val = serialized.get(k)
37
+ serialized.pop(k, None)
38
+
39
+ optional_nullable = k in optional_fields and k in nullable_fields
40
+ is_set = (
41
+ self.__pydantic_fields_set__.intersection({n})
42
+ or k in null_default_fields
43
+ ) # pylint: disable=no-member
44
+
45
+ if val is not None and val != UNSET_SENTINEL:
46
+ m[k] = val
47
+ elif val != UNSET_SENTINEL and (
48
+ not k in optional_fields or (optional_nullable and is_set)
49
+ ):
50
+ m[k] = val
51
+
52
+ return m
fathom_python/sdk.py CHANGED
@@ -266,7 +266,6 @@ class Fathom(BaseSDK):
266
266
  def list_meetings(
267
267
  self,
268
268
  *,
269
- calendar_invitees: Optional[List[str]] = None,
270
269
  calendar_invitees_domains: Optional[List[str]] = None,
271
270
  calendar_invitees_domains_type: Optional[
272
271
  models.ListMeetingsCalendarInviteesDomainsType
@@ -278,7 +277,7 @@ class Fathom(BaseSDK):
278
277
  include_crm_matches: Optional[bool] = False,
279
278
  include_summary: Optional[bool] = False,
280
279
  include_transcript: Optional[bool] = False,
281
- meeting_type: Optional[models.MeetingType] = None,
280
+ meeting_type: Optional[str] = None,
282
281
  recorded_by: Optional[List[str]] = None,
283
282
  teams: Optional[List[str]] = None,
284
283
  retries: OptionalNullable[utils.RetryConfig] = UNSET,
@@ -288,8 +287,13 @@ class Fathom(BaseSDK):
288
287
  ) -> Optional[models.ListMeetingsResponse]:
289
288
  r"""List meetings
290
289
 
291
- :param calendar_invitees: Email address of calendar_invitees to filter by. Pass the parameter once per value, e.g. `calendar_invitees[]=cfo@acme.com&calendar_invitees[]=legal@acme.com`. Returns meetings where any of the given email addresses appear in the calendar_invitees list.
292
- :param calendar_invitees_domains: Domains of the companies to filter by. Exact match. Pass the parameter once per value, e.g. `calendar_invitees_domains[]=acme.com&calendar_invitees_domains[]=client.com`. Returns meetings where any of the given company domains appear in the meeting.
290
+ :param calendar_invitees_domains: Domains of the companies to filter by. Exact match.
291
+
292
+ Pass the parameter once per value, e.g.
293
+ `calendar_invitees_domains[]=acme.com&calendar_invitees_domains[]=client.com`.
294
+
295
+ Returns meetings where any of the given company domains appear in the meeting.
296
+
293
297
  :param calendar_invitees_domains_type: Filter by whether calendar invitee list includes external email domains.
294
298
  :param created_after: Filter to meetings with created_at after this timestamp, e.g. `created_after=2025-01-01T00:00:00Z`.
295
299
  :param created_before: Filter to meetings with created_at before this timestamp, e.g. `created_before=2025-01-01T00:00:00Z`.
@@ -298,9 +302,24 @@ class Fathom(BaseSDK):
298
302
  :param include_crm_matches: Include CRM matches for each meeting. Only returns data from your or your team's linked CRM.
299
303
  :param include_summary: Include the summary for each meeting. Unavailable for OAuth connected apps (use /recordings instead).
300
304
  :param include_transcript: Include the transcript for each meeting. Unavailable for OAuth connected apps (use /recordings instead).
301
- :param meeting_type: Filter by meeting type.
302
- :param recorded_by: Email addresses of users who recorded meetings. Pass the parameter once per value, e.g. `recorded_by[]=ceo@acme.com&recorded_by[]=pm@acme.com`. Returns meetings recorded by any of the specified users.
303
- :param teams: Team names to filter by. Pass the parameter once per value, e.g. `teams[]=Sales&teams[]=Engineering`. Returns meetings that belong to any of the specified teams.
305
+ :param meeting_type: Filter by meeting type name.
306
+
307
+ Returns only meetings assigned the meeting type with this name. Use /meeting_types to discover valid values. An unknown or non-matching name returns an empty list.
308
+
309
+ :param recorded_by: Email addresses of users who recorded meetings.
310
+
311
+ Pass the parameter once per value, e.g.
312
+ `recorded_by[]=ceo@acme.com&recorded_by[]=pm@acme.com`.
313
+
314
+ Returns meetings recorded by any of the specified users.
315
+
316
+ :param teams: Team names to filter by.
317
+
318
+ Pass the parameter once per value, e.g.
319
+ `teams[]=Sales&teams[]=Engineering`.
320
+
321
+ Returns meetings that belong to any of the specified teams.
322
+
304
323
  :param retries: Override the default retry configuration for this method
305
324
  :param server_url: Override the default server URL for this method
306
325
  :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
@@ -317,7 +336,6 @@ class Fathom(BaseSDK):
317
336
  base_url = self._get_url(base_url, url_variables)
318
337
 
319
338
  request = models.ListMeetingsRequest(
320
- calendar_invitees=calendar_invitees,
321
339
  calendar_invitees_domains=calendar_invitees_domains,
322
340
  calendar_invitees_domains_type=calendar_invitees_domains_type,
323
341
  created_after=created_after,
@@ -383,7 +401,6 @@ class Fathom(BaseSDK):
383
401
  return None
384
402
 
385
403
  return self.list_meetings(
386
- calendar_invitees=calendar_invitees,
387
404
  calendar_invitees_domains=calendar_invitees_domains,
388
405
  calendar_invitees_domains_type=calendar_invitees_domains_type,
389
406
  created_after=created_after,
@@ -416,7 +433,6 @@ class Fathom(BaseSDK):
416
433
  async def list_meetings_async(
417
434
  self,
418
435
  *,
419
- calendar_invitees: Optional[List[str]] = None,
420
436
  calendar_invitees_domains: Optional[List[str]] = None,
421
437
  calendar_invitees_domains_type: Optional[
422
438
  models.ListMeetingsCalendarInviteesDomainsType
@@ -428,7 +444,7 @@ class Fathom(BaseSDK):
428
444
  include_crm_matches: Optional[bool] = False,
429
445
  include_summary: Optional[bool] = False,
430
446
  include_transcript: Optional[bool] = False,
431
- meeting_type: Optional[models.MeetingType] = None,
447
+ meeting_type: Optional[str] = None,
432
448
  recorded_by: Optional[List[str]] = None,
433
449
  teams: Optional[List[str]] = None,
434
450
  retries: OptionalNullable[utils.RetryConfig] = UNSET,
@@ -438,8 +454,13 @@ class Fathom(BaseSDK):
438
454
  ) -> Optional[models.ListMeetingsResponse]:
439
455
  r"""List meetings
440
456
 
441
- :param calendar_invitees: Email address of calendar_invitees to filter by. Pass the parameter once per value, e.g. `calendar_invitees[]=cfo@acme.com&calendar_invitees[]=legal@acme.com`. Returns meetings where any of the given email addresses appear in the calendar_invitees list.
442
- :param calendar_invitees_domains: Domains of the companies to filter by. Exact match. Pass the parameter once per value, e.g. `calendar_invitees_domains[]=acme.com&calendar_invitees_domains[]=client.com`. Returns meetings where any of the given company domains appear in the meeting.
457
+ :param calendar_invitees_domains: Domains of the companies to filter by. Exact match.
458
+
459
+ Pass the parameter once per value, e.g.
460
+ `calendar_invitees_domains[]=acme.com&calendar_invitees_domains[]=client.com`.
461
+
462
+ Returns meetings where any of the given company domains appear in the meeting.
463
+
443
464
  :param calendar_invitees_domains_type: Filter by whether calendar invitee list includes external email domains.
444
465
  :param created_after: Filter to meetings with created_at after this timestamp, e.g. `created_after=2025-01-01T00:00:00Z`.
445
466
  :param created_before: Filter to meetings with created_at before this timestamp, e.g. `created_before=2025-01-01T00:00:00Z`.
@@ -448,9 +469,24 @@ class Fathom(BaseSDK):
448
469
  :param include_crm_matches: Include CRM matches for each meeting. Only returns data from your or your team's linked CRM.
449
470
  :param include_summary: Include the summary for each meeting. Unavailable for OAuth connected apps (use /recordings instead).
450
471
  :param include_transcript: Include the transcript for each meeting. Unavailable for OAuth connected apps (use /recordings instead).
451
- :param meeting_type: Filter by meeting type.
452
- :param recorded_by: Email addresses of users who recorded meetings. Pass the parameter once per value, e.g. `recorded_by[]=ceo@acme.com&recorded_by[]=pm@acme.com`. Returns meetings recorded by any of the specified users.
453
- :param teams: Team names to filter by. Pass the parameter once per value, e.g. `teams[]=Sales&teams[]=Engineering`. Returns meetings that belong to any of the specified teams.
472
+ :param meeting_type: Filter by meeting type name.
473
+
474
+ Returns only meetings assigned the meeting type with this name. Use /meeting_types to discover valid values. An unknown or non-matching name returns an empty list.
475
+
476
+ :param recorded_by: Email addresses of users who recorded meetings.
477
+
478
+ Pass the parameter once per value, e.g.
479
+ `recorded_by[]=ceo@acme.com&recorded_by[]=pm@acme.com`.
480
+
481
+ Returns meetings recorded by any of the specified users.
482
+
483
+ :param teams: Team names to filter by.
484
+
485
+ Pass the parameter once per value, e.g.
486
+ `teams[]=Sales&teams[]=Engineering`.
487
+
488
+ Returns meetings that belong to any of the specified teams.
489
+
454
490
  :param retries: Override the default retry configuration for this method
455
491
  :param server_url: Override the default server URL for this method
456
492
  :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
@@ -467,7 +503,6 @@ class Fathom(BaseSDK):
467
503
  base_url = self._get_url(base_url, url_variables)
468
504
 
469
505
  request = models.ListMeetingsRequest(
470
- calendar_invitees=calendar_invitees,
471
506
  calendar_invitees_domains=calendar_invitees_domains,
472
507
  calendar_invitees_domains_type=calendar_invitees_domains_type,
473
508
  created_after=created_after,
@@ -533,7 +568,6 @@ class Fathom(BaseSDK):
533
568
  return None
534
569
 
535
570
  return self.list_meetings(
536
- calendar_invitees=calendar_invitees,
537
571
  calendar_invitees_domains=calendar_invitees_domains,
538
572
  calendar_invitees_domains_type=calendar_invitees_domains_type,
539
573
  created_after=created_after,
@@ -1331,6 +1365,216 @@ class Fathom(BaseSDK):
1331
1365
 
1332
1366
  raise errors.APIError("Unexpected response received", http_res)
1333
1367
 
1368
+ def list_meeting_types(
1369
+ self,
1370
+ *,
1371
+ cursor: Optional[str] = None,
1372
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
1373
+ server_url: Optional[str] = None,
1374
+ timeout_ms: Optional[int] = None,
1375
+ http_headers: Optional[Mapping[str, str]] = None,
1376
+ ) -> Optional[models.ListMeetingTypesResponse]:
1377
+ r"""List meeting types
1378
+
1379
+ List your team's published meeting types (both `active` and `inactive`). Draft meeting types, which are not yet fully created and never appear on meetings, are excluded. Use the returned `name` values to filter /meetings via its meeting_type parameter.
1380
+
1381
+
1382
+ :param cursor: Cursor for pagination.
1383
+ :param retries: Override the default retry configuration for this method
1384
+ :param server_url: Override the default server URL for this method
1385
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
1386
+ :param http_headers: Additional headers to set or replace on requests.
1387
+ """
1388
+ base_url = None
1389
+ url_variables = None
1390
+ if timeout_ms is None:
1391
+ timeout_ms = self.sdk_configuration.timeout_ms
1392
+
1393
+ if server_url is not None:
1394
+ base_url = server_url
1395
+ else:
1396
+ base_url = self._get_url(base_url, url_variables)
1397
+
1398
+ request = models.ListMeetingTypesRequest(
1399
+ cursor=cursor,
1400
+ )
1401
+
1402
+ req = self._build_request(
1403
+ method="GET",
1404
+ path="/meeting_types",
1405
+ base_url=base_url,
1406
+ url_variables=url_variables,
1407
+ request=request,
1408
+ request_body_required=False,
1409
+ request_has_path_params=False,
1410
+ request_has_query_params=True,
1411
+ user_agent_header="user-agent",
1412
+ accept_header_value="application/json",
1413
+ http_headers=http_headers,
1414
+ security=self.sdk_configuration.security,
1415
+ timeout_ms=timeout_ms,
1416
+ )
1417
+
1418
+ if retries == UNSET:
1419
+ if self.sdk_configuration.retry_config is not UNSET:
1420
+ retries = self.sdk_configuration.retry_config
1421
+
1422
+ retry_config = None
1423
+ if isinstance(retries, utils.RetryConfig):
1424
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
1425
+
1426
+ http_res = self.do_request(
1427
+ hook_ctx=HookContext(
1428
+ config=self.sdk_configuration,
1429
+ base_url=base_url or "",
1430
+ operation_id="listMeetingTypes",
1431
+ oauth2_scopes=None,
1432
+ security_source=get_security_from_env(
1433
+ self.sdk_configuration.security, models.Security
1434
+ ),
1435
+ ),
1436
+ request=req,
1437
+ error_status_codes=["400", "401", "429", "4XX", "5XX"],
1438
+ retry_config=retry_config,
1439
+ )
1440
+
1441
+ def next_func() -> Optional[models.ListMeetingTypesResponse]:
1442
+ body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]])
1443
+ next_cursor = JSONPath("$.next_cursor").parse(body)
1444
+
1445
+ if len(next_cursor) == 0:
1446
+ return None
1447
+
1448
+ next_cursor = next_cursor[0]
1449
+ if next_cursor is None or str(next_cursor).strip() == "":
1450
+ return None
1451
+
1452
+ return self.list_meeting_types(
1453
+ cursor=next_cursor,
1454
+ retries=retries,
1455
+ )
1456
+
1457
+ if utils.match_response(http_res, "200", "application/json"):
1458
+ return models.ListMeetingTypesResponse(
1459
+ result=unmarshal_json_response(
1460
+ models.MeetingTypeListResponse, http_res
1461
+ ),
1462
+ next=next_func,
1463
+ )
1464
+ if utils.match_response(http_res, ["400", "401", "429", "4XX"], "*"):
1465
+ http_res_text = utils.stream_to_text(http_res)
1466
+ raise errors.APIError("API error occurred", http_res, http_res_text)
1467
+ if utils.match_response(http_res, "5XX", "*"):
1468
+ http_res_text = utils.stream_to_text(http_res)
1469
+ raise errors.APIError("API error occurred", http_res, http_res_text)
1470
+
1471
+ raise errors.APIError("Unexpected response received", http_res)
1472
+
1473
+ async def list_meeting_types_async(
1474
+ self,
1475
+ *,
1476
+ cursor: Optional[str] = None,
1477
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
1478
+ server_url: Optional[str] = None,
1479
+ timeout_ms: Optional[int] = None,
1480
+ http_headers: Optional[Mapping[str, str]] = None,
1481
+ ) -> Optional[models.ListMeetingTypesResponse]:
1482
+ r"""List meeting types
1483
+
1484
+ List your team's published meeting types (both `active` and `inactive`). Draft meeting types, which are not yet fully created and never appear on meetings, are excluded. Use the returned `name` values to filter /meetings via its meeting_type parameter.
1485
+
1486
+
1487
+ :param cursor: Cursor for pagination.
1488
+ :param retries: Override the default retry configuration for this method
1489
+ :param server_url: Override the default server URL for this method
1490
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
1491
+ :param http_headers: Additional headers to set or replace on requests.
1492
+ """
1493
+ base_url = None
1494
+ url_variables = None
1495
+ if timeout_ms is None:
1496
+ timeout_ms = self.sdk_configuration.timeout_ms
1497
+
1498
+ if server_url is not None:
1499
+ base_url = server_url
1500
+ else:
1501
+ base_url = self._get_url(base_url, url_variables)
1502
+
1503
+ request = models.ListMeetingTypesRequest(
1504
+ cursor=cursor,
1505
+ )
1506
+
1507
+ req = self._build_request_async(
1508
+ method="GET",
1509
+ path="/meeting_types",
1510
+ base_url=base_url,
1511
+ url_variables=url_variables,
1512
+ request=request,
1513
+ request_body_required=False,
1514
+ request_has_path_params=False,
1515
+ request_has_query_params=True,
1516
+ user_agent_header="user-agent",
1517
+ accept_header_value="application/json",
1518
+ http_headers=http_headers,
1519
+ security=self.sdk_configuration.security,
1520
+ timeout_ms=timeout_ms,
1521
+ )
1522
+
1523
+ if retries == UNSET:
1524
+ if self.sdk_configuration.retry_config is not UNSET:
1525
+ retries = self.sdk_configuration.retry_config
1526
+
1527
+ retry_config = None
1528
+ if isinstance(retries, utils.RetryConfig):
1529
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
1530
+
1531
+ http_res = await self.do_request_async(
1532
+ hook_ctx=HookContext(
1533
+ config=self.sdk_configuration,
1534
+ base_url=base_url or "",
1535
+ operation_id="listMeetingTypes",
1536
+ oauth2_scopes=None,
1537
+ security_source=get_security_from_env(
1538
+ self.sdk_configuration.security, models.Security
1539
+ ),
1540
+ ),
1541
+ request=req,
1542
+ error_status_codes=["400", "401", "429", "4XX", "5XX"],
1543
+ retry_config=retry_config,
1544
+ )
1545
+
1546
+ def next_func() -> Optional[models.ListMeetingTypesResponse]:
1547
+ body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]])
1548
+ next_cursor = JSONPath("$.next_cursor").parse(body)
1549
+
1550
+ if len(next_cursor) == 0:
1551
+ return None
1552
+
1553
+ next_cursor = next_cursor[0]
1554
+ if next_cursor is None or str(next_cursor).strip() == "":
1555
+ return None
1556
+
1557
+ return self.list_meeting_types(
1558
+ cursor=next_cursor,
1559
+ retries=retries,
1560
+ )
1561
+
1562
+ if utils.match_response(http_res, "200", "application/json"):
1563
+ return models.ListMeetingTypesResponse(
1564
+ result=unmarshal_json_response(
1565
+ models.MeetingTypeListResponse, http_res
1566
+ ),
1567
+ next=next_func,
1568
+ )
1569
+ if utils.match_response(http_res, ["400", "401", "429", "4XX"], "*"):
1570
+ http_res_text = await utils.stream_to_text_async(http_res)
1571
+ raise errors.APIError("API error occurred", http_res, http_res_text)
1572
+ if utils.match_response(http_res, "5XX", "*"):
1573
+ http_res_text = await utils.stream_to_text_async(http_res)
1574
+ raise errors.APIError("API error occurred", http_res, http_res_text)
1575
+
1576
+ raise errors.APIError("Unexpected response received", http_res)
1577
+
1334
1578
  def create_webhook(
1335
1579
  self,
1336
1580
  *,
@@ -1352,7 +1596,12 @@ class Fathom(BaseSDK):
1352
1596
 
1353
1597
 
1354
1598
  :param destination_url: The URL to send the webhook to.
1355
- :param triggered_for: You must send at least one of the following types of recordings to trigger on. - `my_recordings`: Your private recordings, as well as those you've shared with individuals. (On Team Plans, this excludes recordings you've shared with any teams.) - `shared_external_recordings`: Recordings shared with you by other users. (For Team Plans, this does not include recordings shared by other users on your Team Plan.) - `my_shared_with_team_recordings`: (Team Plans only). All recordings that you have shared with other teams (e.g. Marketing or Sales). Recordings you've shared with individuals but not with teams are not included. - `shared_team_recordings`: (Team Plans only) All recordings you can access from other users on your Team Plan, whether shared with you individually or with your team.
1599
+ :param triggered_for: You must send at least one of the following types of recordings to trigger on.
1600
+ - `my_recordings`: Your private recordings, as well as those you've shared with individuals. (On Team Plans, this excludes recordings you've shared with any teams.)
1601
+ - `shared_external_recordings`: Recordings shared with you by other users. (For Team Plans, this does not include recordings shared by other users on your Team Plan.)
1602
+ - `my_shared_with_team_recordings`: (Team Plans only). All recordings that you have shared with other teams (e.g. Marketing or Sales). Recordings you've shared with individuals but not with teams are not included.
1603
+ - `shared_team_recordings`: (Team Plans only) All recordings you can access from other users on your Team Plan, whether shared with you individually or with your team.
1604
+
1356
1605
  :param include_action_items: Include the action items for each meeting.
1357
1606
  :param include_crm_matches: Include CRM matches for each meeting. Only returns data from your or your team's linked CRM.
1358
1607
  :param include_summary: Include the summary for each meeting.
@@ -1455,7 +1704,12 @@ class Fathom(BaseSDK):
1455
1704
 
1456
1705
 
1457
1706
  :param destination_url: The URL to send the webhook to.
1458
- :param triggered_for: You must send at least one of the following types of recordings to trigger on. - `my_recordings`: Your private recordings, as well as those you've shared with individuals. (On Team Plans, this excludes recordings you've shared with any teams.) - `shared_external_recordings`: Recordings shared with you by other users. (For Team Plans, this does not include recordings shared by other users on your Team Plan.) - `my_shared_with_team_recordings`: (Team Plans only). All recordings that you have shared with other teams (e.g. Marketing or Sales). Recordings you've shared with individuals but not with teams are not included. - `shared_team_recordings`: (Team Plans only) All recordings you can access from other users on your Team Plan, whether shared with you individually or with your team.
1707
+ :param triggered_for: You must send at least one of the following types of recordings to trigger on.
1708
+ - `my_recordings`: Your private recordings, as well as those you've shared with individuals. (On Team Plans, this excludes recordings you've shared with any teams.)
1709
+ - `shared_external_recordings`: Recordings shared with you by other users. (For Team Plans, this does not include recordings shared by other users on your Team Plan.)
1710
+ - `my_shared_with_team_recordings`: (Team Plans only). All recordings that you have shared with other teams (e.g. Marketing or Sales). Recordings you've shared with individuals but not with teams are not included.
1711
+ - `shared_team_recordings`: (Team Plans only) All recordings you can access from other users on your Team Plan, whether shared with you individually or with your team.
1712
+
1459
1713
  :param include_action_items: Include the action items for each meeting.
1460
1714
  :param include_crm_matches: Include CRM matches for each meeting. Only returns data from your or your team's linked CRM.
1461
1715
  :param include_summary: Include the summary for each meeting.
@@ -0,0 +1,39 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import base64
6
+ import io
7
+ from os import PathLike
8
+ from typing import IO, Any, Union
9
+
10
+ from pydantic.functional_validators import BeforeValidator
11
+ from typing_extensions import Annotated
12
+
13
+
14
+ Base64FileInput = Union[IO[bytes], PathLike[str]]
15
+
16
+
17
+ def encode_base64_file_input(value: Any) -> Any:
18
+ """Convert PathLike or IO[bytes] inputs to a base64 string. All standard binary streams
19
+ that inherit from io.IOBase are handled. Other values pass through.
20
+ """
21
+ if isinstance(value, (PathLike, io.IOBase)):
22
+ if isinstance(value, PathLike):
23
+ with open(value, "rb") as fh:
24
+ binary = fh.read()
25
+ else:
26
+ binary = value.read()
27
+ if isinstance(binary, str):
28
+ binary = binary.encode()
29
+ if not isinstance(binary, (bytes, bytearray)):
30
+ raise TypeError(
31
+ f"Base64FileInput expected binary IO returning bytes; got {type(binary).__name__}"
32
+ )
33
+ return base64.b64encode(binary).decode("ascii")
34
+ return value
35
+
36
+
37
+ # Non-str inputs are converted to base64 by the BeforeValidator at construction time.
38
+ # Callers can also pass a pre-encoded base64 str.
39
+ Base64EncodedString = Annotated[str, BeforeValidator(encode_base64_file_input)]
@@ -0,0 +1,54 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+
3
+ from importlib import import_module
4
+ import builtins
5
+ import sys
6
+
7
+
8
+ def dynamic_import(package, modname, retries=3):
9
+ """Import a module relative to package, retrying on KeyError from half-initialized modules."""
10
+ for attempt in range(retries):
11
+ try:
12
+ return import_module(modname, package)
13
+ except KeyError:
14
+ sys.modules.pop(modname, None)
15
+ if attempt == retries - 1:
16
+ break
17
+ raise KeyError(f"Failed to import module '{modname}' after {retries} attempts")
18
+
19
+
20
+ def lazy_getattr(attr_name, *, package, dynamic_imports, sub_packages=None):
21
+ """Module-level __getattr__ that lazily loads from a dynamic_imports mapping.
22
+
23
+ Args:
24
+ attr_name: The attribute being looked up.
25
+ package: The caller's __package__ (for relative imports).
26
+ dynamic_imports: Dict mapping attribute names to relative module paths.
27
+ sub_packages: Optional list of subpackage names to lazy-load.
28
+ """
29
+ module_name = dynamic_imports.get(attr_name)
30
+ if module_name is not None:
31
+ try:
32
+ module = dynamic_import(package, module_name)
33
+ return getattr(module, attr_name)
34
+ except ImportError as e:
35
+ raise ImportError(
36
+ f"Failed to import {attr_name} from {module_name}: {e}"
37
+ ) from e
38
+ except AttributeError as e:
39
+ raise AttributeError(
40
+ f"Failed to get {attr_name} from {module_name}: {e}"
41
+ ) from e
42
+
43
+ if sub_packages and attr_name in sub_packages:
44
+ return import_module(f".{attr_name}", package)
45
+
46
+ raise AttributeError(f"module '{package}' has no attribute '{attr_name}'")
47
+
48
+
49
+ def lazy_dir(*, dynamic_imports, sub_packages=None):
50
+ """Module-level __dir__ that lists lazily-loadable attributes."""
51
+ lazy_attrs = builtins.list(dynamic_imports.keys())
52
+ if sub_packages:
53
+ lazy_attrs.extend(sub_packages)
54
+ return builtins.sorted(lazy_attrs)
@@ -3,7 +3,9 @@
3
3
  import asyncio
4
4
  import random
5
5
  import time
6
- from typing import List
6
+ from datetime import datetime
7
+ from email.utils import parsedate_to_datetime
8
+ from typing import List, Optional
7
9
 
8
10
  import httpx
9
11
 
@@ -51,9 +53,11 @@ class Retries:
51
53
 
52
54
  class TemporaryError(Exception):
53
55
  response: httpx.Response
56
+ retry_after: Optional[int]
54
57
 
55
58
  def __init__(self, response: httpx.Response):
56
59
  self.response = response
60
+ self.retry_after = _parse_retry_after_header(response)
57
61
 
58
62
 
59
63
  class PermanentError(Exception):
@@ -63,6 +67,62 @@ class PermanentError(Exception):
63
67
  self.inner = inner
64
68
 
65
69
 
70
+ def _parse_retry_after_header(response: httpx.Response) -> Optional[int]:
71
+ """Parse Retry-After header from response.
72
+
73
+ Returns:
74
+ Retry interval in milliseconds, or None if header is missing or invalid.
75
+ """
76
+ retry_after_header = response.headers.get("retry-after")
77
+ if not retry_after_header:
78
+ return None
79
+
80
+ try:
81
+ seconds = float(retry_after_header)
82
+ return round(seconds * 1000)
83
+ except ValueError:
84
+ pass
85
+
86
+ try:
87
+ retry_date = parsedate_to_datetime(retry_after_header)
88
+ delta = (retry_date - datetime.now(retry_date.tzinfo)).total_seconds()
89
+ return round(max(0, delta) * 1000)
90
+ except (ValueError, TypeError):
91
+ pass
92
+
93
+ return None
94
+
95
+
96
+ def _get_sleep_interval(
97
+ exception: Exception,
98
+ initial_interval: int,
99
+ max_interval: int,
100
+ exponent: float,
101
+ retries: int,
102
+ ) -> float:
103
+ """Get sleep interval for retry with exponential backoff.
104
+
105
+ Args:
106
+ exception: The exception that triggered the retry.
107
+ initial_interval: Initial retry interval in milliseconds.
108
+ max_interval: Maximum retry interval in milliseconds.
109
+ exponent: Base for exponential backoff calculation.
110
+ retries: Current retry attempt count.
111
+
112
+ Returns:
113
+ Sleep interval in seconds.
114
+ """
115
+ if (
116
+ isinstance(exception, TemporaryError)
117
+ and exception.retry_after is not None
118
+ and exception.retry_after > 0
119
+ ):
120
+ return exception.retry_after / 1000
121
+
122
+ sleep = (initial_interval / 1000) * exponent**retries + random.uniform(0, 1)
123
+ return min(sleep, max_interval / 1000)
124
+
125
+
66
126
  def retry(func, retries: Retries):
67
127
  if retries.config.strategy == "backoff":
68
128
 
@@ -183,8 +243,10 @@ def retry_with_backoff(
183
243
  return exception.response
184
244
 
185
245
  raise
186
- sleep = (initial_interval / 1000) * exponent**retries + random.uniform(0, 1)
187
- sleep = min(sleep, max_interval / 1000)
246
+
247
+ sleep = _get_sleep_interval(
248
+ exception, initial_interval, max_interval, exponent, retries
249
+ )
188
250
  time.sleep(sleep)
189
251
  retries += 1
190
252
 
@@ -211,7 +273,9 @@ async def retry_with_backoff_async(
211
273
  return exception.response
212
274
 
213
275
  raise
214
- sleep = (initial_interval / 1000) * exponent**retries + random.uniform(0, 1)
215
- sleep = min(sleep, max_interval / 1000)
276
+
277
+ sleep = _get_sleep_interval(
278
+ exception, initial_interval, max_interval, exponent, retries
279
+ )
216
280
  await asyncio.sleep(sleep)
217
281
  retries += 1
@@ -1,12 +1,26 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
 
3
- from typing import Any, Optional
3
+ from typing import Any, Optional, Type, TypeVar, overload
4
4
 
5
5
  import httpx
6
6
 
7
7
  from .serializers import unmarshal_json
8
8
  from fathom_python import errors
9
9
 
10
+ T = TypeVar("T")
11
+
12
+
13
+ @overload
14
+ def unmarshal_json_response(
15
+ typ: Type[T], http_res: httpx.Response, body: Optional[str] = None
16
+ ) -> T: ...
17
+
18
+
19
+ @overload
20
+ def unmarshal_json_response(
21
+ typ: Any, http_res: httpx.Response, body: Optional[str] = None
22
+ ) -> Any: ...
23
+
10
24
 
11
25
  def unmarshal_json_response(
12
26
  typ: Any, http_res: httpx.Response, body: Optional[str] = None
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: fathom-python
3
- Version: 0.0.36
3
+ Version: 0.0.38
4
4
  Summary: Fathom's official Python SDK.
5
5
  Author: Speakeasy
6
6
  Requires-Python: >=3.9.2
@@ -9,6 +9,7 @@ Classifier: Programming Language :: Python :: 3.10
9
9
  Classifier: Programming Language :: Python :: 3.11
10
10
  Classifier: Programming Language :: Python :: 3.12
11
11
  Classifier: Programming Language :: Python :: 3.13
12
+ Classifier: Programming Language :: Python :: 3.14
12
13
  Requires-Dist: httpcore (>=1.0.9)
13
14
  Requires-Dist: httpx (>=0.28.1)
14
15
  Requires-Dist: jsonpath-python (>=1.0.6)
@@ -120,13 +121,10 @@ with Fathom(
120
121
  ),
121
122
  ) as fathom:
122
123
 
123
- res = fathom.list_meetings(calendar_invitees=[
124
- "cfo@acme.com",
125
- "legal@acme.com",
126
- ], calendar_invitees_domains=[
124
+ res = fathom.list_meetings(calendar_invitees_domains=[
127
125
  "acme.com",
128
126
  "client.com",
129
- ], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type=models.MeetingType.ALL, recorded_by=[
127
+ ], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type="Quarterly Business Review", recorded_by=[
130
128
  "ceo@acme.com",
131
129
  "pm@acme.com",
132
130
  ], teams=[
@@ -158,13 +156,10 @@ async def main():
158
156
  ),
159
157
  ) as fathom:
160
158
 
161
- res = await fathom.list_meetings_async(calendar_invitees=[
162
- "cfo@acme.com",
163
- "legal@acme.com",
164
- ], calendar_invitees_domains=[
159
+ res = await fathom.list_meetings_async(calendar_invitees_domains=[
165
160
  "acme.com",
166
161
  "client.com",
167
- ], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type=models.MeetingType.ALL, recorded_by=[
162
+ ], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type="Quarterly Business Review", recorded_by=[
168
163
  "ceo@acme.com",
169
164
  "pm@acme.com",
170
165
  ], teams=[
@@ -205,13 +200,10 @@ with Fathom(
205
200
  ),
206
201
  ) as fathom:
207
202
 
208
- res = fathom.list_meetings(calendar_invitees=[
209
- "cfo@acme.com",
210
- "legal@acme.com",
211
- ], calendar_invitees_domains=[
203
+ res = fathom.list_meetings(calendar_invitees_domains=[
212
204
  "acme.com",
213
205
  "client.com",
214
- ], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type=models.MeetingType.ALL, recorded_by=[
206
+ ], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type="Quarterly Business Review", recorded_by=[
215
207
  "ceo@acme.com",
216
208
  "pm@acme.com",
217
209
  ], teams=[
@@ -240,6 +232,7 @@ with Fathom(
240
232
  * [get_recording_transcript](docs/sdks/fathom/README.md#get_recording_transcript) - Get transcript
241
233
  * [list_teams](docs/sdks/fathom/README.md#list_teams) - List teams
242
234
  * [list_team_members](docs/sdks/fathom/README.md#list_team_members) - List team members
235
+ * [list_meeting_types](docs/sdks/fathom/README.md#list_meeting_types) - List meeting types
243
236
  * [create_webhook](docs/sdks/fathom/README.md#create_webhook) - Create a webhook
244
237
  * [delete_webhook](docs/sdks/fathom/README.md#delete_webhook) - Delete a webhook
245
238
 
@@ -265,13 +258,10 @@ with Fathom(
265
258
  ),
266
259
  ) as fathom:
267
260
 
268
- res = fathom.list_meetings(calendar_invitees=[
269
- "cfo@acme.com",
270
- "legal@acme.com",
271
- ], calendar_invitees_domains=[
261
+ res = fathom.list_meetings(calendar_invitees_domains=[
272
262
  "acme.com",
273
263
  "client.com",
274
- ], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type=models.MeetingType.ALL, recorded_by=[
264
+ ], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type="Quarterly Business Review", recorded_by=[
275
265
  "ceo@acme.com",
276
266
  "pm@acme.com",
277
267
  ], teams=[
@@ -305,13 +295,10 @@ with Fathom(
305
295
  ),
306
296
  ) as fathom:
307
297
 
308
- res = fathom.list_meetings(calendar_invitees=[
309
- "cfo@acme.com",
310
- "legal@acme.com",
311
- ], calendar_invitees_domains=[
298
+ res = fathom.list_meetings(calendar_invitees_domains=[
312
299
  "acme.com",
313
300
  "client.com",
314
- ], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type=models.MeetingType.ALL, recorded_by=[
301
+ ], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type="Quarterly Business Review", recorded_by=[
315
302
  "ceo@acme.com",
316
303
  "pm@acme.com",
317
304
  ], teams=[
@@ -341,13 +328,10 @@ with Fathom(
341
328
  ),
342
329
  ) as fathom:
343
330
 
344
- res = fathom.list_meetings(calendar_invitees=[
345
- "cfo@acme.com",
346
- "legal@acme.com",
347
- ], calendar_invitees_domains=[
331
+ res = fathom.list_meetings(calendar_invitees_domains=[
348
332
  "acme.com",
349
333
  "client.com",
350
- ], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type=models.MeetingType.ALL, recorded_by=[
334
+ ], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type="Quarterly Business Review", recorded_by=[
351
335
  "ceo@acme.com",
352
336
  "pm@acme.com",
353
337
  ], teams=[
@@ -390,13 +374,10 @@ with Fathom(
390
374
  res = None
391
375
  try:
392
376
 
393
- res = fathom.list_meetings(calendar_invitees=[
394
- "cfo@acme.com",
395
- "legal@acme.com",
396
- ], calendar_invitees_domains=[
377
+ res = fathom.list_meetings(calendar_invitees_domains=[
397
378
  "acme.com",
398
379
  "client.com",
399
- ], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type=models.MeetingType.ALL, recorded_by=[
380
+ ], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type="Quarterly Business Review", recorded_by=[
400
381
  "ceo@acme.com",
401
382
  "pm@acme.com",
402
383
  ], teams=[
@@ -458,13 +439,10 @@ with Fathom(
458
439
  ),
459
440
  ) as fathom:
460
441
 
461
- res = fathom.list_meetings(calendar_invitees=[
462
- "cfo@acme.com",
463
- "legal@acme.com",
464
- ], calendar_invitees_domains=[
442
+ res = fathom.list_meetings(calendar_invitees_domains=[
465
443
  "acme.com",
466
444
  "client.com",
467
- ], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type=models.MeetingType.ALL, recorded_by=[
445
+ ], calendar_invitees_domains_type=models.ListMeetingsCalendarInviteesDomainsType.ALL, include_action_items=False, include_crm_matches=False, include_summary=False, include_transcript=False, meeting_type="Quarterly Business Review", recorded_by=[
468
446
  "ceo@acme.com",
469
447
  "pm@acme.com",
470
448
  ], teams=[
@@ -3,15 +3,15 @@ fathom_python/_hooks/__init__.py,sha256=9_7W5jAYw8rcO8Kfc-Ty-lB82BHfksAJJpVFb_Ue
3
3
  fathom_python/_hooks/registration.py,sha256=1QZB41w6If7I9dXiOSQx6dhSc6BPWrnI5Q5bMOr4iVA,624
4
4
  fathom_python/_hooks/sdkhooks.py,sha256=SyxWCUZakr1ZlORVhbgZJ-xM5W4QvTTS4Mymtte2LrI,2530
5
5
  fathom_python/_hooks/types.py,sha256=OOkf6lkat8zumtftMupq5qK6pigExGTdcBF38RyT_gU,2992
6
- fathom_python/_version.py,sha256=C0Z0nhrPI3tVX4FzF66WgMW_XsUsVr1BsFCLceGA_s8,470
6
+ fathom_python/_version.py,sha256=z831HgGuEk-FCD3LiK58GZpK3OKi2JBvSXThexNwwnE,470
7
7
  fathom_python/basesdk.py,sha256=HzY3rWonhPH0RZoEfNyWHy9q_eIvEfsVaf1jIMUGHhQ,12214
8
8
  fathom_python/errors/__init__.py,sha256=4aL9LIze2oNNs_l3aHDAu2HvD8EB0sMFfA9ikL53Lk4,1818
9
- fathom_python/errors/apierror.py,sha256=a7BEYi8Bh46jnAALCrTFnavGXRqpaOOISPdBWBLgax8,1283
10
- fathom_python/errors/fathomerror.py,sha256=VEu2eSLjVJCCkfgbQdqAgUBHae82C-3sW8zJXGSF5yo,950
11
- fathom_python/errors/no_response_error.py,sha256=Kb7hmMtDo72KrLSjUEDNeQxvzZiVxUjOZym8TPdZp5Y,462
12
- fathom_python/errors/responsevalidationerror.py,sha256=aXo7zRI3EDZfzuB7kmdJxxQuraVi6V0ECSeUVBbyYf4,750
9
+ fathom_python/errors/apierror.py,sha256=OzB0d0_nV_nRc6ZvE01b-BEAm0pjuNPck0PF1BTjGfg,1288
10
+ fathom_python/errors/fathomerror.py,sha256=Y43URqKlm_y9uOPRiSFI8PA8V9TL4Zb7xz9oSbJ0ORQ,955
11
+ fathom_python/errors/no_response_error.py,sha256=DaZukP5ManflzAN-11MtmBitfTIct37sRvfszvfM13o,467
12
+ fathom_python/errors/responsevalidationerror.py,sha256=uhcnWCmoKmMTDq92osd_9feW54yrjijwkveLT_uKXlA,755
13
13
  fathom_python/httpclient.py,sha256=dqTPONDBpRn4ktXfcetQiRXnG93f0pJkFhqsYFhLUac,3945
14
- fathom_python/models/__init__.py,sha256=d_FIMbDiWzyohNHVsZff7_UAiX_B6Uf2WbxgkRVdr0k,10042
14
+ fathom_python/models/__init__.py,sha256=dijGPL7ESv-wpD-amGHLE0ANd-NF6eGQC_ZosbuFdyM,11103
15
15
  fathom_python/models/actionitem.py,sha256=Ab36zDi8torOZAMXyTfVlcbayc-m1114XDLVBMJSljE,849
16
16
  fathom_python/models/assignee.py,sha256=q7FZ4ai6dKZPBTP9cEVoYgwHyCWLkxjaTSy-9lu617U,1384
17
17
  fathom_python/models/callbackresponse.py,sha256=n-PmMM8JE8CJEqgW4AVt14gjGVZxS7tW4okZh-ZBqwc,323
@@ -25,12 +25,15 @@ fathom_python/models/fathomuser.py,sha256=qwGGC5H-Dp2rmOa6THVcVfykXWABrFpn2oYDTY
25
25
  fathom_python/models/getrecordingsummaryop.py,sha256=buQ5qW4BRCU2buQ92rWqeiJ7ETNXOIsHyf8vMEiJMY4,3018
26
26
  fathom_python/models/getrecordingtranscriptop.py,sha256=JVv9N40odOPlw25prIgncqfkrpCQj7TerZ4yXry5oKY,2043
27
27
  fathom_python/models/invitee.py,sha256=DwyAGSStoB4VEgg8MtTHQyGeRr7mgGyJT0-aHrZoN9Q,1829
28
- fathom_python/models/listmeetingsop.py,sha256=T5QfI_hM5W0yzbH8-OJFR24hACHuYuJZEDzzF4FS4ug,7634
28
+ fathom_python/models/listmeetingsop.py,sha256=HqQIroFQnVHxflChU6zHSuL21XY3k-xLBn03JQcz5ek,6832
29
+ fathom_python/models/listmeetingtypesop.py,sha256=W3fpm1Kdo9iP6T_WeP-ylueptxk03GJz3CI_RlmDYsA,996
29
30
  fathom_python/models/listteammembersop.py,sha256=Rtatvg_ZZZuAo95s7I6blWn_DEKXKug5-le7EyxKgVc,1218
30
31
  fathom_python/models/listteamsop.py,sha256=fjGGOkZed83n-MK6S7eYSinqUyeFNZ5dnJ7Tj-wY3nA,913
31
- fathom_python/models/meeting.py,sha256=6gS36hvoM_s8ildFlFcNAngUuVF0qgtgsA1kmKjF4-w,4015
32
+ fathom_python/models/meeting.py,sha256=TEpNeR4Pp-sSirMoLJ-r5JuViRHgLFnU5JRVEe_PZUI,4302
32
33
  fathom_python/models/meetinglistresponse.py,sha256=DWgl0mQn76jXk91xK9syGFaxw_g-7zUOUBGscLQSXNg,1501
33
34
  fathom_python/models/meetingsummary.py,sha256=AKmIdH7fci9FSEyHFEIoA0HnVvwhLURXNR2ZjexA1BY,1485
35
+ fathom_python/models/meetingtype.py,sha256=t0Lhjabyj9XPiVzEA8LbLxjOHOrv34wXLW2U_xVejhU,1175
36
+ fathom_python/models/meetingtypelistresponse.py,sha256=OzGxgWu4qxRon75aO8Oogu3pvws__aOP0YV1m96vEV0,1529
34
37
  fathom_python/models/security.py,sha256=hcxt1Cf-Bg5WplpU91H68EyvsxiMISup1sCJgilsjxQ,1032
35
38
  fathom_python/models/team.py,sha256=-bOFAH_rcYvRQU10bd9KUJSbV_3V3VrFQCIwrXH6o9U,358
36
39
  fathom_python/models/teamlistresponse.py,sha256=7Sxs2CgfkOY1ROji1mJ6Wzpro54pL0arNoxo0ClqYvk,1451
@@ -40,13 +43,15 @@ fathom_python/models/transcriptitem.py,sha256=pGg4S32z86vBu0eaSLK1Tf1TvvvTZj10nJ
40
43
  fathom_python/models/transcriptitemspeaker.py,sha256=F4SH35bRpNLHZSGvWvWMlvG_WdfiNY9q0Lc01JjJCZU,1608
41
44
  fathom_python/models/webhook.py,sha256=ekDvnrsaSU-AvUDA8tFz1SPi18Za6NbWcMTQP2k5wPI,1300
42
45
  fathom_python/py.typed,sha256=zrp19r0G21lr2yRiMC0f8MFkQFGj9wMpSbboePMg8KM,59
43
- fathom_python/sdk.py,sha256=2rZlAbYkf5OnFAwejM7GT8TE7Qx5iea7B9stdIu3gr8,72574
46
+ fathom_python/sdk.py,sha256=wS2Orc3Rq-zdY2t32DAjnxRef9RJlsyt3Zvqh6OJ8TQ,80748
44
47
  fathom_python/sdkconfiguration.py,sha256=s06HLCZA48IdYWZd8E9q8AK7WazaxybG7ZdqoWF-e7s,1586
45
48
  fathom_python/types/__init__.py,sha256=RArOwSgeeTIva6h-4ttjXwMUeCkz10nAFBL9D-QljI4,377
49
+ fathom_python/types/base64fileinput.py,sha256=iAPobCSY5JGbROj19BQynXEsN7Rg1EV1QOM-6PsqVWs,1352
46
50
  fathom_python/types/basemodel.py,sha256=L79WXvTECbSqaJzs8D3ud_KdIWkU7Cx2wbohDAktE9E,1127
47
51
  fathom_python/utils/__init__.py,sha256=CAG0O76aEToGKXpT6Ft87Vd-iiQTh4XdBrQ37BVbsiM,5861
48
52
  fathom_python/utils/annotations.py,sha256=FvfvVTUj8TUclm4HbGgY5yi2Ap7EzGmu2UPFU4FwC1w,2755
49
53
  fathom_python/utils/datetimes.py,sha256=oppAA5e3V35pQov1-FNLKxAaNF1_XWi-bQtyjjql3H8,855
54
+ fathom_python/utils/dynamic_imports.py,sha256=XSNKuw7x_kWcaXQ8ALQB7UCMlH8T-wYtz-5LS4nhj2A,2026
50
55
  fathom_python/utils/enums.py,sha256=REU6ydF8gsVL3xaeGX4sMNyiL3q5P9h29-f6Sa6luAE,2633
51
56
  fathom_python/utils/eventstreaming.py,sha256=SgFqMcUOYKlrTQ4gAp_dNcKLvDXukeiEMNU3DP8mXk8,6692
52
57
  fathom_python/utils/forms.py,sha256=EJdnrfIkuwpDtekyHutla0HjI_FypTYcmYNyPKEu_W0,6874
@@ -55,12 +60,12 @@ fathom_python/utils/logger.py,sha256=CrS1hPx092pSNkAjzB3nnWoaiB0VyH_0L_H3dpLiFJ4
55
60
  fathom_python/utils/metadata.py,sha256=Per2KFXXOqOtoUWXrlIfjrSrBg199KrRW0nKQDgHIBU,3136
56
61
  fathom_python/utils/queryparams.py,sha256=MTK6inMS1_WwjmMJEJmAn67tSHHJyarpdGRlorRHEtI,5899
57
62
  fathom_python/utils/requestbodies.py,sha256=ySjEyjcLi731LNUahWvLOrES2HihuA8VrOJx4eQ7Qzg,2101
58
- fathom_python/utils/retries.py,sha256=6yhfZifqIat9i76xF0lTR2jLj1IN9BNGyqqxATlEFPU,6348
63
+ fathom_python/utils/retries.py,sha256=stPJEFtmK8gOM6aT0DpEJp9Z39oXX1-8I69jpa2n3Ww,8130
59
64
  fathom_python/utils/security.py,sha256=ObqK8V4EbMaHb9Gc3MpVs8mEY3F8I6H5Y_EsQf7lS0k,6133
60
65
  fathom_python/utils/serializers.py,sha256=Hndks5M_rJXVub_N5lu0gKZQUoEmWrn6PN7R-0HwvOE,5999
61
- fathom_python/utils/unmarshal_json_response.py,sha256=M1-rdgF0E7flFEKlOODnhlvvrvpdnD-ZF_E31FgEWVA,589
66
+ fathom_python/utils/unmarshal_json_response.py,sha256=n9xJiaI-is4GG3a_ls5n4sJc8KIeA6JU4mnZ9cbsPy4,878
62
67
  fathom_python/utils/url.py,sha256=BgGPgcTA6MRK4bF8fjP2dUopN3NzEzxWMXPBVg8NQUA,5254
63
68
  fathom_python/utils/values.py,sha256=CcaCXEa3xHhkUDROyXZocN8f0bdITftv9Y0P9lTf0YM,3517
64
- fathom_python-0.0.36.dist-info/METADATA,sha256=3hehqdYo3b0yFLR1uw2wzgDd5EJhE7SQEudst90xgo8,20704
65
- fathom_python-0.0.36.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
66
- fathom_python-0.0.36.dist-info/RECORD,,
69
+ fathom_python-0.0.38.dist-info/METADATA,sha256=1czMB9fOrHpXfIRc-F8egJI9dLsRnIV00F-fz8LOU5g,20246
70
+ fathom_python-0.0.38.dist-info/WHEEL,sha256=EGEvSphFYqXKs23-kQBeyNoJP1nrT8ZJKQoi5p5DYL8,88
71
+ fathom_python-0.0.38.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.1.3
2
+ Generator: poetry-core 2.4.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any