firecrawl-py 2.16.3__py3-none-any.whl → 3.0.2__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 (88) hide show
  1. firecrawl/__init__.py +27 -19
  2. firecrawl/__tests__/e2e/v2/aio/test_aio_batch_scrape.py +79 -0
  3. firecrawl/__tests__/e2e/v2/aio/test_aio_crawl.py +189 -0
  4. firecrawl/__tests__/e2e/v2/aio/test_aio_extract.py +38 -0
  5. firecrawl/__tests__/e2e/v2/aio/test_aio_map.py +40 -0
  6. firecrawl/__tests__/e2e/v2/aio/test_aio_scrape.py +137 -0
  7. firecrawl/__tests__/e2e/v2/aio/test_aio_search.py +183 -0
  8. firecrawl/__tests__/e2e/v2/aio/test_aio_usage.py +35 -0
  9. firecrawl/__tests__/e2e/v2/aio/test_aio_watcher.py +43 -0
  10. firecrawl/__tests__/e2e/v2/conftest.py +73 -0
  11. firecrawl/__tests__/e2e/v2/test_async.py +73 -0
  12. firecrawl/__tests__/e2e/v2/test_batch_scrape.py +105 -0
  13. firecrawl/__tests__/e2e/v2/test_crawl.py +276 -0
  14. firecrawl/__tests__/e2e/v2/test_extract.py +54 -0
  15. firecrawl/__tests__/e2e/v2/test_map.py +60 -0
  16. firecrawl/__tests__/e2e/v2/test_scrape.py +154 -0
  17. firecrawl/__tests__/e2e/v2/test_search.py +265 -0
  18. firecrawl/__tests__/e2e/v2/test_usage.py +26 -0
  19. firecrawl/__tests__/e2e/v2/test_watcher.py +65 -0
  20. firecrawl/__tests__/unit/v2/methods/aio/test_aio_crawl_params.py +12 -0
  21. firecrawl/__tests__/unit/v2/methods/aio/test_aio_crawl_request_preparation.py +61 -0
  22. firecrawl/__tests__/unit/v2/methods/aio/test_aio_crawl_validation.py +12 -0
  23. firecrawl/__tests__/unit/v2/methods/aio/test_aio_map_request_preparation.py +19 -0
  24. firecrawl/__tests__/unit/v2/methods/aio/test_aio_scrape_request_preparation.py +50 -0
  25. firecrawl/__tests__/unit/v2/methods/aio/test_aio_search_request_preparation.py +63 -0
  26. firecrawl/__tests__/unit/v2/methods/aio/test_batch_request_preparation_async.py +28 -0
  27. firecrawl/__tests__/unit/v2/methods/aio/test_ensure_async.py +117 -0
  28. firecrawl/__tests__/unit/v2/methods/test_batch_request_preparation.py +90 -0
  29. firecrawl/__tests__/unit/v2/methods/test_crawl_params.py +70 -0
  30. firecrawl/__tests__/unit/v2/methods/test_crawl_request_preparation.py +240 -0
  31. firecrawl/__tests__/unit/v2/methods/test_crawl_validation.py +107 -0
  32. firecrawl/__tests__/unit/v2/methods/test_map_request_preparation.py +53 -0
  33. firecrawl/__tests__/unit/v2/methods/test_scrape_request_preparation.py +92 -0
  34. firecrawl/__tests__/unit/v2/methods/test_search_request_preparation.py +167 -0
  35. firecrawl/__tests__/unit/v2/methods/test_search_validation.py +206 -0
  36. firecrawl/__tests__/unit/v2/methods/test_usage_types.py +18 -0
  37. firecrawl/__tests__/unit/v2/methods/test_webhook.py +123 -0
  38. firecrawl/__tests__/unit/v2/utils/test_validation.py +290 -0
  39. firecrawl/__tests__/unit/v2/watcher/test_ws_watcher.py +332 -0
  40. firecrawl/client.py +241 -0
  41. build/lib/firecrawl/firecrawl.py → firecrawl/firecrawl.backup.py +108 -92
  42. firecrawl/types.py +157 -0
  43. firecrawl/v1/__init__.py +14 -0
  44. firecrawl/{firecrawl.py → v1/client.py} +405 -371
  45. firecrawl/v2/__init__.py +4 -0
  46. firecrawl/v2/client.py +802 -0
  47. firecrawl/v2/client_async.py +250 -0
  48. firecrawl/v2/methods/aio/__init__.py +1 -0
  49. firecrawl/v2/methods/aio/batch.py +85 -0
  50. firecrawl/v2/methods/aio/crawl.py +174 -0
  51. firecrawl/v2/methods/aio/extract.py +126 -0
  52. firecrawl/v2/methods/aio/map.py +59 -0
  53. firecrawl/v2/methods/aio/scrape.py +36 -0
  54. firecrawl/v2/methods/aio/search.py +58 -0
  55. firecrawl/v2/methods/aio/usage.py +42 -0
  56. firecrawl/v2/methods/batch.py +420 -0
  57. firecrawl/v2/methods/crawl.py +468 -0
  58. firecrawl/v2/methods/extract.py +131 -0
  59. firecrawl/v2/methods/map.py +77 -0
  60. firecrawl/v2/methods/scrape.py +68 -0
  61. firecrawl/v2/methods/search.py +173 -0
  62. firecrawl/v2/methods/usage.py +41 -0
  63. firecrawl/v2/types.py +546 -0
  64. firecrawl/v2/utils/__init__.py +9 -0
  65. firecrawl/v2/utils/error_handler.py +107 -0
  66. firecrawl/v2/utils/get_version.py +15 -0
  67. firecrawl/v2/utils/http_client.py +153 -0
  68. firecrawl/v2/utils/http_client_async.py +64 -0
  69. firecrawl/v2/utils/validation.py +324 -0
  70. firecrawl/v2/watcher.py +312 -0
  71. firecrawl/v2/watcher_async.py +245 -0
  72. {firecrawl_py-2.16.3.dist-info → firecrawl_py-3.0.2.dist-info}/LICENSE +0 -0
  73. {firecrawl_py-2.16.3.dist-info → firecrawl_py-3.0.2.dist-info}/METADATA +49 -32
  74. firecrawl_py-3.0.2.dist-info/RECORD +78 -0
  75. {firecrawl_py-2.16.3.dist-info → firecrawl_py-3.0.2.dist-info}/top_level.txt +0 -2
  76. tests/test_timeout_conversion.py +117 -0
  77. build/lib/firecrawl/__init__.py +0 -79
  78. build/lib/firecrawl/__tests__/e2e_withAuth/__init__.py +0 -0
  79. build/lib/firecrawl/__tests__/e2e_withAuth/test.py +0 -170
  80. build/lib/firecrawl/__tests__/v1/e2e_withAuth/__init__.py +0 -0
  81. build/lib/firecrawl/__tests__/v1/e2e_withAuth/test.py +0 -465
  82. build/lib/tests/test_change_tracking.py +0 -98
  83. firecrawl/__tests__/e2e_withAuth/__init__.py +0 -0
  84. firecrawl/__tests__/e2e_withAuth/test.py +0 -170
  85. firecrawl/__tests__/v1/e2e_withAuth/__init__.py +0 -0
  86. firecrawl/__tests__/v1/e2e_withAuth/test.py +0 -465
  87. firecrawl_py-2.16.3.dist-info/RECORD +0 -19
  88. {firecrawl_py-2.16.3.dist-info → firecrawl_py-3.0.2.dist-info}/WHEEL +0 -0
