firecrawl 3.2.1__tar.gz → 3.3.2__tar.gz

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 firecrawl might be problematic. Click here for more details.

Files changed (85) hide show
  1. {firecrawl-3.2.1 → firecrawl-3.3.2}/LICENSE +0 -0
  2. {firecrawl-3.2.1 → firecrawl-3.3.2}/PKG-INFO +2 -6
  3. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__init__.py +1 -1
  4. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/unit/v2/methods/aio/test_aio_crawl_request_preparation.py +2 -2
  5. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/unit/v2/methods/test_crawl_request_preparation.py +6 -6
  6. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/client.py +3 -0
  7. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/methods/search.py +11 -0
  8. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/types.py +30 -1
  9. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl.egg-info/PKG-INFO +2 -6
  10. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl.egg-info/top_level.txt +0 -1
  11. {firecrawl-3.2.1 → firecrawl-3.3.2}/tests/test_change_tracking.py +0 -0
  12. {firecrawl-3.2.1 → firecrawl-3.3.2}/README.md +0 -0
  13. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/e2e/v2/aio/test_aio_batch_scrape.py +0 -0
  14. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/e2e/v2/aio/test_aio_crawl.py +0 -0
  15. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/e2e/v2/aio/test_aio_extract.py +0 -0
  16. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/e2e/v2/aio/test_aio_map.py +0 -0
  17. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/e2e/v2/aio/test_aio_scrape.py +0 -0
  18. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/e2e/v2/aio/test_aio_search.py +0 -0
  19. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/e2e/v2/aio/test_aio_usage.py +0 -0
  20. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/e2e/v2/aio/test_aio_watcher.py +0 -0
  21. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/e2e/v2/conftest.py +0 -0
  22. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/e2e/v2/test_async.py +0 -0
  23. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/e2e/v2/test_batch_scrape.py +0 -0
  24. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/e2e/v2/test_crawl.py +0 -0
  25. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/e2e/v2/test_extract.py +0 -0
  26. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/e2e/v2/test_map.py +0 -0
  27. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/e2e/v2/test_scrape.py +0 -0
  28. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/e2e/v2/test_search.py +0 -0
  29. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/e2e/v2/test_usage.py +0 -0
  30. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/e2e/v2/test_watcher.py +0 -0
  31. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/unit/v2/methods/aio/test_aio_crawl_params.py +0 -0
  32. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/unit/v2/methods/aio/test_aio_crawl_validation.py +0 -0
  33. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/unit/v2/methods/aio/test_aio_map_request_preparation.py +0 -0
  34. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/unit/v2/methods/aio/test_aio_scrape_request_preparation.py +0 -0
  35. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/unit/v2/methods/aio/test_aio_search_request_preparation.py +0 -0
  36. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/unit/v2/methods/aio/test_batch_request_preparation_async.py +0 -0
  37. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/unit/v2/methods/aio/test_ensure_async.py +0 -0
  38. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/unit/v2/methods/test_batch_request_preparation.py +0 -0
  39. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/unit/v2/methods/test_crawl_params.py +0 -0
  40. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/unit/v2/methods/test_crawl_validation.py +0 -0
  41. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/unit/v2/methods/test_map_request_preparation.py +0 -0
  42. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/unit/v2/methods/test_scrape_request_preparation.py +0 -0
  43. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/unit/v2/methods/test_search_request_preparation.py +0 -0
  44. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/unit/v2/methods/test_search_validation.py +0 -0
  45. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/unit/v2/methods/test_usage_types.py +0 -0
  46. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/unit/v2/methods/test_webhook.py +0 -0
  47. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/unit/v2/utils/test_validation.py +0 -0
  48. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/__tests__/unit/v2/watcher/test_ws_watcher.py +0 -0
  49. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/client.py +0 -0
  50. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/firecrawl.backup.py +0 -0
  51. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/types.py +0 -0
  52. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v1/__init__.py +0 -0
  53. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v1/client.py +0 -0
  54. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/__init__.py +0 -0
  55. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/client_async.py +0 -0
  56. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/methods/aio/__init__.py +0 -0
  57. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/methods/aio/batch.py +0 -0
  58. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/methods/aio/crawl.py +0 -0
  59. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/methods/aio/extract.py +0 -0
  60. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/methods/aio/map.py +0 -0
  61. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/methods/aio/scrape.py +0 -0
  62. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/methods/aio/search.py +0 -0
  63. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/methods/aio/usage.py +0 -0
  64. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/methods/batch.py +0 -0
  65. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/methods/crawl.py +0 -0
  66. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/methods/extract.py +0 -0
  67. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/methods/map.py +0 -0
  68. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/methods/scrape.py +0 -0
  69. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/methods/usage.py +0 -0
  70. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/utils/__init__.py +0 -0
  71. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/utils/error_handler.py +0 -0
  72. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/utils/get_version.py +0 -0
  73. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/utils/http_client.py +0 -0
  74. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/utils/http_client_async.py +0 -0
  75. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/utils/normalize.py +0 -0
  76. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/utils/validation.py +0 -0
  77. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/watcher.py +0 -0
  78. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl/v2/watcher_async.py +0 -0
  79. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl.egg-info/SOURCES.txt +0 -0
  80. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl.egg-info/dependency_links.txt +0 -0
  81. {firecrawl-3.2.1 → firecrawl-3.3.2}/firecrawl.egg-info/requires.txt +0 -0
  82. {firecrawl-3.2.1 → firecrawl-3.3.2}/pyproject.toml +0 -0
  83. {firecrawl-3.2.1 → firecrawl-3.3.2}/setup.cfg +0 -0
  84. {firecrawl-3.2.1 → firecrawl-3.3.2}/setup.py +0 -0
  85. {firecrawl-3.2.1 → firecrawl-3.3.2}/tests/test_timeout_conversion.py +0 -0
