universal-mcp-applications 0.1.30rc1__py3-none-any.whl → 0.1.36rc1__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.

Potentially problematic release.


This version of universal-mcp-applications might be problematic. Click here for more details.

Files changed (106) hide show
  1. universal_mcp/applications/ahrefs/app.py +52 -198
  2. universal_mcp/applications/airtable/app.py +23 -122
  3. universal_mcp/applications/apollo/app.py +111 -464
  4. universal_mcp/applications/asana/app.py +417 -1567
  5. universal_mcp/applications/aws_s3/app.py +33 -100
  6. universal_mcp/applications/bill/app.py +546 -1957
  7. universal_mcp/applications/box/app.py +1068 -3981
  8. universal_mcp/applications/braze/app.py +364 -1430
  9. universal_mcp/applications/browser_use/app.py +2 -8
  10. universal_mcp/applications/cal_com_v2/app.py +207 -625
  11. universal_mcp/applications/calendly/app.py +61 -200
  12. universal_mcp/applications/canva/app.py +45 -110
  13. universal_mcp/applications/clickup/app.py +207 -674
  14. universal_mcp/applications/coda/app.py +146 -426
  15. universal_mcp/applications/confluence/app.py +310 -1098
  16. universal_mcp/applications/contentful/app.py +36 -151
  17. universal_mcp/applications/crustdata/app.py +28 -107
  18. universal_mcp/applications/dialpad/app.py +283 -756
  19. universal_mcp/applications/digitalocean/app.py +1766 -5777
  20. universal_mcp/applications/domain_checker/app.py +3 -54
  21. universal_mcp/applications/e2b/app.py +14 -64
  22. universal_mcp/applications/elevenlabs/app.py +9 -47
  23. universal_mcp/applications/exa/app.py +6 -17
  24. universal_mcp/applications/falai/app.py +23 -100
  25. universal_mcp/applications/figma/app.py +53 -137
  26. universal_mcp/applications/file_system/app.py +2 -13
  27. universal_mcp/applications/firecrawl/app.py +51 -152
  28. universal_mcp/applications/fireflies/app.py +59 -281
  29. universal_mcp/applications/fpl/app.py +91 -528
  30. universal_mcp/applications/fpl/utils/fixtures.py +15 -49
  31. universal_mcp/applications/fpl/utils/helper.py +25 -89
  32. universal_mcp/applications/fpl/utils/league_utils.py +20 -64
  33. universal_mcp/applications/ghost_content/app.py +52 -161
  34. universal_mcp/applications/github/app.py +19 -56
  35. universal_mcp/applications/gong/app.py +88 -248
  36. universal_mcp/applications/google_calendar/app.py +16 -68
  37. universal_mcp/applications/google_docs/app.py +88 -188
  38. universal_mcp/applications/google_drive/app.py +140 -462
  39. universal_mcp/applications/google_gemini/app.py +12 -64
  40. universal_mcp/applications/google_mail/app.py +28 -157
  41. universal_mcp/applications/google_searchconsole/app.py +15 -48
  42. universal_mcp/applications/google_sheet/app.py +101 -578
  43. universal_mcp/applications/google_sheet/helper.py +10 -37
  44. universal_mcp/applications/hashnode/app.py +57 -269
  45. universal_mcp/applications/heygen/app.py +44 -122
  46. universal_mcp/applications/http_tools/app.py +10 -32
  47. universal_mcp/applications/hubspot/api_segments/crm_api.py +460 -1573
  48. universal_mcp/applications/hubspot/api_segments/marketing_api.py +74 -262
  49. universal_mcp/applications/hubspot/app.py +23 -87
  50. universal_mcp/applications/jira/app.py +2071 -7986
  51. universal_mcp/applications/klaviyo/app.py +494 -1376
  52. universal_mcp/applications/linkedin/README.md +23 -4
  53. universal_mcp/applications/linkedin/app.py +392 -212
  54. universal_mcp/applications/mailchimp/app.py +450 -1605
  55. universal_mcp/applications/markitdown/app.py +8 -20
  56. universal_mcp/applications/miro/app.py +217 -699
  57. universal_mcp/applications/ms_teams/app.py +64 -186
  58. universal_mcp/applications/neon/app.py +86 -192
  59. universal_mcp/applications/notion/app.py +21 -36
  60. universal_mcp/applications/onedrive/app.py +14 -36
  61. universal_mcp/applications/openai/app.py +42 -165
  62. universal_mcp/applications/outlook/app.py +16 -76
  63. universal_mcp/applications/perplexity/app.py +4 -19
  64. universal_mcp/applications/pipedrive/app.py +832 -3142
  65. universal_mcp/applications/posthog/app.py +163 -432
  66. universal_mcp/applications/reddit/app.py +40 -139
  67. universal_mcp/applications/resend/app.py +41 -107
  68. universal_mcp/applications/retell/app.py +14 -41
  69. universal_mcp/applications/rocketlane/app.py +221 -934
  70. universal_mcp/applications/scraper/README.md +7 -4
  71. universal_mcp/applications/scraper/app.py +280 -93
  72. universal_mcp/applications/semanticscholar/app.py +22 -64
  73. universal_mcp/applications/semrush/app.py +43 -77
  74. universal_mcp/applications/sendgrid/app.py +512 -1262
  75. universal_mcp/applications/sentry/app.py +271 -906
  76. universal_mcp/applications/serpapi/app.py +40 -143
  77. universal_mcp/applications/sharepoint/app.py +15 -37
  78. universal_mcp/applications/shopify/app.py +1551 -4287
  79. universal_mcp/applications/shortcut/app.py +155 -417
  80. universal_mcp/applications/slack/app.py +50 -101
  81. universal_mcp/applications/spotify/app.py +126 -325
  82. universal_mcp/applications/supabase/app.py +104 -213
  83. universal_mcp/applications/tavily/app.py +1 -1
  84. universal_mcp/applications/trello/app.py +693 -2656
  85. universal_mcp/applications/twilio/app.py +14 -50
  86. universal_mcp/applications/twitter/api_segments/compliance_api.py +4 -14
  87. universal_mcp/applications/twitter/api_segments/dm_conversations_api.py +6 -18
  88. universal_mcp/applications/twitter/api_segments/likes_api.py +1 -3
  89. universal_mcp/applications/twitter/api_segments/lists_api.py +5 -15
  90. universal_mcp/applications/twitter/api_segments/trends_api.py +1 -3
  91. universal_mcp/applications/twitter/api_segments/tweets_api.py +9 -31
  92. universal_mcp/applications/twitter/api_segments/usage_api.py +1 -5
  93. universal_mcp/applications/twitter/api_segments/users_api.py +14 -42
  94. universal_mcp/applications/whatsapp/app.py +35 -186
  95. universal_mcp/applications/whatsapp/audio.py +2 -6
  96. universal_mcp/applications/whatsapp/whatsapp.py +17 -51
  97. universal_mcp/applications/whatsapp_business/app.py +70 -283
  98. universal_mcp/applications/wrike/app.py +45 -118
  99. universal_mcp/applications/yahoo_finance/app.py +19 -65
  100. universal_mcp/applications/youtube/app.py +75 -261
  101. universal_mcp/applications/zenquotes/app.py +2 -2
  102. {universal_mcp_applications-0.1.30rc1.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/METADATA +2 -2
  103. {universal_mcp_applications-0.1.30rc1.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/RECORD +105 -106
  104. universal_mcp/applications/scraper/scraper_testers.py +0 -17
  105. {universal_mcp_applications-0.1.30rc1.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/WHEEL +0 -0
  106. {universal_mcp_applications-0.1.30rc1.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/licenses/LICENSE +0 -0
@@ -1,5 +1,4 @@
1
1
  from typing import Any
2
-
3
2
  from universal_mcp.applications.application import APIApplication
4
3
  from universal_mcp.integrations import Integration
5
4
 
@@ -9,7 +8,7 @@ class SemanticscholarApp(APIApplication):
9
8
  super().__init__(name="semanticscholar", integration=integration, **kwargs)
10
9
  self.base_url = "/graph/v1"
11
10
 
12
- def post_graph_get_authors(self, fields=None, ids=None) -> dict[str, Any]:
11
+ async def post_graph_get_authors(self, fields=None, ids=None) -> dict[str, Any]:
13
12
  """
14
13
  Creates a batch of authors using the provided JSON data in the request body, optionally specifying fields to include in the response via a query parameter.
15
14
 
@@ -23,9 +22,7 @@ class SemanticscholarApp(APIApplication):
23
22
  Tags:
24
23
  Author Data
25
24
  """
26
- request_body = {
27
- "ids": ids,
28
- }
25
+ request_body = {"ids": ids}
29
26
  request_body = {k: v for k, v in request_body.items() if v is not None}
30
27
  url = f"{self.base_url}/author/batch"
31
28
  query_params = {k: v for k, v in [("fields", fields)] if v is not None}
@@ -33,9 +30,7 @@ class SemanticscholarApp(APIApplication):
33
30
  response.raise_for_status()
34
31
  return response.json()
35
32
 
36
- def get_graph_get_author_search(
37
- self, query, offset=None, limit=None, fields=None
38
- ) -> dict[str, Any]:
33
+ async def get_graph_get_author_search(self, query, offset=None, limit=None, fields=None) -> dict[str, Any]:
39
34
  """
40
35
  Searches for authors based on a query string with optional pagination and field selection parameters.
41
36
 
@@ -52,21 +47,12 @@ class SemanticscholarApp(APIApplication):
52
47
  Author Data
53
48
  """
54
49
  url = f"{self.base_url}/author/search"
55
- query_params = {
56
- k: v
57
- for k, v in [
58
- ("offset", offset),
59
- ("limit", limit),
60
- ("fields", fields),
61
- ("query", query),
62
- ]
63
- if v is not None
64
- }
50
+ query_params = {k: v for k, v in [("offset", offset), ("limit", limit), ("fields", fields), ("query", query)] if v is not None}
65
51
  response = self._get(url, params=query_params)
66
52
  response.raise_for_status()
67
53
  return response.json()
68
54
 
69
- def get_graph_get_author(self, author_id, fields=None) -> dict[str, Any]:
55
+ async def get_graph_get_author(self, author_id, fields=None) -> dict[str, Any]:
70
56
  """
71
57
  Retrieves the profile information for a specific author identified by the `author_id` and returns it with optional fields specified in the `fields` query parameter.
72
58
 
@@ -88,9 +74,7 @@ class SemanticscholarApp(APIApplication):
88
74
  response.raise_for_status()
89
75
  return response.json()
90
76
 
91
- def get_graph_get_author_papers(
92
- self, author_id, offset=None, limit=None, fields=None
93
- ) -> dict[str, Any]:
77
+ async def get_graph_get_author_papers(self, author_id, offset=None, limit=None, fields=None) -> dict[str, Any]:
94
78
  """
95
79
  Retrieves a paginated list of papers authored by the specified author, with optional field selection.
96
80
 
@@ -109,16 +93,12 @@ class SemanticscholarApp(APIApplication):
109
93
  if author_id is None:
110
94
  raise ValueError("Missing required parameter 'author_id'")
111
95
  url = f"{self.base_url}/author/{author_id}/papers"
112
- query_params = {
113
- k: v
114
- for k, v in [("offset", offset), ("limit", limit), ("fields", fields)]
115
- if v is not None
116
- }
96
+ query_params = {k: v for k, v in [("offset", offset), ("limit", limit), ("fields", fields)] if v is not None}
117
97
  response = self._get(url, params=query_params)
118
98
  response.raise_for_status()
119
99
  return response.json()
120
100
 
121
- def get_graph_get_paper_autocomplete(self, query) -> dict[str, Any]:
101
+ async def get_graph_get_paper_autocomplete(self, query) -> dict[str, Any]:
122
102
  """
123
103
  Provides an autocomplete suggestion list based on a required query string parameter.
124
104
 
@@ -137,7 +117,7 @@ class SemanticscholarApp(APIApplication):
137
117
  response.raise_for_status()
138
118
  return response.json()
139
119
 
140
- def post_graph_get_papers(self, fields=None, ids=None) -> dict[str, Any]:
120
+ async def post_graph_get_papers(self, fields=None, ids=None) -> dict[str, Any]:
141
121
  """
142
122
  Creates a batch of papers using JSON data in the request body and optionally specifies fields to include in the response.
143
123
 
@@ -151,9 +131,7 @@ class SemanticscholarApp(APIApplication):
151
131
  Tags:
152
132
  Paper Data
153
133
  """
154
- request_body = {
155
- "ids": ids,
156
- }
134
+ request_body = {"ids": ids}
157
135
  request_body = {k: v for k, v in request_body.items() if v is not None}
158
136
  url = f"{self.base_url}/paper/batch"
159
137
  query_params = {k: v for k, v in [("fields", fields)] if v is not None}
@@ -161,7 +139,7 @@ class SemanticscholarApp(APIApplication):
161
139
  response.raise_for_status()
162
140
  return response.json()
163
141
 
164
- def get_graph_paper_relevance_search(
142
+ async def get_graph_paper_relevance_search(
165
143
  self,
166
144
  query,
167
145
  fields=None,
@@ -219,7 +197,7 @@ class SemanticscholarApp(APIApplication):
219
197
  response.raise_for_status()
220
198
  return response.json()
221
199
 
222
- def get_graph_paper_bulk_search(
200
+ async def get_graph_paper_bulk_search(
223
201
  self,
224
202
  query,
225
203
  token=None,
@@ -277,7 +255,7 @@ class SemanticscholarApp(APIApplication):
277
255
  response.raise_for_status()
278
256
  return response.json()
279
257
 
280
- def get_graph_paper_title_search(
258
+ async def get_graph_paper_title_search(
281
259
  self,
282
260
  query,
283
261
  fields=None,
@@ -329,7 +307,7 @@ class SemanticscholarApp(APIApplication):
329
307
  response.raise_for_status()
330
308
  return response.json()
331
309
 
332
- def get_graph_get_paper(self, paper_id, fields=None) -> dict[str, Any]:
310
+ async def get_graph_get_paper(self, paper_id, fields=None) -> dict[str, Any]:
333
311
  """
334
312
  Retrieves details of a paper by its ID, optionally specifying fields to include in the response.
335
313
 
@@ -351,9 +329,7 @@ class SemanticscholarApp(APIApplication):
351
329
  response.raise_for_status()
352
330
  return response.json()
353
331
 
354
- def get_graph_get_paper_authors(
355
- self, paper_id, offset=None, limit=None, fields=None
356
- ) -> dict[str, Any]:
332
+ async def get_graph_get_paper_authors(self, paper_id, offset=None, limit=None, fields=None) -> dict[str, Any]:
357
333
  """
358
334
  Retrieves a list of authors for a specific paper identified by the `paper_id`, allowing optional parameters for offset, limit, and fields to customize the response.
359
335
 
@@ -372,18 +348,12 @@ class SemanticscholarApp(APIApplication):
372
348
  if paper_id is None:
373
349
  raise ValueError("Missing required parameter 'paper_id'")
374
350
  url = f"{self.base_url}/paper/{paper_id}/authors"
375
- query_params = {
376
- k: v
377
- for k, v in [("offset", offset), ("limit", limit), ("fields", fields)]
378
- if v is not None
379
- }
351
+ query_params = {k: v for k, v in [("offset", offset), ("limit", limit), ("fields", fields)] if v is not None}
380
352
  response = self._get(url, params=query_params)
381
353
  response.raise_for_status()
382
354
  return response.json()
383
355
 
384
- def get_graph_get_paper_citations(
385
- self, paper_id, offset=None, limit=None, fields=None
386
- ) -> dict[str, Any]:
356
+ async def get_graph_get_paper_citations(self, paper_id, offset=None, limit=None, fields=None) -> dict[str, Any]:
387
357
  """
388
358
  Retrieves a list of citations for a specific paper, identified by its paper ID, with optional parameters for offset, limit, and fields.
389
359
 
@@ -402,18 +372,12 @@ class SemanticscholarApp(APIApplication):
402
372
  if paper_id is None:
403
373
  raise ValueError("Missing required parameter 'paper_id'")
404
374
  url = f"{self.base_url}/paper/{paper_id}/citations"
405
- query_params = {
406
- k: v
407
- for k, v in [("offset", offset), ("limit", limit), ("fields", fields)]
408
- if v is not None
409
- }
375
+ query_params = {k: v for k, v in [("offset", offset), ("limit", limit), ("fields", fields)] if v is not None}
410
376
  response = self._get(url, params=query_params)
411
377
  response.raise_for_status()
412
378
  return response.json()
413
379
 
414
- def get_graph_get_paper_references(
415
- self, paper_id, offset=None, limit=None, fields=None
416
- ) -> dict[str, Any]:
380
+ async def get_graph_get_paper_references(self, paper_id, offset=None, limit=None, fields=None) -> dict[str, Any]:
417
381
  """
418
382
  Retrieves references for a specific paper by its ID using the "GET" method and allows optional filtering by offset, limit, and fields for customizable output.
419
383
 
@@ -432,16 +396,12 @@ class SemanticscholarApp(APIApplication):
432
396
  if paper_id is None:
433
397
  raise ValueError("Missing required parameter 'paper_id'")
434
398
  url = f"{self.base_url}/paper/{paper_id}/references"
435
- query_params = {
436
- k: v
437
- for k, v in [("offset", offset), ("limit", limit), ("fields", fields)]
438
- if v is not None
439
- }
399
+ query_params = {k: v for k, v in [("offset", offset), ("limit", limit), ("fields", fields)] if v is not None}
440
400
  response = self._get(url, params=query_params)
441
401
  response.raise_for_status()
442
402
  return response.json()
443
403
 
444
- def get_snippet_search(self, query, limit=None) -> dict[str, Any]:
404
+ async def get_snippet_search(self, query, limit=None) -> dict[str, Any]:
445
405
  """
446
406
  Retrieves a list of search results based on a specified query string, optionally limited by a user-defined number of results, using the "GET" method at the "/snippet/search" endpoint.
447
407
 
@@ -456,9 +416,7 @@ class SemanticscholarApp(APIApplication):
456
416
  Snippet Text
457
417
  """
458
418
  url = f"{self.base_url}/snippet/search"
459
- query_params = {
460
- k: v for k, v in [("query", query), ("limit", limit)] if v is not None
461
- }
419
+ query_params = {k: v for k, v in [("query", query), ("limit", limit)] if v is not None}
462
420
  response = self._get(url, params=query_params)
463
421
  response.raise_for_status()
464
422
  return response.json()
@@ -1,5 +1,4 @@
1
1
  from typing import Any
2
-
3
2
  from universal_mcp.applications.application import APIApplication
4
3
  from universal_mcp.integrations import Integration
5
4
 
@@ -20,7 +19,6 @@ class SemrushApp(APIApplication):
20
19
  credentials = self.integration.get_credentials()
21
20
  if "api_key" in credentials:
22
21
  self.api_key = credentials["api_key"]
23
- # Always return empty headers
24
22
  return {}
25
23
 
26
24
  @property
@@ -44,22 +42,17 @@ class SemrushApp(APIApplication):
44
42
  """
45
43
  Builds the parameters dictionary and makes a GET request to the Semrush API.
46
44
  """
47
- params = {
48
- "type": report_type,
49
- "key": self.api_key,
50
- }
45
+ params = {"type": report_type, "key": self.api_key}
51
46
  for key, value in kwargs.items():
52
47
  if value is not None:
53
48
  params[key] = value
54
-
55
49
  url = self.base_url
56
50
  if "analytics" in report_type:
57
51
  url = f"{self.base_url}/analytics/v1"
58
-
59
52
  response = self._get(url, params=params)
60
53
  return self._handle_response(response)
61
54
 
62
- def domain_ad_history(
55
+ async def domain_ad_history(
63
56
  self,
64
57
  domain: str,
65
58
  database: str = "us",
@@ -91,7 +84,7 @@ class SemrushApp(APIApplication):
91
84
  export_decode=export_decode,
92
85
  )
93
86
 
94
- def domain_organic_pages(
87
+ async def domain_organic_pages(
95
88
  self,
96
89
  domain: str,
97
90
  database: str = "us",
@@ -123,7 +116,7 @@ class SemrushApp(APIApplication):
123
116
  export_decode=export_decode,
124
117
  )
125
118
 
126
- def domain_organic_search_keywords(
119
+ async def domain_organic_search_keywords(
127
120
  self,
128
121
  domain: str,
129
122
  database: str = "us",
@@ -183,7 +176,7 @@ class SemrushApp(APIApplication):
183
176
  export_escape=export_escape,
184
177
  )
185
178
 
186
- def domain_organic_subdomains(
179
+ async def domain_organic_subdomains(
187
180
  self,
188
181
  domain: str,
189
182
  database: str = "us",
@@ -213,7 +206,7 @@ class SemrushApp(APIApplication):
213
206
  export_decode=export_decode,
214
207
  )
215
208
 
216
- def domain_paid_search_keywords(
209
+ async def domain_paid_search_keywords(
217
210
  self,
218
211
  domain: str,
219
212
  database: str = "us",
@@ -247,7 +240,7 @@ class SemrushApp(APIApplication):
247
240
  export_decode=export_decode,
248
241
  )
249
242
 
250
- def domain_pla_search_keywords(
243
+ async def domain_pla_search_keywords(
251
244
  self,
252
245
  domain: str,
253
246
  database: str = "us",
@@ -277,7 +270,7 @@ class SemrushApp(APIApplication):
277
270
  export_decode=export_decode,
278
271
  )
279
272
 
280
- def domain_vs_domain(
273
+ async def domain_vs_domain(
281
274
  self,
282
275
  domains: str,
283
276
  database: str = "us",
@@ -309,7 +302,7 @@ class SemrushApp(APIApplication):
309
302
  export_decode=export_decode,
310
303
  )
311
304
 
312
- def backlinks(
305
+ async def backlinks(
313
306
  self,
314
307
  target: str,
315
308
  target_type: str,
@@ -335,7 +328,7 @@ class SemrushApp(APIApplication):
335
328
  display_filter=display_filter,
336
329
  )
337
330
 
338
- def backlinks_overview(
331
+ async def backlinks_overview(
339
332
  self,
340
333
  target: str,
341
334
  target_type: str,
@@ -361,12 +354,8 @@ class SemrushApp(APIApplication):
361
354
  display_filter=display_filter,
362
355
  )
363
356
 
364
- def keyword_difficulty(
365
- self,
366
- phrase: str,
367
- database: str = "us",
368
- export_columns: str | None = None,
369
- export_escape: int | None = None,
357
+ async def keyword_difficulty(
358
+ self, phrase: str, database: str = "us", export_columns: str | None = None, export_escape: int | None = None
370
359
  ) -> dict[str, Any]:
371
360
  """
372
361
  Get keyword difficulty data to estimate ranking difficulty for organic search terms.
@@ -374,14 +363,10 @@ class SemrushApp(APIApplication):
374
363
  if not phrase:
375
364
  raise ValueError("Phrase parameter is required")
376
365
  return self._build_params_and_get(
377
- "phrase_kdi",
378
- phrase=phrase,
379
- database=database,
380
- export_columns=export_columns,
381
- export_escape=export_escape,
366
+ "phrase_kdi", phrase=phrase, database=database, export_columns=export_columns, export_escape=export_escape
382
367
  )
383
368
 
384
- def ads_copies(
369
+ async def ads_copies(
385
370
  self,
386
371
  domain: str,
387
372
  database: str = "us",
@@ -411,7 +396,7 @@ class SemrushApp(APIApplication):
411
396
  export_decode=export_decode,
412
397
  )
413
398
 
414
- def anchors(
399
+ async def anchors(
415
400
  self,
416
401
  target: str,
417
402
  target_type: str,
@@ -435,24 +420,15 @@ class SemrushApp(APIApplication):
435
420
  display_offset=display_offset,
436
421
  )
437
422
 
438
- def authority_score_profile(self, target: str, target_type: str) -> dict[str, Any]:
423
+ async def authority_score_profile(self, target: str, target_type: str) -> dict[str, Any]:
439
424
  """
440
425
  Get distribution of referring domains by Authority Score from 0 to 100.
441
426
  """
442
427
  if not target or not target_type:
443
428
  raise ValueError("Target and target_type parameters are required")
444
- return self._build_params_and_get(
445
- "backlinks_ascore_profile_analytics",
446
- target=target,
447
- target_type=target_type,
448
- )
429
+ return self._build_params_and_get("backlinks_ascore_profile_analytics", target=target, target_type=target_type)
449
430
 
450
- def batch_comparison(
451
- self,
452
- targets: list[str],
453
- target_types: list[str],
454
- export_columns: str | None = None,
455
- ) -> dict[str, Any]:
431
+ async def batch_comparison(self, targets: list[str], target_types: list[str], export_columns: str | None = None) -> dict[str, Any]:
456
432
  """
457
433
  Compare backlink profiles and link-building progress across multiple competitors.
458
434
  """
@@ -461,17 +437,12 @@ class SemrushApp(APIApplication):
461
437
  if len(targets) > 200:
462
438
  raise ValueError("Maximum 200 targets allowed")
463
439
  if len(targets) != len(target_types):
464
- raise ValueError(
465
- "Targets and target_types arrays must have the same length"
466
- )
440
+ raise ValueError("Targets and target_types arrays must have the same length")
467
441
  return self._build_params_and_get(
468
- "backlinks_comparison_analytics",
469
- targets=targets,
470
- target_types=target_types,
471
- export_columns=export_columns,
442
+ "backlinks_comparison_analytics", targets=targets, target_types=target_types, export_columns=export_columns
472
443
  )
473
444
 
474
- def batch_keyword_overview(
445
+ async def batch_keyword_overview(
475
446
  self,
476
447
  phrase: str,
477
448
  database: str = "us",
@@ -495,7 +466,7 @@ class SemrushApp(APIApplication):
495
466
  export_columns=export_columns,
496
467
  )
497
468
 
498
- def broad_match_keyword(
469
+ async def broad_match_keyword(
499
470
  self,
500
471
  phrase: str,
501
472
  database: str = "us",
@@ -525,22 +496,17 @@ class SemrushApp(APIApplication):
525
496
  display_filter=display_filter,
526
497
  )
527
498
 
528
- def categories(
529
- self, target: str, target_type: str, export_columns: str | None = None
530
- ) -> dict[str, Any]:
499
+ async def categories(self, target: str, target_type: str, export_columns: str | None = None) -> dict[str, Any]:
531
500
  """
532
501
  Get list of categories that the queried domain belongs to with confidence ratings.
533
502
  """
534
503
  if not target or not target_type:
535
504
  raise ValueError("Target and target_type parameters are required")
536
505
  return self._build_params_and_get(
537
- "backlinks_categories_analytics",
538
- target=target,
539
- target_type=target_type,
540
- export_columns=export_columns,
506
+ "backlinks_categories_analytics", target=target, target_type=target_type, export_columns=export_columns
541
507
  )
542
508
 
543
- def categories_profile(
509
+ async def categories_profile(
544
510
  self,
545
511
  target: str,
546
512
  target_type: str,
@@ -562,7 +528,7 @@ class SemrushApp(APIApplication):
562
528
  display_offset=display_offset,
563
529
  )
564
530
 
565
- def competitors(
531
+ async def competitors(
566
532
  self,
567
533
  target: str,
568
534
  target_type: str,
@@ -584,7 +550,7 @@ class SemrushApp(APIApplication):
584
550
  display_offset=display_offset,
585
551
  )
586
552
 
587
- def competitors_organic_search(
553
+ async def competitors_organic_search(
588
554
  self,
589
555
  domain: str,
590
556
  database: str = "us",
@@ -614,7 +580,7 @@ class SemrushApp(APIApplication):
614
580
  display_sort=display_sort,
615
581
  )
616
582
 
617
- def competitors_paid_search(
583
+ async def competitors_paid_search(
618
584
  self,
619
585
  domain: str,
620
586
  database: str = "us",
@@ -644,7 +610,7 @@ class SemrushApp(APIApplication):
644
610
  display_sort=display_sort,
645
611
  )
646
612
 
647
- def indexed_pages(
613
+ async def indexed_pages(
648
614
  self,
649
615
  target: str,
650
616
  target_type: str,
@@ -668,7 +634,7 @@ class SemrushApp(APIApplication):
668
634
  display_offset=display_offset,
669
635
  )
670
636
 
671
- def keyword_ads_history(
637
+ async def keyword_ads_history(
672
638
  self,
673
639
  phrase: str,
674
640
  database: str = "us",
@@ -694,7 +660,7 @@ class SemrushApp(APIApplication):
694
660
  export_columns=export_columns,
695
661
  )
696
662
 
697
- def keyword_overview_all_databases(
663
+ async def keyword_overview_all_databases(
698
664
  self,
699
665
  phrase: str,
700
666
  database: str | None = None,
@@ -716,7 +682,7 @@ class SemrushApp(APIApplication):
716
682
  export_columns=export_columns,
717
683
  )
718
684
 
719
- def keyword_overview_one_database(
685
+ async def keyword_overview_one_database(
720
686
  self,
721
687
  phrase: str,
722
688
  database: str = "us",
@@ -740,7 +706,7 @@ class SemrushApp(APIApplication):
740
706
  export_columns=export_columns,
741
707
  )
742
708
 
743
- def organic_results(
709
+ async def organic_results(
744
710
  self,
745
711
  phrase: str,
746
712
  database: str = "us",
@@ -770,7 +736,7 @@ class SemrushApp(APIApplication):
770
736
  positions_type=positions_type,
771
737
  )
772
738
 
773
- def paid_results(
739
+ async def paid_results(
774
740
  self,
775
741
  phrase: str,
776
742
  database: str = "us",
@@ -798,7 +764,7 @@ class SemrushApp(APIApplication):
798
764
  export_columns=export_columns,
799
765
  )
800
766
 
801
- def phrase_questions(
767
+ async def phrase_questions(
802
768
  self,
803
769
  phrase: str,
804
770
  database: str = "us",
@@ -828,7 +794,7 @@ class SemrushApp(APIApplication):
828
794
  display_filter=display_filter,
829
795
  )
830
796
 
831
- def pla_competitors(
797
+ async def pla_competitors(
832
798
  self,
833
799
  domain: str,
834
800
  database: str = "us",
@@ -856,7 +822,7 @@ class SemrushApp(APIApplication):
856
822
  display_sort=display_sort,
857
823
  )
858
824
 
859
- def pla_copies(
825
+ async def pla_copies(
860
826
  self,
861
827
  domain: str,
862
828
  database: str = "us",
@@ -886,7 +852,7 @@ class SemrushApp(APIApplication):
886
852
  display_filter=display_filter,
887
853
  )
888
854
 
889
- def referring_domains(
855
+ async def referring_domains(
890
856
  self,
891
857
  target: str,
892
858
  target_type: str,
@@ -912,7 +878,7 @@ class SemrushApp(APIApplication):
912
878
  display_filter=display_filter,
913
879
  )
914
880
 
915
- def referring_domains_by_country(
881
+ async def referring_domains_by_country(
916
882
  self,
917
883
  target: str,
918
884
  target_type: str,
@@ -936,7 +902,7 @@ class SemrushApp(APIApplication):
936
902
  display_offset=display_offset,
937
903
  )
938
904
 
939
- def related_keywords(
905
+ async def related_keywords(
940
906
  self,
941
907
  phrase: str,
942
908
  database: str = "us",
@@ -966,7 +932,7 @@ class SemrushApp(APIApplication):
966
932
  display_filter=display_filter,
967
933
  )
968
934
 
969
- def tlds_distribution(
935
+ async def tlds_distribution(
970
936
  self,
971
937
  target: str,
972
938
  target_type: str,
@@ -990,7 +956,7 @@ class SemrushApp(APIApplication):
990
956
  display_offset=display_offset,
991
957
  )
992
958
 
993
- def url_organic_search_keywords(
959
+ async def url_organic_search_keywords(
994
960
  self,
995
961
  url: str,
996
962
  database: str = "us",
@@ -1020,7 +986,7 @@ class SemrushApp(APIApplication):
1020
986
  display_sort=display_sort,
1021
987
  )
1022
988
 
1023
- def url_paid_search_keywords(
989
+ async def url_paid_search_keywords(
1024
990
  self,
1025
991
  url: str,
1026
992
  database: str = "us",