anchorbrowser 0.1.0a3__py3-none-any.whl → 0.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. anchorbrowser/__init__.py +3 -1
  2. anchorbrowser/_base_client.py +16 -13
  3. anchorbrowser/_client.py +21 -9
  4. anchorbrowser/_compat.py +48 -48
  5. anchorbrowser/_files.py +4 -4
  6. anchorbrowser/_models.py +51 -45
  7. anchorbrowser/_qs.py +7 -7
  8. anchorbrowser/_types.py +53 -12
  9. anchorbrowser/_utils/__init__.py +9 -2
  10. anchorbrowser/_utils/_compat.py +45 -0
  11. anchorbrowser/_utils/_datetime_parse.py +136 -0
  12. anchorbrowser/_utils/_transform.py +13 -3
  13. anchorbrowser/_utils/_typing.py +6 -1
  14. anchorbrowser/_utils/_utils.py +4 -5
  15. anchorbrowser/_version.py +1 -1
  16. anchorbrowser/lib/browser.py +1 -1
  17. anchorbrowser/resources/__init__.py +14 -0
  18. anchorbrowser/resources/events.py +270 -0
  19. anchorbrowser/resources/extensions.py +9 -9
  20. anchorbrowser/resources/profiles.py +31 -43
  21. anchorbrowser/resources/sessions/all.py +5 -5
  22. anchorbrowser/resources/sessions/clipboard.py +5 -5
  23. anchorbrowser/resources/sessions/keyboard.py +11 -13
  24. anchorbrowser/resources/sessions/mouse.py +19 -19
  25. anchorbrowser/resources/sessions/recordings/primary.py +3 -3
  26. anchorbrowser/resources/sessions/recordings/recordings.py +7 -7
  27. anchorbrowser/resources/sessions/sessions.py +307 -30
  28. anchorbrowser/resources/tools.py +107 -37
  29. anchorbrowser/types/__init__.py +7 -0
  30. anchorbrowser/types/event_signal_params.py +13 -0
  31. anchorbrowser/types/event_wait_for_params.py +14 -0
  32. anchorbrowser/types/event_wait_for_response.py +12 -0
  33. anchorbrowser/types/extension_manifest.py +6 -1
  34. anchorbrowser/types/profile_create_params.py +3 -6
  35. anchorbrowser/types/profile_list_response.py +0 -3
  36. anchorbrowser/types/profile_retrieve_response.py +0 -3
  37. anchorbrowser/types/profile_update_params.py +0 -6
  38. anchorbrowser/types/session_create_params.py +262 -26
  39. anchorbrowser/types/session_list_pages_response.py +25 -0
  40. anchorbrowser/types/session_retrieve_response.py +46 -0
  41. anchorbrowser/types/session_scroll_params.py +3 -0
  42. anchorbrowser/types/session_upload_file_params.py +14 -0
  43. anchorbrowser/types/session_upload_file_response.py +17 -0
  44. anchorbrowser/types/sessions/keyboard_shortcut_params.py +2 -2
  45. anchorbrowser/types/sessions/recording_list_response.py +4 -8
  46. anchorbrowser/types/tool_fetch_webpage_params.py +15 -0
  47. anchorbrowser/types/tool_perform_web_task_params.py +17 -1
  48. anchorbrowser/types/tool_perform_web_task_response.py +3 -3
  49. {anchorbrowser-0.1.0a3.dist-info → anchorbrowser-0.1.1.dist-info}/METADATA +8 -9
  50. {anchorbrowser-0.1.0a3.dist-info → anchorbrowser-0.1.1.dist-info}/RECORD +52 -42
  51. {anchorbrowser-0.1.0a3.dist-info → anchorbrowser-0.1.1.dist-info}/WHEEL +0 -0
  52. {anchorbrowser-0.1.0a3.dist-info → anchorbrowser-0.1.1.dist-info}/licenses/LICENSE +0 -0
@@ -5,11 +5,15 @@ from __future__ import annotations
5
5
  from typing import Union
6
6
  from typing_extensions import Literal, Required, TypeAlias, TypedDict
7
7
 