File without changes
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.1
2
2
  Name: firecrawl
3
- Version: 3.2.1
3
+ Version: 3.3.2
4
4
  Summary: Python SDK for Firecrawl API
5
5
  Home-page: https://github.com/firecrawl/firecrawl
6
6
  Author: Mendable.ai
@@ -40,10 +40,6 @@ Requires-Dist: websockets
40
40
  Requires-Dist: nest-asyncio
41
41
  Requires-Dist: pydantic>=2.0
42
42
  Requires-Dist: aiohttp
43
- Dynamic: author
44
- Dynamic: home-page
45
- Dynamic: license-file
46
- Dynamic: requires-python
47
43
 
48
44
  # Firecrawl Python SDK
49
45
 
@@ -17,7 +17,7 @@ from .v1 import (
17
17
  V1ChangeTrackingOptions,
18
18
  )
19
19
 
20
- __version__ = "3.2.1"
20
+ __version__ = "3.3.2"
21
21
 
22
22
  # Define the logger for the Firecrawl project
23
23
  logger: logging.Logger = logging.getLogger("firecrawl")
@@ -14,7 +14,7 @@ class TestAsyncCrawlRequestPreparation:
14
14
  include_paths=["/docs/*"],
15
15
  exclude_paths=["/admin/*"],
16
16
  max_discovery_depth=2,
17
- ignore_sitemap=True,
17
+ sitemap="skip",
18
18
  ignore_query_parameters=True,
19
19
  crawl_entire_domain=True,
20
20
  allow_external_links=False,
@@ -26,7 +26,7 @@ class TestAsyncCrawlRequestPreparation:
26
26
  assert payload["includePaths"] == ["/docs/*"]
27
27
  assert payload["excludePaths"] == ["/admin/*"]
28
28
  assert payload["maxDiscoveryDepth"] == 2
29
- assert payload["ignoreSitemap"] is True
29
+ assert payload["sitemap"] == "skip"
30
30
  assert payload["ignoreQueryParameters"] is True
31
31
  assert payload["crawlEntireDomain"] is True
32
32
  assert payload["allowExternalLinks"] is False
@@ -24,7 +24,7 @@ class TestCrawlRequestPreparation:
24
24
  url="https://example.com",
25
25
  limit=10,
26
26
  max_discovery_depth=3,
27
- ignore_sitemap=True,
27
+ sitemap="skip",
28
28
  crawl_entire_domain=False,
29
29
  allow_external_links=True
30
30
  )
@@ -39,8 +39,8 @@ class TestCrawlRequestPreparation:
39
39
  assert data["limit"] == 10
40
40
  assert "maxDiscoveryDepth" in data
41
41
  assert data["maxDiscoveryDepth"] == 3
42
- assert "ignoreSitemap" in data
43
- assert data["ignoreSitemap"] is True
42
+ assert "sitemap" in data
43
+ assert data["sitemap"] == "skip"
44
44
  assert "crawlEntireDomain" in data
45
45
  assert data["crawlEntireDomain"] is False
46
46
  assert "allowExternalLinks" in data
@@ -106,7 +106,7 @@ class TestCrawlRequestPreparation:
106
106
  include_paths=["/blog/*", "/docs/*"],
107
107
  exclude_paths=["/admin/*"],
108
108
  max_discovery_depth=3,
109
- ignore_sitemap=False,
109
+ sitemap="include",
110
110
  limit=100,
111
111
  crawl_entire_domain=True,
112
112
  allow_external_links=False,
@@ -126,8 +126,8 @@ class TestCrawlRequestPreparation:
126
126
  assert data["excludePaths"] == ["/admin/*"]
127
127
  assert "maxDiscoveryDepth" in data
128
128
  assert data["maxDiscoveryDepth"] == 3
129
- assert "ignoreSitemap" in data
130
- assert data["ignoreSitemap"] is False
129
+ assert "sitemap" in data
130
+ assert data["sitemap"] == "include"
131
131
  assert "limit" in data
132
132
  assert data["limit"] == 100
133
133
  assert "crawlEntireDomain" in data