firecrawl/client.py ADDED
@@ -0,0 +1,241 @@
1
+ """
2
+ Firecrawl Client
3
+
4
+ A Firecrawl client that enables you to scrape content from websites, crawl entire sites, search the web, and extract structured data using AI.
5
+
6
+ The client supports both v1 and v2 API versions, providing access to features like:
7
+ - Web scraping with advanced options (screenshots, markdown conversion, etc.)
8
+ - Site crawling with configurable depth and limits
9
+ - Web search with content extraction
10
+ - Structured data extraction using AI models
11
+ - Deep research capabilities
12
+
13
+ Usage:
14
+ from firecrawl import Firecrawl
15
+ firecrawl = Firecrawl(api_key="your-api-key")
16
+ result = firecrawl.scrape("https://example.com")
17
+
18
+ Check example.py for other usage examples.
19
+ """
20
+
21
+ from typing import Any, Dict, Optional, List, Union
22
+ import logging
23
+
24
+
25
+ from .v1 import V1FirecrawlApp, AsyncV1FirecrawlApp
26
+ from .v2 import FirecrawlClient as V2FirecrawlClient
27
+ from .v2.client_async import AsyncFirecrawlClient
28
+
29
+ logger = logging.getLogger("firecrawl")
30
+
31
+ class V1Proxy:
32
+ """Type-annotated proxy for v1 client methods."""
33
+ _client: Optional[V1FirecrawlApp]
34
+
35
+ def __init__(self, client_instance: Optional[V1FirecrawlApp]):
36
+ self._client = client_instance
37
+
38
+ if client_instance:
39
+ self.scrape_url = client_instance.scrape_url
40
+ self.crawl_url = client_instance.crawl_url
41
+ self.batch_scrape_urls = client_instance.batch_scrape_urls
42
+ self.async_batch_scrape_urls = client_instance.async_batch_scrape_urls
43
+ self.async_crawl_url = client_instance.async_crawl_url
44
+ self.check_crawl_status = client_instance.check_crawl_status
45
+ self.map_url = client_instance.map_url
46
+ self.extract = client_instance.extract
47
+ self.deep_research = client_instance.deep_research
48
+ self.generate_llms_text = client_instance.generate_llms_text
49
+
50
+ class V2Proxy:
51
+ """Proxy class that forwards method calls to the appropriate version client."""
52
+ _client: Optional[V2FirecrawlClient]
53
+
54
+ def __init__(self, client_instance: Optional[V2FirecrawlClient]):
55
+ self._client = client_instance
56
+
57
+ if client_instance:
58
+ # self.scrape = client_instance.scrape
59
+ self.search = client_instance.search
60
+ self.crawl = client_instance.crawl
61
+ self.get_crawl_status = client_instance.get_crawl_status
62
+ self.cancel_crawl = client_instance.cancel_crawl
63
+ self.start_crawl = client_instance.start_crawl
64
+ self.crawl_params_preview = client_instance.crawl_params_preview
65
+ self.extract = client_instance.extract
66
+ self.start_batch_scrape = client_instance.start_batch_scrape
67
+ self.get_batch_scrape_status = client_instance.get_batch_scrape_status
68
+ self.cancel_batch_scrape = client_instance.cancel_batch_scrape
69
+ self.batch_scrape = client_instance.batch_scrape
70
+ self.get_batch_scrape_errors = client_instance.get_batch_scrape_errors
71
+ self.get_extract_status = client_instance.get_extract_status
72
+ self.map = client_instance.map
73
+ self.get_concurrency = client_instance.get_concurrency
74
+ self.get_credit_usage = client_instance.get_credit_usage
75
+ self.get_token_usage = client_instance.get_token_usage
76
+
77
+ def __getattr__(self, name):
78
+ """Forward attribute access to the underlying client."""
79
+ return getattr(self._client, name)
80
+
81
+ class AsyncV1Proxy:
82
+ """Type-annotated proxy for v1 client methods."""
83
+ _client: Optional[AsyncV1FirecrawlApp]
84
+
85
+ def __init__(self, client_instance: Optional[AsyncV1FirecrawlApp]):
86
+ self._client = client_instance
87
+
88
+ if client_instance:
89
+ self.scrape_url = client_instance.scrape_url
90
+ self.crawl_url = client_instance.crawl_url
91
+ self.batch_scrape_urls = client_instance.batch_scrape_urls
92
+ self.async_batch_scrape_urls = client_instance.async_batch_scrape_urls
93
+ self.async_crawl_url = client_instance.async_crawl_url
94
+ self.check_crawl_status = client_instance.check_crawl_status
95
+ self.map_url = client_instance.map_url
96
+ self.extract = client_instance.extract
97
+ self.deep_research = client_instance.deep_research
98
+ self.generate_llms_text = client_instance.generate_llms_text
99
+
100
+ class AsyncV2Proxy:
101
+ """Proxy class that forwards method calls to the appropriate version client."""
102
+ _client: Optional[Any] = None
103
+
104
+ def __init__(self, client_instance: Optional[Any] = None):
105
+ self._client = client_instance
106
+
107
+ if client_instance:
108
+ self.scrape = client_instance.scrape
109
+ self.search = client_instance.search
110
+ self.crawl = client_instance.crawl
111
+ self.start_crawl = client_instance.start_crawl
112
+ self.wait_crawl = client_instance.wait_crawl
113
+ self.get_crawl_status = client_instance.get_crawl_status
114
+ self.cancel_crawl = client_instance.cancel_crawl
115
+ self.get_crawl_errors = client_instance.get_crawl_errors
116
+ self.get_active_crawls = client_instance.get_active_crawls
117
+ self.active_crawls = client_instance.active_crawls
118
+ self.crawl_params_preview = client_instance.crawl_params_preview
119
+
120
+ self.extract = client_instance.extract
121
+ self.start_extract = client_instance.start_extract
122
+ self.get_extract_status = client_instance.get_extract_status
123
+
124
+ self.start_batch_scrape = client_instance.start_batch_scrape
125
+ self.get_batch_scrape_status = client_instance.get_batch_scrape_status
126
+ self.cancel_batch_scrape = client_instance.cancel_batch_scrape
127
+ self.wait_batch_scrape = client_instance.wait_batch_scrape
128
+ self.batch_scrape = client_instance.batch_scrape
129
+ self.get_batch_scrape_errors = client_instance.get_batch_scrape_errors
130
+
131
+ self.map = client_instance.map
132
+ self.get_concurrency = client_instance.get_concurrency
133
+ self.get_credit_usage = client_instance.get_credit_usage
134
+ self.get_token_usage = client_instance.get_token_usage
135
+ self.watcher = client_instance.watcher
136
+
137
+ def __getattr__(self, name):
138
+ """Forward attribute access to the underlying client."""
139
+ if self._client:
140
+ return getattr(self._client, name)
141
+ raise AttributeError(f"Async v2 client not implemented yet: {name}")
142
+
143
+
144
+ class Firecrawl:
145
+ """
146
+ Unified Firecrawl client (v2 by default, v1 under ``.v1``).
147
+
148
+ Provides a single entrypoint that exposes the latest API directly while
149
+ keeping a feature-frozen v1 available for incremental migration.
150
+ """
151
+
152
+ def __init__(self, api_key: str = None, api_url: str = "https://api.firecrawl.dev"):
153
+ """Initialize the unified client.
154
+
155
+ Args:
156
+ api_key: Firecrawl API key (or set ``FIRECRAWL_API_KEY``)
157
+ api_url: Base API URL (defaults to production)
158
+ """
159
+ self.api_key = api_key
160
+ self.api_url = api_url
161
+
162
+ # Initialize version-specific clients
163
+ self._v1_client = V1FirecrawlApp(api_key=api_key, api_url=api_url) if V1FirecrawlApp else None
164
+ self._v2_client = V2FirecrawlClient(api_key=api_key, api_url=api_url) if V2FirecrawlClient else None
165
+
166
+ # Create version-specific proxies
167
+ self.v1 = V1Proxy(self._v1_client) if self._v1_client else None
168
+ self.v2 = V2Proxy(self._v2_client)
169
+
170
+
171
+ self.scrape = self._v2_client.scrape
172
+ self.crawl = self._v2_client.crawl
173
+ self.start_crawl = self._v2_client.start_crawl
174
+ self.crawl_params_preview = self._v2_client.crawl_params_preview
175
+ self.get_crawl_status = self._v2_client.get_crawl_status
176
+ self.cancel_crawl = self._v2_client.cancel_crawl
177
+ self.get_crawl_errors = self._v2_client.get_crawl_errors
178
+ self.active_crawls = self._v2_client.active_crawls
179
+
180
+ self.start_batch_scrape = self._v2_client.start_batch_scrape
181
+ self.get_batch_scrape_status = self._v2_client.get_batch_scrape_status
182
+ self.cancel_batch_scrape = self._v2_client.cancel_batch_scrape
183
+ self.batch_scrape = self._v2_client.batch_scrape
184
+ self.get_batch_scrape_errors = self._v2_client.get_batch_scrape_errors
185
+ self.get_extract_status = self._v2_client.get_extract_status
186
+ self.map = self._v2_client.map
187
+ self.search = self._v2_client.search
188
+ self.extract = self._v2_client.extract
189
+ self.get_concurrency = self._v2_client.get_concurrency
190
+ self.get_credit_usage = self._v2_client.get_credit_usage
191
+ self.get_token_usage = self._v2_client.get_token_usage
192
+ self.watcher = self._v2_client.watcher
193
+
194
+ class AsyncFirecrawl:
195
+ """Async unified Firecrawl client (v2 by default, v1 under ``.v1``)."""
196
+
197
+ def __init__(self, api_key: str = None, api_url: str = "https://api.firecrawl.dev"):
198
+ self.api_key = api_key
199
+ self.api_url = api_url
200
+
201
+ # Initialize version-specific clients
202
+ self._v1_client = AsyncV1FirecrawlApp(api_key=api_key, api_url=api_url) if AsyncV1FirecrawlApp else None
203
+ self._v2_client = AsyncFirecrawlClient(api_key=api_key, api_url=api_url) if AsyncFirecrawlClient else None
204
+
205
+ # Create version-specific proxies
206
+ self.v1 = AsyncV1Proxy(self._v1_client) if self._v1_client else None
207
+ self.v2 = AsyncV2Proxy(self._v2_client)
208
+
209
+ # Expose v2 async surface directly on the top-level client for ergonomic access
210
+ # Keep method names aligned with the sync client
211
+ self.scrape = self._v2_client.scrape
212
+ self.search = self._v2_client.search
213
+ self.map = self._v2_client.map
214
+
215
+ self.start_crawl = self._v2_client.start_crawl
216
+ self.get_crawl_status = self._v2_client.get_crawl_status
217
+ self.cancel_crawl = self._v2_client.cancel_crawl
218
+ self.crawl = self._v2_client.crawl
219
+ self.get_crawl_errors = self._v2_client.get_crawl_errors
220
+ self.active_crawls = self._v2_client.active_crawls
221
+ self.crawl_params_preview = self._v2_client.crawl_params_preview
222
+
223
+ self.start_batch_scrape = self._v2_client.start_batch_scrape
224
+ self.get_batch_scrape_status = self._v2_client.get_batch_scrape_status
225
+ self.cancel_batch_scrape = self._v2_client.cancel_batch_scrape
226
+ self.batch_scrape = self._v2_client.batch_scrape
227
+ self.get_batch_scrape_errors = self._v2_client.get_batch_scrape_errors
228
+
229
+ self.start_extract = self._v2_client.start_extract
230
+ self.get_extract_status = self._v2_client.get_extract_status
231
+ self.extract = self._v2_client.extract
232
+
233
+ self.get_concurrency = self._v2_client.get_concurrency
234
+ self.get_credit_usage = self._v2_client.get_credit_usage
235
+ self.get_token_usage = self._v2_client.get_token_usage
236
+
237
+ self.watcher = self._v2_client.watcher
238
+
239
+ # Export Firecrawl as an alias for FirecrawlApp
240
+ FirecrawlApp = Firecrawl
241
+ AsyncFirecrawlApp = AsyncFirecrawl