8
+ from .._types import SequenceNotStr
9
+
8
10
  __all__ = [
9
11
  "SessionCreateParams",
10
12
  "Browser",
11
13
  "BrowserAdblock",
12
14
  "BrowserCaptchaSolver",
15
+ "BrowserDisableWebSecurity",
16
+ "BrowserFullscreen",
13
17
  "BrowserHeadless",
14
18
  "BrowserP2pDownload",
15
19
  "BrowserPopupBlocker",
@@ -18,9 +22,8 @@ __all__ = [
18
22
  "Session",
19
23
  "SessionLiveView",
20
24
  "SessionProxy",
21
- "SessionProxyAnchorResidentialProxyType",
22
- "SessionProxyAnchorMobileProxyType",
23
- "SessionProxyCustomProxyType",
25
+ "SessionProxyAnchorProxy",
26
+ "SessionProxyCustomProxy",
24
27
  "SessionRecording",
25
28
  "SessionTimeout",
26
29
  ]
@@ -47,6 +50,23 @@ class BrowserCaptchaSolver(TypedDict, total=False):
47
50
  """
48
51
 
49
52
 
53
+ class BrowserDisableWebSecurity(TypedDict, total=False):
54
+ active: bool
55
+ """Whether to disable web security features (CORS, same-origin policy, etc.).
56
+
57
+ Allows accessing iframes and resources from different origins. Defaults to
58
+ `false`.
59
+ """
60
+
61
+
62
+ class BrowserFullscreen(TypedDict, total=False):
63
+ active: bool
64
+ """Enable or disable fullscreen mode.
65
+
66
+ When enabled, the browser will start in fullscreen mode. Defaults to `false`.
67
+ """
68
+
69
+
50
70
  class BrowserHeadless(TypedDict, total=False):
51
71
  active: bool
52
72
  """Whether browser should be headless or headful. Defaults to `false`."""
@@ -79,10 +99,10 @@ class BrowserProfile(TypedDict, total=False):
79
99
  browser session ends. Defaults to `false`.
80
100
  """
81
101
 
82
- store_cache: bool
83
- """
84
- Indicates whether the browser session cache should be saved when the browser
85
- session ends. Defaults to `false`.
102
+ reset_preferences: bool
103
+ """When enabled, resets the profile's preferences on session creation.
104
+
105
+ Defaults to `false`.
86
106
  """
87
107
 
88
108
 
@@ -101,6 +121,18 @@ class Browser(TypedDict, total=False):
101
121
  captcha_solver: BrowserCaptchaSolver
102
122
  """Configuration for captcha-solving."""
103
123
 
124
+ disable_web_security: BrowserDisableWebSecurity
125
+ """Configuration for disabling web security features."""
126
+
127
+ extensions: SequenceNotStr[str]
128
+ """Array of extension IDs to load in the browser session.
129
+
130
+ Extensions must be previously uploaded using the Extensions API.
131
+ """
132
+
133
+ fullscreen: BrowserFullscreen
134
+ """Configuration for fullscreen mode."""
135
+
104
136
  headless: BrowserHeadless
105
137
  """Configuration for headless mode."""
106
138
 
@@ -122,27 +154,230 @@ class SessionLiveView(TypedDict, total=False):
122
154
  """Enable or disable read-only mode for live viewing. Defaults to `false`."""
123
155
 
124
156
 
125
- class SessionProxyAnchorResidentialProxyType(TypedDict, total=False):
126
- type: Required[Literal["anchor_residential"]]
157
+ class SessionProxyAnchorProxy(TypedDict, total=False):
158
+ active: Required[bool]
127
159
 
128
- active: bool
129
160
  """Enable or disable proxy usage. Defaults to `false`."""
161
+ city: str
162
+ """City name for precise geographic targeting.
130
163
 
131
- country_code: Literal["us", "uk", "fr", "it", "jp", "au", "de", "fi", "ca"]
132
- """Country code for residential proxy"""
164
+ Supported for anchor_proxy only. Can only be used when region is also provided.
165
+ Example: "San Francisco", "los-angeles", "london"
166
+ """
133
167
 
168
+ country_code: Literal[
169
+ "af",
170
+ "al",
171
+ "dz",
172
+ "ad",
173
+ "ao",
174
+ "as",
175
+ "ag",
176
+ "ar",
177
+ "am",
178
+ "aw",
179
+ "au",
180
+ "at",
181
+ "az",
182
+ "bs",
183
+ "bh",
184
+ "bb",
185
+ "by",
186
+ "be",
187
+ "bz",
188
+ "bj",
189
+ "bm",
190
+ "bo",
191
+ "ba",
192
+ "br",
193
+ "bg",
194
+ "bf",
195
+ "cm",
196
+ "ca",
197
+ "cv",
198
+ "td",
199
+ "cl",
200
+ "co",
201
+ "cg",
202
+ "cr",
203
+ "ci",
204
+ "hr",
205
+ "cu",
206
+ "cy",
207
+ "cz",
208
+ "dk",
209
+ "dm",
210
+ "do",
211
+ "ec",
212
+ "eg",
213
+ "sv",
214
+ "ee",
215
+ "et",
216
+ "fo",
217
+ "fi",
218
+ "fr",
219
+ "gf",
220
+ "pf",
221
+ "ga",
222
+ "gm",
223
+ "ge",
224
+ "de",
225
+ "gh",
226
+ "gi",
227
+ "gr",
228
+ "gd",
229
+ "gp",
230
+ "gt",
231
+ "gg",
232
+ "gn",
233
+ "gw",
234
+ "gy",
235
+ "ht",
236
+ "hn",
237
+ "hu",
238
+ "is",
239
+ "in",
240
+ "ir",
241
+ "iq",
242
+ "ie",
243
+ "il",
244
+ "it",
245
+ "jm",
246
+ "jp",
247
+ "jo",
248
+ "kz",
249
+ "kw",
250
+ "kg",
251
+ "lv",
252
+ "lb",
253
+ "ly",
254
+ "li",
255
+ "lt",
256
+ "lu",
257
+ "mk",
258
+ "ml",
259
+ "mt",
260
+ "mq",
261
+ "mr",
262
+ "mx",
263
+ "md",
264
+ "mc",
265
+ "me",
266
+ "ma",
267
+ "nl",
268
+ "nz",
269
+ "ni",
270
+ "ng",
271
+ "no",
272
+ "pk",
273
+ "pa",
274
+ "py",
275
+ "pe",
276
+ "ph",
277
+ "pl",
278
+ "pt",
279
+ "pr",
280
+ "qa",
281
+ "ro",
282
+ "lc",
283
+ "sm",
284
+ "sa",
285
+ "sn",
286
+ "rs",
287
+ "sc",
288
+ "sl",
289
+ "sk",
290
+ "si",
291
+ "so",
292
+ "za",
293
+ "kr",
294
+ "es",
295
+ "sr",
296
+ "se",
297
+ "ch",
298
+ "sy",
299
+ "st",
300
+ "tw",
301
+ "tj",
302
+ "tg",
303
+ "tt",
304
+ "tn",
305
+ "tr",
306
+ "tc",
307
+ "ua",
308
+ "ae",
309
+ "us",
310
+ "uy",
311
+ "uz",
312
+ "ve",
313
+ "ye",
314
+ "bd",
315
+ "bw",
316
+ "bn",
317
+ "bi",
318
+ "kh",
319
+ "cn",
320
+ "dj",
321
+ "gq",
322
+ "sz",
323
+ "fj",
324
+ "hk",
325
+ "id",
326
+ "ke",
327
+ "la",
328
+ "ls",
329
+ "lr",
330
+ "mg",
331
+ "mw",
332
+ "my",
333
+ "mv",
334
+ "mn",
335
+ "mz",
336
+ "mm",
337
+ "na",
338
+ "np",
339
+ "nc",
340
+ "ne",
341
+ "om",
342
+ "pg",
343
+ "ru",
344
+ "rw",
345
+ "ws",
346
+ "sg",
347
+ "ss",
348
+ "lk",
349
+ "sd",
350
+ "tz",
351
+ "th",
352
+ "tl",
353
+ "tm",
354
+ "ug",
355
+ "gb",
356
+ "vu",
357
+ "vn",
358
+ "zm",
359
+ "zw",
360
+ "bt",
361
+ "mu",
362
+ ]
363
+ """Supported country codes ISO 2 lowercase
364
+
365
+ **On change make sure to update the Proxy type.**
366
+ """
134
367
 
135
- class SessionProxyAnchorMobileProxyType(TypedDict, total=False):
136
- type: Required[Literal["anchor_mobile"]]
368
+ region: str
369
+ """
370
+ Region code for more specific geographic targeting. The city parameter can only
371
+ be used when region is also provided. Example: "ca" for California
372
+ """
137
373
 
138
- active: bool
139
- """Enable or disable proxy usage. Defaults to `false`."""
374
+ type: Literal["anchor_proxy", "anchor_residential", "anchor_mobile", "anchor_gov"]
375
+ """**On change make sure to update the country_code.**"""
140
376
 
141
- country_code: Literal["us", "uk", "fr", "it", "jp", "au", "de", "fi", "ca"]
142
- """Country code for mobile proxy"""
143
377
 
378
+ class SessionProxyCustomProxy(TypedDict, total=False):
379
+ active: Required[bool]
144
380
 
145
- class SessionProxyCustomProxyType(TypedDict, total=False):
146
381
  password: Required[str]
147
382
  """Proxy password"""
148
383
 
@@ -154,13 +389,8 @@ class SessionProxyCustomProxyType(TypedDict, total=False):
154
389
  username: Required[str]
155
390
  """Proxy username"""
156
391
 
157
- active: bool
158
- """Enable or disable proxy usage. Defaults to `false`."""
159
-
160
392
 
161
- SessionProxy: TypeAlias = Union[
162
- SessionProxyAnchorResidentialProxyType, SessionProxyAnchorMobileProxyType, SessionProxyCustomProxyType
163
- ]
393
+ SessionProxy: TypeAlias = Union[SessionProxyAnchorProxy, SessionProxyCustomProxy]
164
394
 
165
395
 
166
396
  class SessionRecording(TypedDict, total=False):
@@ -183,11 +413,17 @@ class SessionTimeout(TypedDict, total=False):
183
413
 
184
414
 
185
415
  class Session(TypedDict, total=False):
416
+ initial_url: str
417
+ """The URL to navigate to when the browser session starts.
418
+
419
+ If not provided, the browser will load an empty page.
420
+ """
421
+
186
422
  live_view: SessionLiveView
187
423
  """Configuration for live viewing the browser session."""
188
424
 
189
425
  proxy: SessionProxy
190
- """Configuration options for proxy usage."""
426
+ """Proxy Documentation available at [Proxy Documentation](/advanced/proxy)"""
191
427
 
192
428
  recording: SessionRecording
193
429
  """Configuration for session recording."""
@@ -0,0 +1,25 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from typing import List
4
+ from typing_extensions import TypeAlias
5
+
6
+ from .._models import BaseModel
7
+
8
+ __all__ = ["SessionListPagesResponse", "SessionListPagesResponseItem"]
9
+
10
+
11
+ class SessionListPagesResponseItem(BaseModel):
12
+ id: str
13
+ """The unique identifier of the page."""
14
+
15
+ frontend_url: str
16
+ """The frontend URL for accessing the page."""
17
+
18
+ title: str
19
+ """The title of the page."""
20
+
21
+ url: str
22
+ """The URL of the page."""
23
+
24
+
25
+ SessionListPagesResponse: TypeAlias = List[SessionListPagesResponseItem]
@@ -0,0 +1,46 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from typing import List, Optional
4
+ from datetime import datetime
5
+
6
+ from .._models import BaseModel
7
+
8
+ __all__ = ["SessionRetrieveResponse"]
9
+
10
+
11
+ class SessionRetrieveResponse(BaseModel):
12
+ configuration: Optional[object] = None
13
+ """The configuration settings for the session."""
14
+
15
+ created_at: Optional[datetime] = None
16
+ """The timestamp when the session was created."""
17
+
18
+ credits_used: Optional[float] = None
19
+ """The number of credits consumed by the session."""
20
+
21
+ duration: Optional[int] = None
22
+ """The duration of the session in seconds."""
23
+
24
+ playground: Optional[bool] = None
25
+ """Whether this is a playground session."""
26
+
27
+ proxy_bytes: Optional[int] = None
28
+ """The number of bytes transferred through the proxy."""
29
+
30
+ session_id: Optional[str] = None
31
+ """The unique identifier of the session."""
32
+
33
+ status: Optional[str] = None
34
+ """The current status of the session."""
35
+
36
+ steps: Optional[List[object]] = None
37
+ """Array of steps executed in the session."""
38
+
39
+ tags: Optional[object] = None
40
+ """Tags associated with the session."""
41
+
42
+ team_id: Optional[str] = None
43
+ """The team ID associated with the session."""
44
+
45
+ tokens: Optional[object] = None
46
+ """Token usage information."""
@@ -24,3 +24,6 @@ class SessionScrollParams(TypedDict, total=False):
24
24
 
25
25
  steps: int
26
26
  """Number of steps to break the scroll into for smoother scrolling"""
27
+
28
+ use_os: Annotated[bool, PropertyInfo(alias="useOs")]
29
+ """Whether to use the OS scroll or the Playwright scroll"""
@@ -0,0 +1,14 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing_extensions import Required, TypedDict
6
+
7
+ from .._types import FileTypes
8
+
9
+ __all__ = ["SessionUploadFileParams"]
10
+
11
+
12
+ class SessionUploadFileParams(TypedDict, total=False):
13
+ file: Required[FileTypes]
14
+ """File to upload to the browser session"""
@@ -0,0 +1,17 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from typing import Optional
4
+
5
+ from .._models import BaseModel
6
+
7
+ __all__ = ["SessionUploadFileResponse", "Data"]
8
+
9
+
10
+ class Data(BaseModel):
11
+ message: Optional[str] = None
12
+
13
+ status: Optional[str] = None
14
+
15
+
16
+ class SessionUploadFileResponse(BaseModel):
17
+ data: Optional[Data] = None
@@ -2,16 +2,16 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import List
6
5
  from typing_extensions import Required, Annotated, TypedDict
7
6
 
7
+ from ..._types import SequenceNotStr
8
8
  from ..._utils import PropertyInfo
9
9
 
10
10
  __all__ = ["KeyboardShortcutParams"]
11
11
 
12
12
 
13
13
  class KeyboardShortcutParams(TypedDict, total=False):
14
- keys: Required[List[str]]
14
+ keys: Required[SequenceNotStr[str]]
15
15
  """Array of keys to press simultaneously"""
16
16
 
17
17
  hold_time: Annotated[int, PropertyInfo(alias="holdTime")]
@@ -5,10 +5,10 @@ from datetime import datetime
5
5
 
6
6
  from ..._models import BaseModel
7
7
 
8
- __all__ = ["RecordingListResponse", "Data", "DataData", "DataDataItem"]
8
+ __all__ = ["RecordingListResponse", "Data", "DataItem"]
9
9
 
10
10
 
11
- class DataDataItem(BaseModel):
11
+ class DataItem(BaseModel):
12
12
  id: Optional[str] = None
13
13
  """Unique identifier for the recording"""
14
14
 
@@ -31,15 +31,11 @@ class DataDataItem(BaseModel):
31
31
  """Suggested filename for the recording"""
32
32
 
33
33
 
34
- class DataData(BaseModel):
34
+ class Data(BaseModel):
35
35
  count: Optional[int] = None
36
36
  """Total number of video recordings"""
37
37
 
38
- items: Optional[List[DataDataItem]] = None
39
-
40
-
41
- class Data(BaseModel):
42
- data: Optional[DataData] = None
38
+ items: Optional[List[DataItem]] = None
43
39
 
44
40
 
45
41
  class RecordingListResponse(BaseModel):
@@ -19,8 +19,23 @@ class ToolFetchWebpageParams(TypedDict, total=False):
19
19
  format: Literal["html", "markdown"]
20
20
  """The output format of the content."""
21
21
 
22
+ new_page: bool
23
+ """Whether to create a new page for the content."""
24
+
25
+ page_index: int
26
+ """The index of the page to fetch content from. **Overides new_page**."""
27
+
28
+ return_partial_on_timeout: bool
29
+ """
30
+ Whether to return partial content if the content is not loaded within the 20
31
+ seconds.
32
+ """
33
+
22
34
  url: str
23
35
  """The URL of the webpage to fetch content from.
24
36
 
25
37
  When left empty, the current webpage is used.
26
38
  """
39
+
40
+ wait: int
41
+ """The time to wait for **dynamic** content to load in **milliseconds**."""
@@ -2,7 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing_extensions import Required, Annotated, TypedDict
5
+ from typing_extensions import Literal, Required, Annotated, TypedDict
6
6
 
7
7
  from .._utils import PropertyInfo
8
8
 
@@ -20,9 +20,25 @@ class ToolPerformWebTaskParams(TypedDict, total=False):
20
20
  session.
21
21
  """
22
22
 
23
+ agent: Literal["browser-use", "openai-cua"]
24
+ """The AI agent to use for task completion. Defaults to browser-use."""
25
+
26
+ highlight_elements: bool
27
+ """Whether to highlight elements during task execution for better visibility."""
28
+
29
+ model: str
30
+ """The specific model to use for task completion.
31
+
32
+ see our [models](/agentic-browser-control/ai-task-completion#available-models)
33
+ page for more information.
34
+ """
35
+
23
36
  output_schema: object
24
37
  """JSON Schema defining the expected structure of the output data."""
25
38
 
39
+ provider: Literal["openai", "gemini", "groq", "azure", "xai"]
40
+ """The AI provider to use for task completion."""
41
+
26
42
  url: str
27
43
  """The URL of the webpage.
28
44
 
@@ -1,6 +1,6 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
- from typing import Dict, Union, Optional
3
+ from typing import Optional
4
4
 
5
5
  from .._models import BaseModel
6
6
 
@@ -8,8 +8,8 @@ __all__ = ["ToolPerformWebTaskResponse", "Data"]
8
8
 
9
9
 
10
10
  class Data(BaseModel):
11
- result: Union[str, Dict[str, object], None] = None
12
- """The outcome or answer as a string"""
11
+ result: Optional[str] = None
12
+ """The outcome or answer produced by the autonomous task."""
13
13
 
14
14
 
15
15
  class ToolPerformWebTaskResponse(BaseModel):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: anchorbrowser
3
- Version: 0.1.0a3
3
+ Version: 0.1.1
4
4
  Summary: The official Python library for the anchorbrowser API
5
5
  Project-URL: Homepage, https://github.com/anchorbrowser/AnchorBrowser-SDK-Python
6
6
  Project-URL: Repository, https://github.com/anchorbrowser/AnchorBrowser-SDK-Python
@@ -25,11 +25,11 @@ Requires-Python: >=3.8
25
25
  Requires-Dist: anyio<5,>=3.5.0
26
26
  Requires-Dist: distro<2,>=1.7.0
27
27
  Requires-Dist: httpx<1,>=0.23.0
28
+ Requires-Dist: playwright>=1.55.0
28
29
  Requires-Dist: pydantic<3,>=1.9.0
29
- Requires-Dist: pytest-playwright
30
30
  Requires-Dist: sniffio
31
31
  Requires-Dist: typing-extensions<5,>=4.10
32
- Requires-Dist: websockets
32
+ Requires-Dist: websockets>=15.0.1
33
33
  Provides-Extra: aiohttp
34
34
  Requires-Dist: aiohttp; extra == 'aiohttp'
35
35
  Requires-Dist: httpx-aiohttp>=0.1.8; extra == 'aiohttp'
@@ -54,7 +54,7 @@ The REST API documentation can be found on [docs.anchorbrowser.io](https://docs.
54
54
 
55
55
  ```sh
56
56
  # install from PyPI
57
- pip install --pre anchorbrowser
57
+ pip install anchorbrowser
58
58
  ```
59
59
 
60
60
  ## Usage
@@ -77,7 +77,7 @@ print(success_response.data)
77
77
 
78
78
  While you can provide an `api_key` keyword argument,
79
79
  we recommend using [python-dotenv](https://pypi.org/project/python-dotenv/)
80
- to add `ANCHORBROWSER_API_KEY="My API Key"` to your `.env` file
80
+ to add `ANCHORBROWSER_API_KEY="Your API Key"` to your `.env` file
81
81
  so that your API Key is not stored in source control.
82
82
 
83
83
  ## Async usage
@@ -114,7 +114,7 @@ You can enable this by installing `aiohttp`:
114
114
 
115
115
  ```sh
116
116
  # install from PyPI
117
- pip install --pre anchorbrowser[aiohttp]
117
+ pip install anchorbrowser[aiohttp]
118
118
  ```
119
119
 
120
120
  Then you can enable it by instantiating the client with `http_client=DefaultAioHttpClient()`:
@@ -127,7 +127,7 @@ from anchorbrowser import AsyncAnchorbrowser
127
127
 
128
128
  async def main() -> None:
129
129
  async with AsyncAnchorbrowser(
130
- api_key="My API Key",
130
+ api_key="Your API Key",
131
131
  http_client=DefaultAioHttpClient(),
132
132
  ) as client:
133
133
  success_response = await client.profiles.create(
@@ -173,9 +173,8 @@ from anchorbrowser import Anchorbrowser
173
173
 
174
174
  client = Anchorbrowser()
175
175
 
176
- client.extensions.upload(
176
+ client.sessions.upload_file(
177
177
  file=Path("/path/to/file"),
178
- name="My Custom Extension",
179
178
  )
180
179
  ```
181
180