@@ -13,6 +13,7 @@ from .types import (
13
13
  SearchRequest,
14
14
  SearchData,
15
15
  SourceOption,
16
+ CategoryOption,
16
17
  CrawlRequest,
17
18
  CrawlResponse,
18
19
  CrawlJob,
@@ -171,6 +172,7 @@ class FirecrawlClient:
171
172
  query: str,
172
173
  *,
173
174
  sources: Optional[List[SourceOption]] = None,
175
+ categories: Optional[List[CategoryOption]] = None,
174
176
  limit: Optional[int] = None,
175
177
  tbs: Optional[str] = None,
176
178
  location: Optional[str] = None,
@@ -195,6 +197,7 @@ class FirecrawlClient:
195
197
  request = SearchRequest(
196
198
  query=query,
197
199
  sources=sources,
200
+ categories=categories,
198
201
  limit=limit,
199
202
  tbs=tbs,
200
203
  location=location,
@@ -121,6 +121,17 @@ def _validate_search_request(request: SearchRequest) -> SearchRequest:
121
121
  if source.type not in valid_sources:
122
122
  raise ValueError(f"Invalid source type: {source.type}. Valid types: {valid_sources}")
123
123
 
124
+ # Validate categories (if provided)
125
+ if request.categories is not None:
126
+ valid_categories = {"github", "research"}
127
+ for category in request.categories:
128
+ if isinstance(category, str):
129
+ if category not in valid_categories:
130
+ raise ValueError(f"Invalid category type: {category}. Valid types: {valid_categories}")
131
+ elif hasattr(category, 'type'):
132
+ if category.type not in valid_categories:
133
+ raise ValueError(f"Invalid category type: {category.type}. Valid types: {valid_categories}")
134
+
124
135
  # Validate location (if provided)
125
136
  if request.location is not None:
126
137
  if not isinstance(request.location, str) or len(request.location.strip()) == 0:
@@ -174,6 +174,12 @@ class Source(BaseModel):
174
174
 
175
175
  SourceOption = Union[str, Source]
176
176
 
177
+ class Category(BaseModel):
178
+ """Configuration for a search category."""
179
+ type: str
180
+
181
+ CategoryOption = Union[str, Category]
182
+
177
183
  FormatString = Literal[
178
184
  # camelCase versions (API format)
179
185
  "markdown", "html", "rawHtml", "links", "screenshot", "summary", "changeTracking", "json",
@@ -331,7 +337,8 @@ class SearchResultWeb(BaseModel):
331
337
  """A web search result with URL, title, and description."""
332
338
  url: str
333
339
  title: Optional[str] = None
334
- description: Optional[str] = None
340
+ description: Optional[str] = None
341
+ category: Optional[str] = None
335
342
 
336
343
  class SearchResultNews(BaseModel):
337
344
  """A news search result with URL, title, snippet, date, image URL, and position."""
@@ -341,6 +348,7 @@ class SearchResultNews(BaseModel):
341
348
  date: Optional[str] = None
342
349
  image_url: Optional[str] = None
343
350
  position: Optional[int] = None
351
+ category: Optional[str] = None
344
352
 
345
353
  class SearchResultImages(BaseModel):
346
354
  """An image search result with URL, title, image URL, image width, image height, and position."""
@@ -521,6 +529,7 @@ class SearchRequest(BaseModel):
521
529
  """Request for search operations."""
522
530
  query: str
523
531
  sources: Optional[List[SourceOption]] = None
532
+ categories: Optional[List[CategoryOption]] = None
524
533
  limit: Optional[int] = 5
525
534
  tbs: Optional[str] = None
526
535
  location: Optional[str] = None
@@ -547,6 +556,26 @@ class SearchRequest(BaseModel):
547
556
  raise ValueError(f"Invalid source format: {source}")
548
557
 
549
558
  return normalized_sources
559
+
560
+ @field_validator('categories')
561
+ @classmethod
562
+ def validate_categories(cls, v):
563
+ """Validate and normalize categories input."""
564
+ if v is None:
565
+ return v
566
+
567
+ normalized_categories = []
568
+ for category in v:
569
+ if isinstance(category, str):
570
+ normalized_categories.append(Category(type=category))
571
+ elif isinstance(category, dict):
572
+ normalized_categories.append(Category(**category))
573
+ elif isinstance(category, Category):
574
+ normalized_categories.append(category)
575
+ else:
576
+ raise ValueError(f"Invalid category format: {category}")
577
+
578
+ return normalized_categories
550
579
 
551
580
  class LinkResult(BaseModel):
552
581
  """A generic link result with optional metadata (used by search and map)."""
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.1
2
2
  Name: firecrawl
3
- Version: 3.2.1
3
+ Version: 3.3.2
4
4
  Summary: Python SDK for Firecrawl API
5
5
  Home-page: https://github.com/firecrawl/firecrawl
6
6
  Author: Mendable.ai
@@ -40,10 +40,6 @@ Requires-Dist: websockets
40
40
  Requires-Dist: nest-asyncio
41
41
  Requires-Dist: pydantic>=2.0
42
42
  Requires-Dist: aiohttp
43
- Dynamic: author
44
- Dynamic: home-page
45
- Dynamic: license-file
46
- Dynamic: requires-python
47
43
 
48
44
  # Firecrawl Python SDK
49
45
 
@@ -1,3 +1,2 @@
1
- dist
2
1
  firecrawl
3
2
  tests
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes