From c4538b459e6dcee56fb4b2ca85c94db4589d4318 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 18 Mar 2026 01:24:06 +0000
Subject: [PATCH 1/4] feat(api): api update
---
.stats.yml | 4 +--
src/context/dev/resources/brand.py | 36 +++++++++++++++++++
.../brand_identify_from_transaction_params.py | 3 ++
.../types/brand_retrieve_by_email_params.py | 3 ++
.../types/brand_retrieve_by_isin_params.py | 3 ++
.../types/brand_retrieve_by_name_params.py | 3 ++
.../types/brand_retrieve_by_ticker_params.py | 3 ++
.../dev/types/brand_retrieve_params.py | 3 ++
8 files changed, 56 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index bc49c22..e2bfe66 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 20
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/context-dev%2Fcontext.dev-c5d5abb4b31f6e352e3e02b47120e3f444377c1c564f141ebe0988b86ba5932e.yml
-openapi_spec_hash: 8ef4803fbe33ae6472a4b8f660be7921
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/context-dev%2Fcontext.dev-c2e94e0c758b1aaba120c2a4231842fff0a120acc471fe24c7a81221e13a0482.yml
+openapi_spec_hash: aabc231b46b1ca3375882f96c378c665
config_hash: a144af00e5e74176674d0ea954cc02c5
diff --git a/src/context/dev/resources/brand.py b/src/context/dev/resources/brand.py
index dbcacdc..d50f08f 100644
--- a/src/context/dev/resources/brand.py
+++ b/src/context/dev/resources/brand.py
@@ -94,6 +94,7 @@ def retrieve(
"azeri",
"bengali",
"bulgarian",
+ "cantonese",
"cebuano",
"croatian",
"czech",
@@ -113,6 +114,7 @@ def retrieve(
"indonesian",
"italian",
"kazakh",
+ "korean",
"kyrgyz",
"latin",
"latvian",
@@ -135,6 +137,7 @@ def retrieve(
"swahili",
"swedish",
"tagalog",
+ "thai",
"turkish",
"ukrainian",
"urdu",
@@ -713,6 +716,7 @@ def identify_from_transaction(
"azeri",
"bengali",
"bulgarian",
+ "cantonese",
"cebuano",
"croatian",
"czech",
@@ -732,6 +736,7 @@ def identify_from_transaction(
"indonesian",
"italian",
"kazakh",
+ "korean",
"kyrgyz",
"latin",
"latvian",
@@ -754,6 +759,7 @@ def identify_from_transaction(
"swahili",
"swedish",
"tagalog",
+ "thai",
"turkish",
"ukrainian",
"urdu",
@@ -948,6 +954,7 @@ def retrieve_by_email(
"azeri",
"bengali",
"bulgarian",
+ "cantonese",
"cebuano",
"croatian",
"czech",
@@ -967,6 +974,7 @@ def retrieve_by_email(
"indonesian",
"italian",
"kazakh",
+ "korean",
"kyrgyz",
"latin",
"latvian",
@@ -989,6 +997,7 @@ def retrieve_by_email(
"swahili",
"swedish",
"tagalog",
+ "thai",
"turkish",
"ukrainian",
"urdu",
@@ -1065,6 +1074,7 @@ def retrieve_by_isin(
"azeri",
"bengali",
"bulgarian",
+ "cantonese",
"cebuano",
"croatian",
"czech",
@@ -1084,6 +1094,7 @@ def retrieve_by_isin(
"indonesian",
"italian",
"kazakh",
+ "korean",
"kyrgyz",
"latin",
"latvian",
@@ -1106,6 +1117,7 @@ def retrieve_by_isin(
"swahili",
"swedish",
"tagalog",
+ "thai",
"turkish",
"ukrainian",
"urdu",
@@ -1423,6 +1435,7 @@ def retrieve_by_name(
"azeri",
"bengali",
"bulgarian",
+ "cantonese",
"cebuano",
"croatian",
"czech",
@@ -1442,6 +1455,7 @@ def retrieve_by_name(
"indonesian",
"italian",
"kazakh",
+ "korean",
"kyrgyz",
"latin",
"latvian",
@@ -1464,6 +1478,7 @@ def retrieve_by_name(
"swahili",
"swedish",
"tagalog",
+ "thai",
"turkish",
"ukrainian",
"urdu",
@@ -1542,6 +1557,7 @@ def retrieve_by_ticker(
"azeri",
"bengali",
"bulgarian",
+ "cantonese",
"cebuano",
"croatian",
"czech",
@@ -1561,6 +1577,7 @@ def retrieve_by_ticker(
"indonesian",
"italian",
"kazakh",
+ "korean",
"kyrgyz",
"latin",
"latvian",
@@ -1583,6 +1600,7 @@ def retrieve_by_ticker(
"swahili",
"swedish",
"tagalog",
+ "thai",
"turkish",
"ukrainian",
"urdu",
@@ -2171,6 +2189,7 @@ async def retrieve(
"azeri",
"bengali",
"bulgarian",
+ "cantonese",
"cebuano",
"croatian",
"czech",
@@ -2190,6 +2209,7 @@ async def retrieve(
"indonesian",
"italian",
"kazakh",
+ "korean",
"kyrgyz",
"latin",
"latvian",
@@ -2212,6 +2232,7 @@ async def retrieve(
"swahili",
"swedish",
"tagalog",
+ "thai",
"turkish",
"ukrainian",
"urdu",
@@ -2790,6 +2811,7 @@ async def identify_from_transaction(
"azeri",
"bengali",
"bulgarian",
+ "cantonese",
"cebuano",
"croatian",
"czech",
@@ -2809,6 +2831,7 @@ async def identify_from_transaction(
"indonesian",
"italian",
"kazakh",
+ "korean",
"kyrgyz",
"latin",
"latvian",
@@ -2831,6 +2854,7 @@ async def identify_from_transaction(
"swahili",
"swedish",
"tagalog",
+ "thai",
"turkish",
"ukrainian",
"urdu",
@@ -3025,6 +3049,7 @@ async def retrieve_by_email(
"azeri",
"bengali",
"bulgarian",
+ "cantonese",
"cebuano",
"croatian",
"czech",
@@ -3044,6 +3069,7 @@ async def retrieve_by_email(
"indonesian",
"italian",
"kazakh",
+ "korean",
"kyrgyz",
"latin",
"latvian",
@@ -3066,6 +3092,7 @@ async def retrieve_by_email(
"swahili",
"swedish",
"tagalog",
+ "thai",
"turkish",
"ukrainian",
"urdu",
@@ -3142,6 +3169,7 @@ async def retrieve_by_isin(
"azeri",
"bengali",
"bulgarian",
+ "cantonese",
"cebuano",
"croatian",
"czech",
@@ -3161,6 +3189,7 @@ async def retrieve_by_isin(
"indonesian",
"italian",
"kazakh",
+ "korean",
"kyrgyz",
"latin",
"latvian",
@@ -3183,6 +3212,7 @@ async def retrieve_by_isin(
"swahili",
"swedish",
"tagalog",
+ "thai",
"turkish",
"ukrainian",
"urdu",
@@ -3500,6 +3530,7 @@ async def retrieve_by_name(
"azeri",
"bengali",
"bulgarian",
+ "cantonese",
"cebuano",
"croatian",
"czech",
@@ -3519,6 +3550,7 @@ async def retrieve_by_name(
"indonesian",
"italian",
"kazakh",
+ "korean",
"kyrgyz",
"latin",
"latvian",
@@ -3541,6 +3573,7 @@ async def retrieve_by_name(
"swahili",
"swedish",
"tagalog",
+ "thai",
"turkish",
"ukrainian",
"urdu",
@@ -3619,6 +3652,7 @@ async def retrieve_by_ticker(
"azeri",
"bengali",
"bulgarian",
+ "cantonese",
"cebuano",
"croatian",
"czech",
@@ -3638,6 +3672,7 @@ async def retrieve_by_ticker(
"indonesian",
"italian",
"kazakh",
+ "korean",
"kyrgyz",
"latin",
"latvian",
@@ -3660,6 +3695,7 @@ async def retrieve_by_ticker(
"swahili",
"swedish",
"tagalog",
+ "thai",
"turkish",
"ukrainian",
"urdu",
diff --git a/src/context/dev/types/brand_identify_from_transaction_params.py b/src/context/dev/types/brand_identify_from_transaction_params.py
index bc46c8f..e04b1e5 100644
--- a/src/context/dev/types/brand_identify_from_transaction_params.py
+++ b/src/context/dev/types/brand_identify_from_transaction_params.py
@@ -268,6 +268,7 @@ class BrandIdentifyFromTransactionParams(TypedDict, total=False):
"azeri",
"bengali",
"bulgarian",
+ "cantonese",
"cebuano",
"croatian",
"czech",
@@ -287,6 +288,7 @@ class BrandIdentifyFromTransactionParams(TypedDict, total=False):
"indonesian",
"italian",
"kazakh",
+ "korean",
"kyrgyz",
"latin",
"latvian",
@@ -309,6 +311,7 @@ class BrandIdentifyFromTransactionParams(TypedDict, total=False):
"swahili",
"swedish",
"tagalog",
+ "thai",
"turkish",
"ukrainian",
"urdu",
diff --git a/src/context/dev/types/brand_retrieve_by_email_params.py b/src/context/dev/types/brand_retrieve_by_email_params.py
index da361c6..886c213 100644
--- a/src/context/dev/types/brand_retrieve_by_email_params.py
+++ b/src/context/dev/types/brand_retrieve_by_email_params.py
@@ -23,6 +23,7 @@ class BrandRetrieveByEmailParams(TypedDict, total=False):
"azeri",
"bengali",
"bulgarian",
+ "cantonese",
"cebuano",
"croatian",
"czech",
@@ -42,6 +43,7 @@ class BrandRetrieveByEmailParams(TypedDict, total=False):
"indonesian",
"italian",
"kazakh",
+ "korean",
"kyrgyz",
"latin",
"latvian",
@@ -64,6 +66,7 @@ class BrandRetrieveByEmailParams(TypedDict, total=False):
"swahili",
"swedish",
"tagalog",
+ "thai",
"turkish",
"ukrainian",
"urdu",
diff --git a/src/context/dev/types/brand_retrieve_by_isin_params.py b/src/context/dev/types/brand_retrieve_by_isin_params.py
index db2731b..db559fa 100644
--- a/src/context/dev/types/brand_retrieve_by_isin_params.py
+++ b/src/context/dev/types/brand_retrieve_by_isin_params.py
@@ -23,6 +23,7 @@ class BrandRetrieveByIsinParams(TypedDict, total=False):
"azeri",
"bengali",
"bulgarian",
+ "cantonese",
"cebuano",
"croatian",
"czech",
@@ -42,6 +43,7 @@ class BrandRetrieveByIsinParams(TypedDict, total=False):
"indonesian",
"italian",
"kazakh",
+ "korean",
"kyrgyz",
"latin",
"latvian",
@@ -64,6 +66,7 @@ class BrandRetrieveByIsinParams(TypedDict, total=False):
"swahili",
"swedish",
"tagalog",
+ "thai",
"turkish",
"ukrainian",
"urdu",
diff --git a/src/context/dev/types/brand_retrieve_by_name_params.py b/src/context/dev/types/brand_retrieve_by_name_params.py
index 542f481..847bdb3 100644
--- a/src/context/dev/types/brand_retrieve_by_name_params.py
+++ b/src/context/dev/types/brand_retrieve_by_name_params.py
@@ -268,6 +268,7 @@ class BrandRetrieveByNameParams(TypedDict, total=False):
"azeri",
"bengali",
"bulgarian",
+ "cantonese",
"cebuano",
"croatian",
"czech",
@@ -287,6 +288,7 @@ class BrandRetrieveByNameParams(TypedDict, total=False):
"indonesian",
"italian",
"kazakh",
+ "korean",
"kyrgyz",
"latin",
"latvian",
@@ -309,6 +311,7 @@ class BrandRetrieveByNameParams(TypedDict, total=False):
"swahili",
"swedish",
"tagalog",
+ "thai",
"turkish",
"ukrainian",
"urdu",
diff --git a/src/context/dev/types/brand_retrieve_by_ticker_params.py b/src/context/dev/types/brand_retrieve_by_ticker_params.py
index 4bbdb2f..d328385 100644
--- a/src/context/dev/types/brand_retrieve_by_ticker_params.py
+++ b/src/context/dev/types/brand_retrieve_by_ticker_params.py
@@ -22,6 +22,7 @@ class BrandRetrieveByTickerParams(TypedDict, total=False):
"azeri",
"bengali",
"bulgarian",
+ "cantonese",
"cebuano",
"croatian",
"czech",
@@ -41,6 +42,7 @@ class BrandRetrieveByTickerParams(TypedDict, total=False):
"indonesian",
"italian",
"kazakh",
+ "korean",
"kyrgyz",
"latin",
"latvian",
@@ -63,6 +65,7 @@ class BrandRetrieveByTickerParams(TypedDict, total=False):
"swahili",
"swedish",
"tagalog",
+ "thai",
"turkish",
"ukrainian",
"urdu",
diff --git a/src/context/dev/types/brand_retrieve_params.py b/src/context/dev/types/brand_retrieve_params.py
index 5091652..03e102a 100644
--- a/src/context/dev/types/brand_retrieve_params.py
+++ b/src/context/dev/types/brand_retrieve_params.py
@@ -22,6 +22,7 @@ class BrandRetrieveParams(TypedDict, total=False):
"azeri",
"bengali",
"bulgarian",
+ "cantonese",
"cebuano",
"croatian",
"czech",
@@ -41,6 +42,7 @@ class BrandRetrieveParams(TypedDict, total=False):
"indonesian",
"italian",
"kazakh",
+ "korean",
"kyrgyz",
"latin",
"latvian",
@@ -63,6 +65,7 @@ class BrandRetrieveParams(TypedDict, total=False):
"swahili",
"swedish",
"tagalog",
+ "thai",
"turkish",
"ukrainian",
"urdu",
From 3285d21cae790e5529ba6fcd7a79612ffc7e7738 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 18 Mar 2026 20:25:36 +0000
Subject: [PATCH 2/4] feat(api): manual updates
---
.stats.yml | 2 +-
api.md | 28 +-
src/context/dev/_client.py | 39 +-
src/context/dev/resources/__init__.py | 14 +
src/context/dev/resources/brand.py | 412 ---------------
src/context/dev/resources/web.py | 497 ++++++++++++++++++
src/context/dev/types/__init__.py | 16 +-
...arams.py => web_web_scrape_html_params.py} | 4 +-
...nse.py => web_web_scrape_html_response.py} | 4 +-
...ams.py => web_web_scrape_images_params.py} | 4 +-
...e.py => web_web_scrape_images_response.py} | 4 +-
..._params.py => web_web_scrape_md_params.py} | 4 +-
...ponse.py => web_web_scrape_md_response.py} | 4 +-
...ms.py => web_web_scrape_sitemap_params.py} | 4 +-
....py => web_web_scrape_sitemap_response.py} | 4 +-
tests/api_resources/test_brand.py | 298 -----------
tests/api_resources/test_web.py | 323 ++++++++++++
17 files changed, 917 insertions(+), 744 deletions(-)
create mode 100644 src/context/dev/resources/web.py
rename src/context/dev/types/{brand_web_scrape_html_params.py => web_web_scrape_html_params.py} (74%)
rename src/context/dev/types/{brand_web_scrape_html_response.py => web_web_scrape_html_response.py} (78%)
rename src/context/dev/types/{brand_web_scrape_images_params.py => web_web_scrape_images_params.py} (74%)
rename src/context/dev/types/{brand_web_scrape_images_response.py => web_web_scrape_images_response.py} (88%)
rename src/context/dev/types/{brand_web_scrape_md_params.py => web_web_scrape_md_params.py} (89%)
rename src/context/dev/types/{brand_web_scrape_md_response.py => web_web_scrape_md_response.py} (80%)
rename src/context/dev/types/{brand_web_scrape_sitemap_params.py => web_web_scrape_sitemap_params.py} (76%)
rename src/context/dev/types/{brand_web_scrape_sitemap_response.py => web_web_scrape_sitemap_response.py} (91%)
create mode 100644 tests/api_resources/test_web.py
diff --git a/.stats.yml b/.stats.yml
index e2bfe66..ffc3312 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 20
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/context-dev%2Fcontext.dev-c2e94e0c758b1aaba120c2a4231842fff0a120acc471fe24c7a81221e13a0482.yml
openapi_spec_hash: aabc231b46b1ca3375882f96c378c665
-config_hash: a144af00e5e74176674d0ea954cc02c5
+config_hash: c6eb5818596f9926ef1225a0c7a855db
diff --git a/api.md b/api.md
index 5e27158..759c526 100644
--- a/api.md
+++ b/api.md
@@ -1,3 +1,23 @@
+# Web
+
+Types:
+
+```python
+from context.dev.types import (
+ WebWebScrapeHTMLResponse,
+ WebWebScrapeImagesResponse,
+ WebWebScrapeMdResponse,
+ WebWebScrapeSitemapResponse,
+)
+```
+
+Methods:
+
+- client.web.web_scrape_html(\*\*params) -> WebWebScrapeHTMLResponse
+- client.web.web_scrape_images(\*\*params) -> WebWebScrapeImagesResponse
+- client.web.web_scrape_md(\*\*params) -> WebWebScrapeMdResponse
+- client.web.web_scrape_sitemap(\*\*params) -> WebWebScrapeSitemapResponse
+
# Brand
Types:
@@ -20,10 +40,6 @@ from context.dev.types import (
BrandRetrieveSimplifiedResponse,
BrandScreenshotResponse,
BrandStyleguideResponse,
- BrandWebScrapeHTMLResponse,
- BrandWebScrapeImagesResponse,
- BrandWebScrapeMdResponse,
- BrandWebScrapeSitemapResponse,
)
```
@@ -45,7 +61,3 @@ Methods:
- client.brand.retrieve_simplified(\*\*params) -> BrandRetrieveSimplifiedResponse
- client.brand.screenshot(\*\*params) -> BrandScreenshotResponse
- client.brand.styleguide(\*\*params) -> BrandStyleguideResponse
-- client.brand.web_scrape_html(\*\*params) -> BrandWebScrapeHTMLResponse
-- client.brand.web_scrape_images(\*\*params) -> BrandWebScrapeImagesResponse
-- client.brand.web_scrape_md(\*\*params) -> BrandWebScrapeMdResponse
-- client.brand.web_scrape_sitemap(\*\*params) -> BrandWebScrapeSitemapResponse
diff --git a/src/context/dev/_client.py b/src/context/dev/_client.py
index cd61b93..e33d295 100644
--- a/src/context/dev/_client.py
+++ b/src/context/dev/_client.py
@@ -31,7 +31,8 @@
)
if TYPE_CHECKING:
- from .resources import brand
+ from .resources import web, brand
+ from .resources.web import WebResource, AsyncWebResource
from .resources.brand import BrandResource, AsyncBrandResource
__all__ = [
@@ -101,6 +102,12 @@ def __init__(
_strict_response_validation=_strict_response_validation,
)
+ @cached_property
+ def web(self) -> WebResource:
+ from .resources.web import WebResource
+
+ return WebResource(self)
+
@cached_property
def brand(self) -> BrandResource:
from .resources.brand import BrandResource
@@ -275,6 +282,12 @@ def __init__(
_strict_response_validation=_strict_response_validation,
)
+ @cached_property
+ def web(self) -> AsyncWebResource:
+ from .resources.web import AsyncWebResource
+
+ return AsyncWebResource(self)
+
@cached_property
def brand(self) -> AsyncBrandResource:
from .resources.brand import AsyncBrandResource
@@ -400,6 +413,12 @@ class ContextDevWithRawResponse:
def __init__(self, client: ContextDev) -> None:
self._client = client
+ @cached_property
+ def web(self) -> web.WebResourceWithRawResponse:
+ from .resources.web import WebResourceWithRawResponse
+
+ return WebResourceWithRawResponse(self._client.web)
+
@cached_property
def brand(self) -> brand.BrandResourceWithRawResponse:
from .resources.brand import BrandResourceWithRawResponse
@@ -413,6 +432,12 @@ class AsyncContextDevWithRawResponse:
def __init__(self, client: AsyncContextDev) -> None:
self._client = client
+ @cached_property
+ def web(self) -> web.AsyncWebResourceWithRawResponse:
+ from .resources.web import AsyncWebResourceWithRawResponse
+
+ return AsyncWebResourceWithRawResponse(self._client.web)
+
@cached_property
def brand(self) -> brand.AsyncBrandResourceWithRawResponse:
from .resources.brand import AsyncBrandResourceWithRawResponse
@@ -426,6 +451,12 @@ class ContextDevWithStreamedResponse:
def __init__(self, client: ContextDev) -> None:
self._client = client
+ @cached_property
+ def web(self) -> web.WebResourceWithStreamingResponse:
+ from .resources.web import WebResourceWithStreamingResponse
+
+ return WebResourceWithStreamingResponse(self._client.web)
+
@cached_property
def brand(self) -> brand.BrandResourceWithStreamingResponse:
from .resources.brand import BrandResourceWithStreamingResponse
@@ -439,6 +470,12 @@ class AsyncContextDevWithStreamedResponse:
def __init__(self, client: AsyncContextDev) -> None:
self._client = client
+ @cached_property
+ def web(self) -> web.AsyncWebResourceWithStreamingResponse:
+ from .resources.web import AsyncWebResourceWithStreamingResponse
+
+ return AsyncWebResourceWithStreamingResponse(self._client.web)
+
@cached_property
def brand(self) -> brand.AsyncBrandResourceWithStreamingResponse:
from .resources.brand import AsyncBrandResourceWithStreamingResponse
diff --git a/src/context/dev/resources/__init__.py b/src/context/dev/resources/__init__.py
index ffb8f92..cb459fa 100644
--- a/src/context/dev/resources/__init__.py
+++ b/src/context/dev/resources/__init__.py
@@ -1,5 +1,13 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+from .web import (
+ WebResource,
+ AsyncWebResource,
+ WebResourceWithRawResponse,
+ AsyncWebResourceWithRawResponse,
+ WebResourceWithStreamingResponse,
+ AsyncWebResourceWithStreamingResponse,
+)
from .brand import (
BrandResource,
AsyncBrandResource,
@@ -10,6 +18,12 @@
)
__all__ = [
+ "WebResource",
+ "AsyncWebResource",
+ "WebResourceWithRawResponse",
+ "AsyncWebResourceWithRawResponse",
+ "WebResourceWithStreamingResponse",
+ "AsyncWebResourceWithStreamingResponse",
"BrandResource",
"AsyncBrandResource",
"BrandResourceWithRawResponse",
diff --git a/src/context/dev/resources/brand.py b/src/context/dev/resources/brand.py
index d50f08f..fa19ecb 100644
--- a/src/context/dev/resources/brand.py
+++ b/src/context/dev/resources/brand.py
@@ -16,16 +16,12 @@
brand_screenshot_params,
brand_styleguide_params,
brand_ai_products_params,
- brand_web_scrape_md_params,
brand_retrieve_naics_params,
- brand_web_scrape_html_params,
brand_retrieve_by_isin_params,
brand_retrieve_by_name_params,
brand_prefetch_by_email_params,
brand_retrieve_by_email_params,
- brand_web_scrape_images_params,
brand_retrieve_by_ticker_params,
- brand_web_scrape_sitemap_params,
brand_retrieve_simplified_params,
brand_identify_from_transaction_params,
)
@@ -48,16 +44,12 @@
from ..types.brand_screenshot_response import BrandScreenshotResponse
from ..types.brand_styleguide_response import BrandStyleguideResponse
from ..types.brand_ai_products_response import BrandAIProductsResponse
-from ..types.brand_web_scrape_md_response import BrandWebScrapeMdResponse
from ..types.brand_retrieve_naics_response import BrandRetrieveNaicsResponse
-from ..types.brand_web_scrape_html_response import BrandWebScrapeHTMLResponse
from ..types.brand_retrieve_by_isin_response import BrandRetrieveByIsinResponse
from ..types.brand_retrieve_by_name_response import BrandRetrieveByNameResponse
from ..types.brand_prefetch_by_email_response import BrandPrefetchByEmailResponse
from ..types.brand_retrieve_by_email_response import BrandRetrieveByEmailResponse
-from ..types.brand_web_scrape_images_response import BrandWebScrapeImagesResponse
from ..types.brand_retrieve_by_ticker_response import BrandRetrieveByTickerResponse
-from ..types.brand_web_scrape_sitemap_response import BrandWebScrapeSitemapResponse
from ..types.brand_retrieve_simplified_response import BrandRetrieveSimplifiedResponse
from ..types.brand_identify_from_transaction_response import BrandIdentifyFromTransactionResponse
@@ -1982,182 +1974,6 @@ def styleguide(
cast_to=BrandStyleguideResponse,
)
- def web_scrape_html(
- self,
- *,
- url: str,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandWebScrapeHTMLResponse:
- """Scrapes the given URL and returns the raw HTML content of the page.
-
- Uses
- automatic proxy escalation to handle blocked sites.
-
- Args:
- url: Full URL to scrape (must include http:// or https:// protocol)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return self._get(
- "/web/scrape/html",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=maybe_transform({"url": url}, brand_web_scrape_html_params.BrandWebScrapeHTMLParams),
- ),
- cast_to=BrandWebScrapeHTMLResponse,
- )
-
- def web_scrape_images(
- self,
- *,
- url: str,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandWebScrapeImagesResponse:
- """Scrapes all images from the given URL.
-
- Extracts images from img, svg,
- picture/source, link, and video elements including inline SVGs, base64 data
- URIs, and standard URLs.
-
- Args:
- url: Full URL to scrape images from (must include http:// or https:// protocol)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return self._get(
- "/web/scrape/images",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=maybe_transform({"url": url}, brand_web_scrape_images_params.BrandWebScrapeImagesParams),
- ),
- cast_to=BrandWebScrapeImagesResponse,
- )
-
- def web_scrape_md(
- self,
- *,
- url: str,
- include_images: bool | Omit = omit,
- include_links: bool | Omit = omit,
- shorten_base64_images: bool | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandWebScrapeMdResponse:
- """
- Scrapes the given URL, converts the HTML content to GitHub Flavored Markdown
- (GFM), and returns the result. Uses automatic proxy escalation to handle blocked
- sites.
-
- Args:
- url: Full URL to scrape and convert to markdown (must include http:// or https://
- protocol)
-
- include_images: Include image references in Markdown output
-
- include_links: Preserve hyperlinks in Markdown output
-
- shorten_base64_images: Shorten base64-encoded image data in the Markdown output
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return self._get(
- "/web/scrape/markdown",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=maybe_transform(
- {
- "url": url,
- "include_images": include_images,
- "include_links": include_links,
- "shorten_base64_images": shorten_base64_images,
- },
- brand_web_scrape_md_params.BrandWebScrapeMdParams,
- ),
- ),
- cast_to=BrandWebScrapeMdResponse,
- )
-
- def web_scrape_sitemap(
- self,
- *,
- domain: str,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandWebScrapeSitemapResponse:
- """
- Crawls the sitemap of the given domain and returns all discovered page URLs.
- Supports sitemap index files (recursive), parallel fetching with concurrency
- control, deduplication, and filters out non-page resources (images, PDFs, etc.).
-
- Args:
- domain: Domain name to crawl sitemaps for (e.g., 'example.com'). The domain will be
- automatically normalized and validated.
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return self._get(
- "/web/scrape/sitemap",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=maybe_transform({"domain": domain}, brand_web_scrape_sitemap_params.BrandWebScrapeSitemapParams),
- ),
- cast_to=BrandWebScrapeSitemapResponse,
- )
-
class AsyncBrandResource(AsyncAPIResource):
@cached_property
@@ -4077,186 +3893,6 @@ async def styleguide(
cast_to=BrandStyleguideResponse,
)
- async def web_scrape_html(
- self,
- *,
- url: str,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandWebScrapeHTMLResponse:
- """Scrapes the given URL and returns the raw HTML content of the page.
-
- Uses
- automatic proxy escalation to handle blocked sites.
-
- Args:
- url: Full URL to scrape (must include http:// or https:// protocol)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return await self._get(
- "/web/scrape/html",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=await async_maybe_transform({"url": url}, brand_web_scrape_html_params.BrandWebScrapeHTMLParams),
- ),
- cast_to=BrandWebScrapeHTMLResponse,
- )
-
- async def web_scrape_images(
- self,
- *,
- url: str,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandWebScrapeImagesResponse:
- """Scrapes all images from the given URL.
-
- Extracts images from img, svg,
- picture/source, link, and video elements including inline SVGs, base64 data
- URIs, and standard URLs.
-
- Args:
- url: Full URL to scrape images from (must include http:// or https:// protocol)
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return await self._get(
- "/web/scrape/images",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=await async_maybe_transform(
- {"url": url}, brand_web_scrape_images_params.BrandWebScrapeImagesParams
- ),
- ),
- cast_to=BrandWebScrapeImagesResponse,
- )
-
- async def web_scrape_md(
- self,
- *,
- url: str,
- include_images: bool | Omit = omit,
- include_links: bool | Omit = omit,
- shorten_base64_images: bool | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandWebScrapeMdResponse:
- """
- Scrapes the given URL, converts the HTML content to GitHub Flavored Markdown
- (GFM), and returns the result. Uses automatic proxy escalation to handle blocked
- sites.
-
- Args:
- url: Full URL to scrape and convert to markdown (must include http:// or https://
- protocol)
-
- include_images: Include image references in Markdown output
-
- include_links: Preserve hyperlinks in Markdown output
-
- shorten_base64_images: Shorten base64-encoded image data in the Markdown output
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return await self._get(
- "/web/scrape/markdown",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=await async_maybe_transform(
- {
- "url": url,
- "include_images": include_images,
- "include_links": include_links,
- "shorten_base64_images": shorten_base64_images,
- },
- brand_web_scrape_md_params.BrandWebScrapeMdParams,
- ),
- ),
- cast_to=BrandWebScrapeMdResponse,
- )
-
- async def web_scrape_sitemap(
- self,
- *,
- domain: str,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandWebScrapeSitemapResponse:
- """
- Crawls the sitemap of the given domain and returns all discovered page URLs.
- Supports sitemap index files (recursive), parallel fetching with concurrency
- control, deduplication, and filters out non-page resources (images, PDFs, etc.).
-
- Args:
- domain: Domain name to crawl sitemaps for (e.g., 'example.com'). The domain will be
- automatically normalized and validated.
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return await self._get(
- "/web/scrape/sitemap",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=await async_maybe_transform(
- {"domain": domain}, brand_web_scrape_sitemap_params.BrandWebScrapeSitemapParams
- ),
- ),
- cast_to=BrandWebScrapeSitemapResponse,
- )
-
class BrandResourceWithRawResponse:
def __init__(self, brand: BrandResource) -> None:
@@ -4310,18 +3946,6 @@ def __init__(self, brand: BrandResource) -> None:
self.styleguide = to_raw_response_wrapper(
brand.styleguide,
)
- self.web_scrape_html = to_raw_response_wrapper(
- brand.web_scrape_html,
- )
- self.web_scrape_images = to_raw_response_wrapper(
- brand.web_scrape_images,
- )
- self.web_scrape_md = to_raw_response_wrapper(
- brand.web_scrape_md,
- )
- self.web_scrape_sitemap = to_raw_response_wrapper(
- brand.web_scrape_sitemap,
- )
class AsyncBrandResourceWithRawResponse:
@@ -4376,18 +4000,6 @@ def __init__(self, brand: AsyncBrandResource) -> None:
self.styleguide = async_to_raw_response_wrapper(
brand.styleguide,
)
- self.web_scrape_html = async_to_raw_response_wrapper(
- brand.web_scrape_html,
- )
- self.web_scrape_images = async_to_raw_response_wrapper(
- brand.web_scrape_images,
- )
- self.web_scrape_md = async_to_raw_response_wrapper(
- brand.web_scrape_md,
- )
- self.web_scrape_sitemap = async_to_raw_response_wrapper(
- brand.web_scrape_sitemap,
- )
class BrandResourceWithStreamingResponse:
@@ -4442,18 +4054,6 @@ def __init__(self, brand: BrandResource) -> None:
self.styleguide = to_streamed_response_wrapper(
brand.styleguide,
)
- self.web_scrape_html = to_streamed_response_wrapper(
- brand.web_scrape_html,
- )
- self.web_scrape_images = to_streamed_response_wrapper(
- brand.web_scrape_images,
- )
- self.web_scrape_md = to_streamed_response_wrapper(
- brand.web_scrape_md,
- )
- self.web_scrape_sitemap = to_streamed_response_wrapper(
- brand.web_scrape_sitemap,
- )
class AsyncBrandResourceWithStreamingResponse:
@@ -4508,15 +4108,3 @@ def __init__(self, brand: AsyncBrandResource) -> None:
self.styleguide = async_to_streamed_response_wrapper(
brand.styleguide,
)
- self.web_scrape_html = async_to_streamed_response_wrapper(
- brand.web_scrape_html,
- )
- self.web_scrape_images = async_to_streamed_response_wrapper(
- brand.web_scrape_images,
- )
- self.web_scrape_md = async_to_streamed_response_wrapper(
- brand.web_scrape_md,
- )
- self.web_scrape_sitemap = async_to_streamed_response_wrapper(
- brand.web_scrape_sitemap,
- )
diff --git a/src/context/dev/resources/web.py b/src/context/dev/resources/web.py
new file mode 100644
index 0000000..4e227c2
--- /dev/null
+++ b/src/context/dev/resources/web.py
@@ -0,0 +1,497 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+import httpx
+
+from ..types import (
+ web_web_scrape_md_params,
+ web_web_scrape_html_params,
+ web_web_scrape_images_params,
+ web_web_scrape_sitemap_params,
+)
+from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
+from .._utils import maybe_transform, async_maybe_transform
+from .._compat import cached_property
+from .._resource import SyncAPIResource, AsyncAPIResource
+from .._response import (
+ to_raw_response_wrapper,
+ to_streamed_response_wrapper,
+ async_to_raw_response_wrapper,
+ async_to_streamed_response_wrapper,
+)
+from .._base_client import make_request_options
+from ..types.web_web_scrape_md_response import WebWebScrapeMdResponse
+from ..types.web_web_scrape_html_response import WebWebScrapeHTMLResponse
+from ..types.web_web_scrape_images_response import WebWebScrapeImagesResponse
+from ..types.web_web_scrape_sitemap_response import WebWebScrapeSitemapResponse
+
+__all__ = ["WebResource", "AsyncWebResource"]
+
+
+class WebResource(SyncAPIResource):
+ @cached_property
+ def with_raw_response(self) -> WebResourceWithRawResponse:
+ """
+ This property can be used as a prefix for any HTTP method call to return
+ the raw response object instead of the parsed content.
+
+ For more information, see https://www.github.com/brand-dot-dev/context-python-sdk#accessing-raw-response-data-eg-headers
+ """
+ return WebResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> WebResourceWithStreamingResponse:
+ """
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
+
+ For more information, see https://www.github.com/brand-dot-dev/context-python-sdk#with_streaming_response
+ """
+ return WebResourceWithStreamingResponse(self)
+
+ def web_scrape_html(
+ self,
+ *,
+ url: str,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> WebWebScrapeHTMLResponse:
+ """Scrapes the given URL and returns the raw HTML content of the page.
+
+ Uses
+ automatic proxy escalation to handle blocked sites.
+
+ Args:
+ url: Full URL to scrape (must include http:// or https:// protocol)
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return self._get(
+ "/web/scrape/html",
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=maybe_transform({"url": url}, web_web_scrape_html_params.WebWebScrapeHTMLParams),
+ ),
+ cast_to=WebWebScrapeHTMLResponse,
+ )
+
+ def web_scrape_images(
+ self,
+ *,
+ url: str,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> WebWebScrapeImagesResponse:
+ """Scrapes all images from the given URL.
+
+ Extracts images from img, svg,
+ picture/source, link, and video elements including inline SVGs, base64 data
+ URIs, and standard URLs.
+
+ Args:
+ url: Full URL to scrape images from (must include http:// or https:// protocol)
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return self._get(
+ "/web/scrape/images",
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=maybe_transform({"url": url}, web_web_scrape_images_params.WebWebScrapeImagesParams),
+ ),
+ cast_to=WebWebScrapeImagesResponse,
+ )
+
+ def web_scrape_md(
+ self,
+ *,
+ url: str,
+ include_images: bool | Omit = omit,
+ include_links: bool | Omit = omit,
+ shorten_base64_images: bool | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> WebWebScrapeMdResponse:
+ """
+ Scrapes the given URL, converts the HTML content to GitHub Flavored Markdown
+ (GFM), and returns the result. Uses automatic proxy escalation to handle blocked
+ sites.
+
+ Args:
+ url: Full URL to scrape and convert to markdown (must include http:// or https://
+ protocol)
+
+ include_images: Include image references in Markdown output
+
+ include_links: Preserve hyperlinks in Markdown output
+
+ shorten_base64_images: Shorten base64-encoded image data in the Markdown output
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return self._get(
+ "/web/scrape/markdown",
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=maybe_transform(
+ {
+ "url": url,
+ "include_images": include_images,
+ "include_links": include_links,
+ "shorten_base64_images": shorten_base64_images,
+ },
+ web_web_scrape_md_params.WebWebScrapeMdParams,
+ ),
+ ),
+ cast_to=WebWebScrapeMdResponse,
+ )
+
+ def web_scrape_sitemap(
+ self,
+ *,
+ domain: str,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> WebWebScrapeSitemapResponse:
+ """
+ Crawls the sitemap of the given domain and returns all discovered page URLs.
+ Supports sitemap index files (recursive), parallel fetching with concurrency
+ control, deduplication, and filters out non-page resources (images, PDFs, etc.).
+
+ Args:
+ domain: Domain name to crawl sitemaps for (e.g., 'example.com'). The domain will be
+ automatically normalized and validated.
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return self._get(
+ "/web/scrape/sitemap",
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=maybe_transform({"domain": domain}, web_web_scrape_sitemap_params.WebWebScrapeSitemapParams),
+ ),
+ cast_to=WebWebScrapeSitemapResponse,
+ )
+
+
+class AsyncWebResource(AsyncAPIResource):
+ @cached_property
+ def with_raw_response(self) -> AsyncWebResourceWithRawResponse:
+ """
+ This property can be used as a prefix for any HTTP method call to return
+ the raw response object instead of the parsed content.
+
+ For more information, see https://www.github.com/brand-dot-dev/context-python-sdk#accessing-raw-response-data-eg-headers
+ """
+ return AsyncWebResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> AsyncWebResourceWithStreamingResponse:
+ """
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
+
+ For more information, see https://www.github.com/brand-dot-dev/context-python-sdk#with_streaming_response
+ """
+ return AsyncWebResourceWithStreamingResponse(self)
+
+ async def web_scrape_html(
+ self,
+ *,
+ url: str,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> WebWebScrapeHTMLResponse:
+ """Scrapes the given URL and returns the raw HTML content of the page.
+
+ Uses
+ automatic proxy escalation to handle blocked sites.
+
+ Args:
+ url: Full URL to scrape (must include http:// or https:// protocol)
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return await self._get(
+ "/web/scrape/html",
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=await async_maybe_transform({"url": url}, web_web_scrape_html_params.WebWebScrapeHTMLParams),
+ ),
+ cast_to=WebWebScrapeHTMLResponse,
+ )
+
+ async def web_scrape_images(
+ self,
+ *,
+ url: str,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> WebWebScrapeImagesResponse:
+ """Scrapes all images from the given URL.
+
+ Extracts images from img, svg,
+ picture/source, link, and video elements including inline SVGs, base64 data
+ URIs, and standard URLs.
+
+ Args:
+ url: Full URL to scrape images from (must include http:// or https:// protocol)
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return await self._get(
+ "/web/scrape/images",
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=await async_maybe_transform({"url": url}, web_web_scrape_images_params.WebWebScrapeImagesParams),
+ ),
+ cast_to=WebWebScrapeImagesResponse,
+ )
+
+ async def web_scrape_md(
+ self,
+ *,
+ url: str,
+ include_images: bool | Omit = omit,
+ include_links: bool | Omit = omit,
+ shorten_base64_images: bool | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> WebWebScrapeMdResponse:
+ """
+ Scrapes the given URL, converts the HTML content to GitHub Flavored Markdown
+ (GFM), and returns the result. Uses automatic proxy escalation to handle blocked
+ sites.
+
+ Args:
+ url: Full URL to scrape and convert to markdown (must include http:// or https://
+ protocol)
+
+ include_images: Include image references in Markdown output
+
+ include_links: Preserve hyperlinks in Markdown output
+
+ shorten_base64_images: Shorten base64-encoded image data in the Markdown output
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return await self._get(
+ "/web/scrape/markdown",
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=await async_maybe_transform(
+ {
+ "url": url,
+ "include_images": include_images,
+ "include_links": include_links,
+ "shorten_base64_images": shorten_base64_images,
+ },
+ web_web_scrape_md_params.WebWebScrapeMdParams,
+ ),
+ ),
+ cast_to=WebWebScrapeMdResponse,
+ )
+
+ async def web_scrape_sitemap(
+ self,
+ *,
+ domain: str,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> WebWebScrapeSitemapResponse:
+ """
+ Crawls the sitemap of the given domain and returns all discovered page URLs.
+ Supports sitemap index files (recursive), parallel fetching with concurrency
+ control, deduplication, and filters out non-page resources (images, PDFs, etc.).
+
+ Args:
+ domain: Domain name to crawl sitemaps for (e.g., 'example.com'). The domain will be
+ automatically normalized and validated.
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return await self._get(
+ "/web/scrape/sitemap",
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=await async_maybe_transform(
+ {"domain": domain}, web_web_scrape_sitemap_params.WebWebScrapeSitemapParams
+ ),
+ ),
+ cast_to=WebWebScrapeSitemapResponse,
+ )
+
+
+class WebResourceWithRawResponse:
+ def __init__(self, web: WebResource) -> None:
+ self._web = web
+
+ self.web_scrape_html = to_raw_response_wrapper(
+ web.web_scrape_html,
+ )
+ self.web_scrape_images = to_raw_response_wrapper(
+ web.web_scrape_images,
+ )
+ self.web_scrape_md = to_raw_response_wrapper(
+ web.web_scrape_md,
+ )
+ self.web_scrape_sitemap = to_raw_response_wrapper(
+ web.web_scrape_sitemap,
+ )
+
+
+class AsyncWebResourceWithRawResponse:
+ def __init__(self, web: AsyncWebResource) -> None:
+ self._web = web
+
+ self.web_scrape_html = async_to_raw_response_wrapper(
+ web.web_scrape_html,
+ )
+ self.web_scrape_images = async_to_raw_response_wrapper(
+ web.web_scrape_images,
+ )
+ self.web_scrape_md = async_to_raw_response_wrapper(
+ web.web_scrape_md,
+ )
+ self.web_scrape_sitemap = async_to_raw_response_wrapper(
+ web.web_scrape_sitemap,
+ )
+
+
+class WebResourceWithStreamingResponse:
+ def __init__(self, web: WebResource) -> None:
+ self._web = web
+
+ self.web_scrape_html = to_streamed_response_wrapper(
+ web.web_scrape_html,
+ )
+ self.web_scrape_images = to_streamed_response_wrapper(
+ web.web_scrape_images,
+ )
+ self.web_scrape_md = to_streamed_response_wrapper(
+ web.web_scrape_md,
+ )
+ self.web_scrape_sitemap = to_streamed_response_wrapper(
+ web.web_scrape_sitemap,
+ )
+
+
+class AsyncWebResourceWithStreamingResponse:
+ def __init__(self, web: AsyncWebResource) -> None:
+ self._web = web
+
+ self.web_scrape_html = async_to_streamed_response_wrapper(
+ web.web_scrape_html,
+ )
+ self.web_scrape_images = async_to_streamed_response_wrapper(
+ web.web_scrape_images,
+ )
+ self.web_scrape_md = async_to_streamed_response_wrapper(
+ web.web_scrape_md,
+ )
+ self.web_scrape_sitemap = async_to_streamed_response_wrapper(
+ web.web_scrape_sitemap,
+ )
diff --git a/src/context/dev/types/__init__.py b/src/context/dev/types/__init__.py
index 2b7129d..56273fc 100644
--- a/src/context/dev/types/__init__.py
+++ b/src/context/dev/types/__init__.py
@@ -14,31 +14,31 @@
from .brand_screenshot_params import BrandScreenshotParams as BrandScreenshotParams
from .brand_styleguide_params import BrandStyleguideParams as BrandStyleguideParams
from .brand_ai_products_params import BrandAIProductsParams as BrandAIProductsParams
+from .web_web_scrape_md_params import WebWebScrapeMdParams as WebWebScrapeMdParams
from .brand_ai_product_response import BrandAIProductResponse as BrandAIProductResponse
from .brand_screenshot_response import BrandScreenshotResponse as BrandScreenshotResponse
from .brand_styleguide_response import BrandStyleguideResponse as BrandStyleguideResponse
from .brand_ai_products_response import BrandAIProductsResponse as BrandAIProductsResponse
-from .brand_web_scrape_md_params import BrandWebScrapeMdParams as BrandWebScrapeMdParams
+from .web_web_scrape_html_params import WebWebScrapeHTMLParams as WebWebScrapeHTMLParams
+from .web_web_scrape_md_response import WebWebScrapeMdResponse as WebWebScrapeMdResponse
from .brand_retrieve_naics_params import BrandRetrieveNaicsParams as BrandRetrieveNaicsParams
-from .brand_web_scrape_html_params import BrandWebScrapeHTMLParams as BrandWebScrapeHTMLParams
-from .brand_web_scrape_md_response import BrandWebScrapeMdResponse as BrandWebScrapeMdResponse
+from .web_web_scrape_html_response import WebWebScrapeHTMLResponse as WebWebScrapeHTMLResponse
+from .web_web_scrape_images_params import WebWebScrapeImagesParams as WebWebScrapeImagesParams
from .brand_retrieve_by_isin_params import BrandRetrieveByIsinParams as BrandRetrieveByIsinParams
from .brand_retrieve_by_name_params import BrandRetrieveByNameParams as BrandRetrieveByNameParams
from .brand_retrieve_naics_response import BrandRetrieveNaicsResponse as BrandRetrieveNaicsResponse
+from .web_web_scrape_sitemap_params import WebWebScrapeSitemapParams as WebWebScrapeSitemapParams
from .brand_prefetch_by_email_params import BrandPrefetchByEmailParams as BrandPrefetchByEmailParams
from .brand_retrieve_by_email_params import BrandRetrieveByEmailParams as BrandRetrieveByEmailParams
-from .brand_web_scrape_html_response import BrandWebScrapeHTMLResponse as BrandWebScrapeHTMLResponse
-from .brand_web_scrape_images_params import BrandWebScrapeImagesParams as BrandWebScrapeImagesParams
+from .web_web_scrape_images_response import WebWebScrapeImagesResponse as WebWebScrapeImagesResponse
from .brand_retrieve_by_isin_response import BrandRetrieveByIsinResponse as BrandRetrieveByIsinResponse
from .brand_retrieve_by_name_response import BrandRetrieveByNameResponse as BrandRetrieveByNameResponse
from .brand_retrieve_by_ticker_params import BrandRetrieveByTickerParams as BrandRetrieveByTickerParams
-from .brand_web_scrape_sitemap_params import BrandWebScrapeSitemapParams as BrandWebScrapeSitemapParams
+from .web_web_scrape_sitemap_response import WebWebScrapeSitemapResponse as WebWebScrapeSitemapResponse
from .brand_prefetch_by_email_response import BrandPrefetchByEmailResponse as BrandPrefetchByEmailResponse
from .brand_retrieve_by_email_response import BrandRetrieveByEmailResponse as BrandRetrieveByEmailResponse
from .brand_retrieve_simplified_params import BrandRetrieveSimplifiedParams as BrandRetrieveSimplifiedParams
-from .brand_web_scrape_images_response import BrandWebScrapeImagesResponse as BrandWebScrapeImagesResponse
from .brand_retrieve_by_ticker_response import BrandRetrieveByTickerResponse as BrandRetrieveByTickerResponse
-from .brand_web_scrape_sitemap_response import BrandWebScrapeSitemapResponse as BrandWebScrapeSitemapResponse
from .brand_retrieve_simplified_response import BrandRetrieveSimplifiedResponse as BrandRetrieveSimplifiedResponse
from .brand_identify_from_transaction_params import (
BrandIdentifyFromTransactionParams as BrandIdentifyFromTransactionParams,
diff --git a/src/context/dev/types/brand_web_scrape_html_params.py b/src/context/dev/types/web_web_scrape_html_params.py
similarity index 74%
rename from src/context/dev/types/brand_web_scrape_html_params.py
rename to src/context/dev/types/web_web_scrape_html_params.py
index 86246f4..1847d07 100644
--- a/src/context/dev/types/brand_web_scrape_html_params.py
+++ b/src/context/dev/types/web_web_scrape_html_params.py
@@ -4,9 +4,9 @@
from typing_extensions import Required, TypedDict
-__all__ = ["BrandWebScrapeHTMLParams"]
+__all__ = ["WebWebScrapeHTMLParams"]
-class BrandWebScrapeHTMLParams(TypedDict, total=False):
+class WebWebScrapeHTMLParams(TypedDict, total=False):
url: Required[str]
"""Full URL to scrape (must include http:// or https:// protocol)"""
diff --git a/src/context/dev/types/brand_web_scrape_html_response.py b/src/context/dev/types/web_web_scrape_html_response.py
similarity index 78%
rename from src/context/dev/types/brand_web_scrape_html_response.py
rename to src/context/dev/types/web_web_scrape_html_response.py
index a33cb79..f96ef12 100644
--- a/src/context/dev/types/brand_web_scrape_html_response.py
+++ b/src/context/dev/types/web_web_scrape_html_response.py
@@ -4,10 +4,10 @@
from .._models import BaseModel
-__all__ = ["BrandWebScrapeHTMLResponse"]
+__all__ = ["WebWebScrapeHTMLResponse"]
-class BrandWebScrapeHTMLResponse(BaseModel):
+class WebWebScrapeHTMLResponse(BaseModel):
html: str
"""Raw HTML content of the page"""
diff --git a/src/context/dev/types/brand_web_scrape_images_params.py b/src/context/dev/types/web_web_scrape_images_params.py
similarity index 74%
rename from src/context/dev/types/brand_web_scrape_images_params.py
rename to src/context/dev/types/web_web_scrape_images_params.py
index 665c5f0..9e89207 100644
--- a/src/context/dev/types/brand_web_scrape_images_params.py
+++ b/src/context/dev/types/web_web_scrape_images_params.py
@@ -4,9 +4,9 @@
from typing_extensions import Required, TypedDict
-__all__ = ["BrandWebScrapeImagesParams"]
+__all__ = ["WebWebScrapeImagesParams"]
-class BrandWebScrapeImagesParams(TypedDict, total=False):
+class WebWebScrapeImagesParams(TypedDict, total=False):
url: Required[str]
"""Full URL to scrape images from (must include http:// or https:// protocol)"""
diff --git a/src/context/dev/types/brand_web_scrape_images_response.py b/src/context/dev/types/web_web_scrape_images_response.py
similarity index 88%
rename from src/context/dev/types/brand_web_scrape_images_response.py
rename to src/context/dev/types/web_web_scrape_images_response.py
index e97d79a..26d8fce 100644
--- a/src/context/dev/types/brand_web_scrape_images_response.py
+++ b/src/context/dev/types/web_web_scrape_images_response.py
@@ -5,7 +5,7 @@
from .._models import BaseModel
-__all__ = ["BrandWebScrapeImagesResponse", "Image"]
+__all__ = ["WebWebScrapeImagesResponse", "Image"]
class Image(BaseModel):
@@ -22,7 +22,7 @@ class Image(BaseModel):
"""The type/format of the src value"""
-class BrandWebScrapeImagesResponse(BaseModel):
+class WebWebScrapeImagesResponse(BaseModel):
images: List[Image]
"""Array of scraped images"""
diff --git a/src/context/dev/types/brand_web_scrape_md_params.py b/src/context/dev/types/web_web_scrape_md_params.py
similarity index 89%
rename from src/context/dev/types/brand_web_scrape_md_params.py
rename to src/context/dev/types/web_web_scrape_md_params.py
index bf8c2e1..28765b0 100644
--- a/src/context/dev/types/brand_web_scrape_md_params.py
+++ b/src/context/dev/types/web_web_scrape_md_params.py
@@ -6,10 +6,10 @@
from .._utils import PropertyInfo
-__all__ = ["BrandWebScrapeMdParams"]
+__all__ = ["WebWebScrapeMdParams"]
-class BrandWebScrapeMdParams(TypedDict, total=False):
+class WebWebScrapeMdParams(TypedDict, total=False):
url: Required[str]
"""
Full URL to scrape and convert to markdown (must include http:// or https://
diff --git a/src/context/dev/types/brand_web_scrape_md_response.py b/src/context/dev/types/web_web_scrape_md_response.py
similarity index 80%
rename from src/context/dev/types/brand_web_scrape_md_response.py
rename to src/context/dev/types/web_web_scrape_md_response.py
index 5161243..f99b67c 100644
--- a/src/context/dev/types/brand_web_scrape_md_response.py
+++ b/src/context/dev/types/web_web_scrape_md_response.py
@@ -4,10 +4,10 @@
from .._models import BaseModel
-__all__ = ["BrandWebScrapeMdResponse"]
+__all__ = ["WebWebScrapeMdResponse"]
-class BrandWebScrapeMdResponse(BaseModel):
+class WebWebScrapeMdResponse(BaseModel):
markdown: str
"""Page content converted to GitHub Flavored Markdown"""
diff --git a/src/context/dev/types/brand_web_scrape_sitemap_params.py b/src/context/dev/types/web_web_scrape_sitemap_params.py
similarity index 76%
rename from src/context/dev/types/brand_web_scrape_sitemap_params.py
rename to src/context/dev/types/web_web_scrape_sitemap_params.py
index a250097..2ad3d83 100644
--- a/src/context/dev/types/brand_web_scrape_sitemap_params.py
+++ b/src/context/dev/types/web_web_scrape_sitemap_params.py
@@ -4,10 +4,10 @@
from typing_extensions import Required, TypedDict
-__all__ = ["BrandWebScrapeSitemapParams"]
+__all__ = ["WebWebScrapeSitemapParams"]
-class BrandWebScrapeSitemapParams(TypedDict, total=False):
+class WebWebScrapeSitemapParams(TypedDict, total=False):
domain: Required[str]
"""Domain name to crawl sitemaps for (e.g., 'example.com').
diff --git a/src/context/dev/types/brand_web_scrape_sitemap_response.py b/src/context/dev/types/web_web_scrape_sitemap_response.py
similarity index 91%
rename from src/context/dev/types/brand_web_scrape_sitemap_response.py
rename to src/context/dev/types/web_web_scrape_sitemap_response.py
index ae7562e..7bd55bf 100644
--- a/src/context/dev/types/brand_web_scrape_sitemap_response.py
+++ b/src/context/dev/types/web_web_scrape_sitemap_response.py
@@ -7,7 +7,7 @@
from .._models import BaseModel
-__all__ = ["BrandWebScrapeSitemapResponse", "Meta"]
+__all__ = ["WebWebScrapeSitemapResponse", "Meta"]
class Meta(BaseModel):
@@ -26,7 +26,7 @@ class Meta(BaseModel):
"""Number of sitemap files skipped (due to errors, timeouts, or limits)"""
-class BrandWebScrapeSitemapResponse(BaseModel):
+class WebWebScrapeSitemapResponse(BaseModel):
domain: str
"""The normalized domain that was crawled"""
diff --git a/tests/api_resources/test_brand.py b/tests/api_resources/test_brand.py
index 1a4bc80..34ee5d3 100644
--- a/tests/api_resources/test_brand.py
+++ b/tests/api_resources/test_brand.py
@@ -18,16 +18,12 @@
BrandAIProductsResponse,
BrandScreenshotResponse,
BrandStyleguideResponse,
- BrandWebScrapeMdResponse,
BrandRetrieveNaicsResponse,
- BrandWebScrapeHTMLResponse,
BrandRetrieveByIsinResponse,
BrandRetrieveByNameResponse,
BrandPrefetchByEmailResponse,
BrandRetrieveByEmailResponse,
- BrandWebScrapeImagesResponse,
BrandRetrieveByTickerResponse,
- BrandWebScrapeSitemapResponse,
BrandRetrieveSimplifiedResponse,
BrandIdentifyFromTransactionResponse,
)
@@ -838,153 +834,6 @@ def test_streaming_response_styleguide(self, client: ContextDev) -> None:
assert cast(Any, response.is_closed) is True
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_web_scrape_html(self, client: ContextDev) -> None:
- brand = client.brand.web_scrape_html(
- url="https://example.com",
- )
- assert_matches_type(BrandWebScrapeHTMLResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_web_scrape_html(self, client: ContextDev) -> None:
- response = client.brand.with_raw_response.web_scrape_html(
- url="https://example.com",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = response.parse()
- assert_matches_type(BrandWebScrapeHTMLResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_web_scrape_html(self, client: ContextDev) -> None:
- with client.brand.with_streaming_response.web_scrape_html(
- url="https://example.com",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = response.parse()
- assert_matches_type(BrandWebScrapeHTMLResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_web_scrape_images(self, client: ContextDev) -> None:
- brand = client.brand.web_scrape_images(
- url="https://example.com",
- )
- assert_matches_type(BrandWebScrapeImagesResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_web_scrape_images(self, client: ContextDev) -> None:
- response = client.brand.with_raw_response.web_scrape_images(
- url="https://example.com",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = response.parse()
- assert_matches_type(BrandWebScrapeImagesResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_web_scrape_images(self, client: ContextDev) -> None:
- with client.brand.with_streaming_response.web_scrape_images(
- url="https://example.com",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = response.parse()
- assert_matches_type(BrandWebScrapeImagesResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_web_scrape_md(self, client: ContextDev) -> None:
- brand = client.brand.web_scrape_md(
- url="https://example.com",
- )
- assert_matches_type(BrandWebScrapeMdResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_web_scrape_md_with_all_params(self, client: ContextDev) -> None:
- brand = client.brand.web_scrape_md(
- url="https://example.com",
- include_images=True,
- include_links=True,
- shorten_base64_images=True,
- )
- assert_matches_type(BrandWebScrapeMdResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_web_scrape_md(self, client: ContextDev) -> None:
- response = client.brand.with_raw_response.web_scrape_md(
- url="https://example.com",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = response.parse()
- assert_matches_type(BrandWebScrapeMdResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_web_scrape_md(self, client: ContextDev) -> None:
- with client.brand.with_streaming_response.web_scrape_md(
- url="https://example.com",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = response.parse()
- assert_matches_type(BrandWebScrapeMdResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_web_scrape_sitemap(self, client: ContextDev) -> None:
- brand = client.brand.web_scrape_sitemap(
- domain="domain",
- )
- assert_matches_type(BrandWebScrapeSitemapResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_web_scrape_sitemap(self, client: ContextDev) -> None:
- response = client.brand.with_raw_response.web_scrape_sitemap(
- domain="domain",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = response.parse()
- assert_matches_type(BrandWebScrapeSitemapResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_web_scrape_sitemap(self, client: ContextDev) -> None:
- with client.brand.with_streaming_response.web_scrape_sitemap(
- domain="domain",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = response.parse()
- assert_matches_type(BrandWebScrapeSitemapResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
class TestAsyncBrand:
parametrize = pytest.mark.parametrize(
@@ -1790,150 +1639,3 @@ async def test_streaming_response_styleguide(self, async_client: AsyncContextDev
assert_matches_type(BrandStyleguideResponse, brand, path=["response"])
assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_web_scrape_html(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.web_scrape_html(
- url="https://example.com",
- )
- assert_matches_type(BrandWebScrapeHTMLResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_web_scrape_html(self, async_client: AsyncContextDev) -> None:
- response = await async_client.brand.with_raw_response.web_scrape_html(
- url="https://example.com",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = await response.parse()
- assert_matches_type(BrandWebScrapeHTMLResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_web_scrape_html(self, async_client: AsyncContextDev) -> None:
- async with async_client.brand.with_streaming_response.web_scrape_html(
- url="https://example.com",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = await response.parse()
- assert_matches_type(BrandWebScrapeHTMLResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_web_scrape_images(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.web_scrape_images(
- url="https://example.com",
- )
- assert_matches_type(BrandWebScrapeImagesResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_web_scrape_images(self, async_client: AsyncContextDev) -> None:
- response = await async_client.brand.with_raw_response.web_scrape_images(
- url="https://example.com",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = await response.parse()
- assert_matches_type(BrandWebScrapeImagesResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_web_scrape_images(self, async_client: AsyncContextDev) -> None:
- async with async_client.brand.with_streaming_response.web_scrape_images(
- url="https://example.com",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = await response.parse()
- assert_matches_type(BrandWebScrapeImagesResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_web_scrape_md(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.web_scrape_md(
- url="https://example.com",
- )
- assert_matches_type(BrandWebScrapeMdResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_web_scrape_md_with_all_params(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.web_scrape_md(
- url="https://example.com",
- include_images=True,
- include_links=True,
- shorten_base64_images=True,
- )
- assert_matches_type(BrandWebScrapeMdResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_web_scrape_md(self, async_client: AsyncContextDev) -> None:
- response = await async_client.brand.with_raw_response.web_scrape_md(
- url="https://example.com",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = await response.parse()
- assert_matches_type(BrandWebScrapeMdResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_web_scrape_md(self, async_client: AsyncContextDev) -> None:
- async with async_client.brand.with_streaming_response.web_scrape_md(
- url="https://example.com",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = await response.parse()
- assert_matches_type(BrandWebScrapeMdResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_web_scrape_sitemap(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.web_scrape_sitemap(
- domain="domain",
- )
- assert_matches_type(BrandWebScrapeSitemapResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_web_scrape_sitemap(self, async_client: AsyncContextDev) -> None:
- response = await async_client.brand.with_raw_response.web_scrape_sitemap(
- domain="domain",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = await response.parse()
- assert_matches_type(BrandWebScrapeSitemapResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_web_scrape_sitemap(self, async_client: AsyncContextDev) -> None:
- async with async_client.brand.with_streaming_response.web_scrape_sitemap(
- domain="domain",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = await response.parse()
- assert_matches_type(BrandWebScrapeSitemapResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
diff --git a/tests/api_resources/test_web.py b/tests/api_resources/test_web.py
new file mode 100644
index 0000000..1f9e029
--- /dev/null
+++ b/tests/api_resources/test_web.py
@@ -0,0 +1,323 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+import os
+from typing import Any, cast
+
+import pytest
+
+from context.dev import ContextDev, AsyncContextDev
+from tests.utils import assert_matches_type
+from context.dev.types import (
+ WebWebScrapeMdResponse,
+ WebWebScrapeHTMLResponse,
+ WebWebScrapeImagesResponse,
+ WebWebScrapeSitemapResponse,
+)
+
+base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
+
+
+class TestWeb:
+ parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_web_scrape_html(self, client: ContextDev) -> None:
+ web = client.web.web_scrape_html(
+ url="https://example.com",
+ )
+ assert_matches_type(WebWebScrapeHTMLResponse, web, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_web_scrape_html(self, client: ContextDev) -> None:
+ response = client.web.with_raw_response.web_scrape_html(
+ url="https://example.com",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ web = response.parse()
+ assert_matches_type(WebWebScrapeHTMLResponse, web, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_web_scrape_html(self, client: ContextDev) -> None:
+ with client.web.with_streaming_response.web_scrape_html(
+ url="https://example.com",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ web = response.parse()
+ assert_matches_type(WebWebScrapeHTMLResponse, web, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_web_scrape_images(self, client: ContextDev) -> None:
+ web = client.web.web_scrape_images(
+ url="https://example.com",
+ )
+ assert_matches_type(WebWebScrapeImagesResponse, web, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_web_scrape_images(self, client: ContextDev) -> None:
+ response = client.web.with_raw_response.web_scrape_images(
+ url="https://example.com",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ web = response.parse()
+ assert_matches_type(WebWebScrapeImagesResponse, web, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_web_scrape_images(self, client: ContextDev) -> None:
+ with client.web.with_streaming_response.web_scrape_images(
+ url="https://example.com",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ web = response.parse()
+ assert_matches_type(WebWebScrapeImagesResponse, web, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_web_scrape_md(self, client: ContextDev) -> None:
+ web = client.web.web_scrape_md(
+ url="https://example.com",
+ )
+ assert_matches_type(WebWebScrapeMdResponse, web, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_web_scrape_md_with_all_params(self, client: ContextDev) -> None:
+ web = client.web.web_scrape_md(
+ url="https://example.com",
+ include_images=True,
+ include_links=True,
+ shorten_base64_images=True,
+ )
+ assert_matches_type(WebWebScrapeMdResponse, web, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_web_scrape_md(self, client: ContextDev) -> None:
+ response = client.web.with_raw_response.web_scrape_md(
+ url="https://example.com",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ web = response.parse()
+ assert_matches_type(WebWebScrapeMdResponse, web, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_web_scrape_md(self, client: ContextDev) -> None:
+ with client.web.with_streaming_response.web_scrape_md(
+ url="https://example.com",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ web = response.parse()
+ assert_matches_type(WebWebScrapeMdResponse, web, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_web_scrape_sitemap(self, client: ContextDev) -> None:
+ web = client.web.web_scrape_sitemap(
+ domain="domain",
+ )
+ assert_matches_type(WebWebScrapeSitemapResponse, web, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_web_scrape_sitemap(self, client: ContextDev) -> None:
+ response = client.web.with_raw_response.web_scrape_sitemap(
+ domain="domain",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ web = response.parse()
+ assert_matches_type(WebWebScrapeSitemapResponse, web, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_web_scrape_sitemap(self, client: ContextDev) -> None:
+ with client.web.with_streaming_response.web_scrape_sitemap(
+ domain="domain",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ web = response.parse()
+ assert_matches_type(WebWebScrapeSitemapResponse, web, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+
+class TestAsyncWeb:
+ parametrize = pytest.mark.parametrize(
+ "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_web_scrape_html(self, async_client: AsyncContextDev) -> None:
+ web = await async_client.web.web_scrape_html(
+ url="https://example.com",
+ )
+ assert_matches_type(WebWebScrapeHTMLResponse, web, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_web_scrape_html(self, async_client: AsyncContextDev) -> None:
+ response = await async_client.web.with_raw_response.web_scrape_html(
+ url="https://example.com",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ web = await response.parse()
+ assert_matches_type(WebWebScrapeHTMLResponse, web, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_web_scrape_html(self, async_client: AsyncContextDev) -> None:
+ async with async_client.web.with_streaming_response.web_scrape_html(
+ url="https://example.com",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ web = await response.parse()
+ assert_matches_type(WebWebScrapeHTMLResponse, web, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_web_scrape_images(self, async_client: AsyncContextDev) -> None:
+ web = await async_client.web.web_scrape_images(
+ url="https://example.com",
+ )
+ assert_matches_type(WebWebScrapeImagesResponse, web, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_web_scrape_images(self, async_client: AsyncContextDev) -> None:
+ response = await async_client.web.with_raw_response.web_scrape_images(
+ url="https://example.com",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ web = await response.parse()
+ assert_matches_type(WebWebScrapeImagesResponse, web, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_web_scrape_images(self, async_client: AsyncContextDev) -> None:
+ async with async_client.web.with_streaming_response.web_scrape_images(
+ url="https://example.com",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ web = await response.parse()
+ assert_matches_type(WebWebScrapeImagesResponse, web, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_web_scrape_md(self, async_client: AsyncContextDev) -> None:
+ web = await async_client.web.web_scrape_md(
+ url="https://example.com",
+ )
+ assert_matches_type(WebWebScrapeMdResponse, web, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_web_scrape_md_with_all_params(self, async_client: AsyncContextDev) -> None:
+ web = await async_client.web.web_scrape_md(
+ url="https://example.com",
+ include_images=True,
+ include_links=True,
+ shorten_base64_images=True,
+ )
+ assert_matches_type(WebWebScrapeMdResponse, web, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_web_scrape_md(self, async_client: AsyncContextDev) -> None:
+ response = await async_client.web.with_raw_response.web_scrape_md(
+ url="https://example.com",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ web = await response.parse()
+ assert_matches_type(WebWebScrapeMdResponse, web, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_web_scrape_md(self, async_client: AsyncContextDev) -> None:
+ async with async_client.web.with_streaming_response.web_scrape_md(
+ url="https://example.com",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ web = await response.parse()
+ assert_matches_type(WebWebScrapeMdResponse, web, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_web_scrape_sitemap(self, async_client: AsyncContextDev) -> None:
+ web = await async_client.web.web_scrape_sitemap(
+ domain="domain",
+ )
+ assert_matches_type(WebWebScrapeSitemapResponse, web, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_web_scrape_sitemap(self, async_client: AsyncContextDev) -> None:
+ response = await async_client.web.with_raw_response.web_scrape_sitemap(
+ domain="domain",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ web = await response.parse()
+ assert_matches_type(WebWebScrapeSitemapResponse, web, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_web_scrape_sitemap(self, async_client: AsyncContextDev) -> None:
+ async with async_client.web.with_streaming_response.web_scrape_sitemap(
+ domain="domain",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ web = await response.parse()
+ assert_matches_type(WebWebScrapeSitemapResponse, web, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
From 830408303450a4b85dfd444a2c4790cc8fecf292 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 18 Mar 2026 20:31:01 +0000
Subject: [PATCH 3/4] feat(api): manual updates
---
.stats.yml | 2 +-
README.md | 2 +-
api.md | 72 +-
src/context/dev/_client.py | 150 +-
src/context/dev/resources/__init__.py | 56 +
src/context/dev/resources/ai.py | 550 +++++++
src/context/dev/resources/brand.py | 1327 +----------------
src/context/dev/resources/industry.py | 217 +++
src/context/dev/resources/style.py | 342 +++++
src/context/dev/resources/utility.py | 312 ++++
src/context/dev/resources/web.py | 148 ++
src/context/dev/types/__init__.py | 36 +-
..._query_params.py => ai_ai_query_params.py} | 4 +-
...ry_response.py => ai_ai_query_response.py} | 4 +-
...params.py => ai_extract_product_params.py} | 4 +-
...onse.py => ai_extract_product_response.py} | 4 +-
...arams.py => ai_extract_products_params.py} | 4 +-
...nse.py => ai_extract_products_response.py} | 4 +-
...s.py => industry_retrieve_naics_params.py} | 4 +-
...py => industry_retrieve_naics_response.py} | 4 +-
...arams.py => style_extract_fonts_params.py} | 4 +-
...nse.py => style_extract_fonts_response.py} | 4 +-
....py => style_extract_styleguide_params.py} | 4 +-
...y => style_extract_styleguide_response.py} | 4 +-
...py => utility_prefetch_by_email_params.py} | 4 +-
... => utility_prefetch_by_email_response.py} | 4 +-
...h_params.py => utility_prefetch_params.py} | 4 +-
...sponse.py => utility_prefetch_response.py} | 4 +-
...hot_params.py => web_screenshot_params.py} | 4 +-
...response.py => web_screenshot_response.py} | 4 +-
tests/api_resources/test_ai.py | 472 ++++++
tests/api_resources/test_brand.py | 1165 ++-------------
tests/api_resources/test_industry.py | 114 ++
tests/api_resources/test_style.py | 191 +++
tests/api_resources/test_utility.py | 199 +++
tests/api_resources/test_web.py | 91 ++
36 files changed, 3099 insertions(+), 2419 deletions(-)
create mode 100644 src/context/dev/resources/ai.py
create mode 100644 src/context/dev/resources/industry.py
create mode 100644 src/context/dev/resources/style.py
create mode 100644 src/context/dev/resources/utility.py
rename src/context/dev/types/{brand_ai_query_params.py => ai_ai_query_params.py} (95%)
rename src/context/dev/types/{brand_ai_query_response.py => ai_ai_query_response.py} (90%)
rename src/context/dev/types/{brand_ai_product_params.py => ai_extract_product_params.py} (84%)
rename src/context/dev/types/{brand_ai_product_response.py => ai_extract_product_response.py} (94%)
rename src/context/dev/types/{brand_ai_products_params.py => ai_extract_products_params.py} (90%)
rename src/context/dev/types/{brand_ai_products_response.py => ai_extract_products_response.py} (93%)
rename src/context/dev/types/{brand_retrieve_naics_params.py => industry_retrieve_naics_params.py} (91%)
rename src/context/dev/types/{brand_retrieve_naics_response.py => industry_retrieve_naics_response.py} (88%)
rename src/context/dev/types/{brand_fonts_params.py => style_extract_fonts_params.py} (87%)
rename src/context/dev/types/{brand_fonts_response.py => style_extract_fonts_response.py} (90%)
rename src/context/dev/types/{brand_styleguide_params.py => style_extract_styleguide_params.py} (92%)
rename src/context/dev/types/{brand_styleguide_response.py => style_extract_styleguide_response.py} (99%)
rename src/context/dev/types/{brand_prefetch_by_email_params.py => utility_prefetch_by_email_params.py} (87%)
rename src/context/dev/types/{brand_prefetch_by_email_response.py => utility_prefetch_by_email_response.py} (80%)
rename src/context/dev/types/{brand_prefetch_params.py => utility_prefetch_params.py} (86%)
rename src/context/dev/types/{brand_prefetch_response.py => utility_prefetch_response.py} (82%)
rename src/context/dev/types/{brand_screenshot_params.py => web_screenshot_params.py} (94%)
rename src/context/dev/types/{brand_screenshot_response.py => web_screenshot_response.py} (89%)
create mode 100644 tests/api_resources/test_ai.py
create mode 100644 tests/api_resources/test_industry.py
create mode 100644 tests/api_resources/test_style.py
create mode 100644 tests/api_resources/test_utility.py
diff --git a/.stats.yml b/.stats.yml
index ffc3312..c4d3922 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 20
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/context-dev%2Fcontext.dev-c2e94e0c758b1aaba120c2a4231842fff0a120acc471fe24c7a81221e13a0482.yml
openapi_spec_hash: aabc231b46b1ca3375882f96c378c665
-config_hash: c6eb5818596f9926ef1225a0c7a855db
+config_hash: ab5135cc119f83ae2821f9445ed99d16
diff --git a/README.md b/README.md
index b218d59..83a846f 100644
--- a/README.md
+++ b/README.md
@@ -130,7 +130,7 @@ from context.dev import ContextDev
client = ContextDev()
-response = client.brand.ai_query(
+response = client.ai.ai_query(
data_to_extract=[
{
"datapoint_description": "datapoint_description",
diff --git a/api.md b/api.md
index 759c526..34b0ee0 100644
--- a/api.md
+++ b/api.md
@@ -4,6 +4,7 @@ Types:
```python
from context.dev.types import (
+ WebScreenshotResponse,
WebWebScrapeHTMLResponse,
WebWebScrapeImagesResponse,
WebWebScrapeMdResponse,
@@ -13,11 +14,39 @@ from context.dev.types import (
Methods:
+- client.web.screenshot(\*\*params) -> WebScreenshotResponse
- client.web.web_scrape_html(\*\*params) -> WebWebScrapeHTMLResponse
- client.web.web_scrape_images(\*\*params) -> WebWebScrapeImagesResponse
- client.web.web_scrape_md(\*\*params) -> WebWebScrapeMdResponse
- client.web.web_scrape_sitemap(\*\*params) -> WebWebScrapeSitemapResponse
+# AI
+
+Types:
+
+```python
+from context.dev.types import AIAIQueryResponse, AIExtractProductResponse, AIExtractProductsResponse
+```
+
+Methods:
+
+- client.ai.ai_query(\*\*params) -> AIAIQueryResponse
+- client.ai.extract_product(\*\*params) -> AIExtractProductResponse
+- client.ai.extract_products(\*\*params) -> AIExtractProductsResponse
+
+# Style
+
+Types:
+
+```python
+from context.dev.types import StyleExtractFontsResponse, StyleExtractStyleguideResponse
+```
+
+Methods:
+
+- client.style.extract_fonts(\*\*params) -> StyleExtractFontsResponse
+- client.style.extract_styleguide(\*\*params) -> StyleExtractStyleguideResponse
+
# Brand
Types:
@@ -25,39 +54,46 @@ Types:
```python
from context.dev.types import (
BrandRetrieveResponse,
- BrandAIProductResponse,
- BrandAIProductsResponse,
- BrandAIQueryResponse,
- BrandFontsResponse,
BrandIdentifyFromTransactionResponse,
- BrandPrefetchResponse,
- BrandPrefetchByEmailResponse,
BrandRetrieveByEmailResponse,
BrandRetrieveByIsinResponse,
BrandRetrieveByNameResponse,
BrandRetrieveByTickerResponse,
- BrandRetrieveNaicsResponse,
BrandRetrieveSimplifiedResponse,
- BrandScreenshotResponse,
- BrandStyleguideResponse,
)
```
Methods:
- client.brand.retrieve(\*\*params) -> BrandRetrieveResponse
-- client.brand.ai_product(\*\*params) -> BrandAIProductResponse
-- client.brand.ai_products(\*\*params) -> BrandAIProductsResponse
-- client.brand.ai_query(\*\*params) -> BrandAIQueryResponse
-- client.brand.fonts(\*\*params) -> BrandFontsResponse
- client.brand.identify_from_transaction(\*\*params) -> BrandIdentifyFromTransactionResponse
-- client.brand.prefetch(\*\*params) -> BrandPrefetchResponse
-- client.brand.prefetch_by_email(\*\*params) -> BrandPrefetchByEmailResponse
- client.brand.retrieve_by_email(\*\*params) -> BrandRetrieveByEmailResponse
- client.brand.retrieve_by_isin(\*\*params) -> BrandRetrieveByIsinResponse
- client.brand.retrieve_by_name(\*\*params) -> BrandRetrieveByNameResponse
- client.brand.retrieve_by_ticker(\*\*params) -> BrandRetrieveByTickerResponse
-- client.brand.retrieve_naics(\*\*params) -> BrandRetrieveNaicsResponse
- client.brand.retrieve_simplified(\*\*params) -> BrandRetrieveSimplifiedResponse
-- client.brand.screenshot(\*\*params) -> BrandScreenshotResponse
-- client.brand.styleguide(\*\*params) -> BrandStyleguideResponse
+
+# Industry
+
+Types:
+
+```python
+from context.dev.types import IndustryRetrieveNaicsResponse
+```
+
+Methods:
+
+- client.industry.retrieve_naics(\*\*params) -> IndustryRetrieveNaicsResponse
+
+# Utility
+
+Types:
+
+```python
+from context.dev.types import UtilityPrefetchResponse, UtilityPrefetchByEmailResponse
+```
+
+Methods:
+
+- client.utility.prefetch(\*\*params) -> UtilityPrefetchResponse
+- client.utility.prefetch_by_email(\*\*params) -> UtilityPrefetchByEmailResponse
diff --git a/src/context/dev/_client.py b/src/context/dev/_client.py
index e33d295..06cee7f 100644
--- a/src/context/dev/_client.py
+++ b/src/context/dev/_client.py
@@ -31,9 +31,13 @@
)
if TYPE_CHECKING:
- from .resources import web, brand
+ from .resources import ai, web, brand, style, utility, industry
+ from .resources.ai import AIResource, AsyncAIResource
from .resources.web import WebResource, AsyncWebResource
from .resources.brand import BrandResource, AsyncBrandResource
+ from .resources.style import StyleResource, AsyncStyleResource
+ from .resources.utility import UtilityResource, AsyncUtilityResource
+ from .resources.industry import IndustryResource, AsyncIndustryResource
__all__ = [
"Timeout",
@@ -108,12 +112,36 @@ def web(self) -> WebResource:
return WebResource(self)
+ @cached_property
+ def ai(self) -> AIResource:
+ from .resources.ai import AIResource
+
+ return AIResource(self)
+
+ @cached_property
+ def style(self) -> StyleResource:
+ from .resources.style import StyleResource
+
+ return StyleResource(self)
+
@cached_property
def brand(self) -> BrandResource:
from .resources.brand import BrandResource
return BrandResource(self)
+ @cached_property
+ def industry(self) -> IndustryResource:
+ from .resources.industry import IndustryResource
+
+ return IndustryResource(self)
+
+ @cached_property
+ def utility(self) -> UtilityResource:
+ from .resources.utility import UtilityResource
+
+ return UtilityResource(self)
+
@cached_property
def with_raw_response(self) -> ContextDevWithRawResponse:
return ContextDevWithRawResponse(self)
@@ -288,12 +316,36 @@ def web(self) -> AsyncWebResource:
return AsyncWebResource(self)
+ @cached_property
+ def ai(self) -> AsyncAIResource:
+ from .resources.ai import AsyncAIResource
+
+ return AsyncAIResource(self)
+
+ @cached_property
+ def style(self) -> AsyncStyleResource:
+ from .resources.style import AsyncStyleResource
+
+ return AsyncStyleResource(self)
+
@cached_property
def brand(self) -> AsyncBrandResource:
from .resources.brand import AsyncBrandResource
return AsyncBrandResource(self)
+ @cached_property
+ def industry(self) -> AsyncIndustryResource:
+ from .resources.industry import AsyncIndustryResource
+
+ return AsyncIndustryResource(self)
+
+ @cached_property
+ def utility(self) -> AsyncUtilityResource:
+ from .resources.utility import AsyncUtilityResource
+
+ return AsyncUtilityResource(self)
+
@cached_property
def with_raw_response(self) -> AsyncContextDevWithRawResponse:
return AsyncContextDevWithRawResponse(self)
@@ -419,12 +471,36 @@ def web(self) -> web.WebResourceWithRawResponse:
return WebResourceWithRawResponse(self._client.web)
+ @cached_property
+ def ai(self) -> ai.AIResourceWithRawResponse:
+ from .resources.ai import AIResourceWithRawResponse
+
+ return AIResourceWithRawResponse(self._client.ai)
+
+ @cached_property
+ def style(self) -> style.StyleResourceWithRawResponse:
+ from .resources.style import StyleResourceWithRawResponse
+
+ return StyleResourceWithRawResponse(self._client.style)
+
@cached_property
def brand(self) -> brand.BrandResourceWithRawResponse:
from .resources.brand import BrandResourceWithRawResponse
return BrandResourceWithRawResponse(self._client.brand)
+ @cached_property
+ def industry(self) -> industry.IndustryResourceWithRawResponse:
+ from .resources.industry import IndustryResourceWithRawResponse
+
+ return IndustryResourceWithRawResponse(self._client.industry)
+
+ @cached_property
+ def utility(self) -> utility.UtilityResourceWithRawResponse:
+ from .resources.utility import UtilityResourceWithRawResponse
+
+ return UtilityResourceWithRawResponse(self._client.utility)
+
class AsyncContextDevWithRawResponse:
_client: AsyncContextDev
@@ -438,12 +514,36 @@ def web(self) -> web.AsyncWebResourceWithRawResponse:
return AsyncWebResourceWithRawResponse(self._client.web)
+ @cached_property
+ def ai(self) -> ai.AsyncAIResourceWithRawResponse:
+ from .resources.ai import AsyncAIResourceWithRawResponse
+
+ return AsyncAIResourceWithRawResponse(self._client.ai)
+
+ @cached_property
+ def style(self) -> style.AsyncStyleResourceWithRawResponse:
+ from .resources.style import AsyncStyleResourceWithRawResponse
+
+ return AsyncStyleResourceWithRawResponse(self._client.style)
+
@cached_property
def brand(self) -> brand.AsyncBrandResourceWithRawResponse:
from .resources.brand import AsyncBrandResourceWithRawResponse
return AsyncBrandResourceWithRawResponse(self._client.brand)
+ @cached_property
+ def industry(self) -> industry.AsyncIndustryResourceWithRawResponse:
+ from .resources.industry import AsyncIndustryResourceWithRawResponse
+
+ return AsyncIndustryResourceWithRawResponse(self._client.industry)
+
+ @cached_property
+ def utility(self) -> utility.AsyncUtilityResourceWithRawResponse:
+ from .resources.utility import AsyncUtilityResourceWithRawResponse
+
+ return AsyncUtilityResourceWithRawResponse(self._client.utility)
+
class ContextDevWithStreamedResponse:
_client: ContextDev
@@ -457,12 +557,36 @@ def web(self) -> web.WebResourceWithStreamingResponse:
return WebResourceWithStreamingResponse(self._client.web)
+ @cached_property
+ def ai(self) -> ai.AIResourceWithStreamingResponse:
+ from .resources.ai import AIResourceWithStreamingResponse
+
+ return AIResourceWithStreamingResponse(self._client.ai)
+
+ @cached_property
+ def style(self) -> style.StyleResourceWithStreamingResponse:
+ from .resources.style import StyleResourceWithStreamingResponse
+
+ return StyleResourceWithStreamingResponse(self._client.style)
+
@cached_property
def brand(self) -> brand.BrandResourceWithStreamingResponse:
from .resources.brand import BrandResourceWithStreamingResponse
return BrandResourceWithStreamingResponse(self._client.brand)
+ @cached_property
+ def industry(self) -> industry.IndustryResourceWithStreamingResponse:
+ from .resources.industry import IndustryResourceWithStreamingResponse
+
+ return IndustryResourceWithStreamingResponse(self._client.industry)
+
+ @cached_property
+ def utility(self) -> utility.UtilityResourceWithStreamingResponse:
+ from .resources.utility import UtilityResourceWithStreamingResponse
+
+ return UtilityResourceWithStreamingResponse(self._client.utility)
+
class AsyncContextDevWithStreamedResponse:
_client: AsyncContextDev
@@ -476,12 +600,36 @@ def web(self) -> web.AsyncWebResourceWithStreamingResponse:
return AsyncWebResourceWithStreamingResponse(self._client.web)
+ @cached_property
+ def ai(self) -> ai.AsyncAIResourceWithStreamingResponse:
+ from .resources.ai import AsyncAIResourceWithStreamingResponse
+
+ return AsyncAIResourceWithStreamingResponse(self._client.ai)
+
+ @cached_property
+ def style(self) -> style.AsyncStyleResourceWithStreamingResponse:
+ from .resources.style import AsyncStyleResourceWithStreamingResponse
+
+ return AsyncStyleResourceWithStreamingResponse(self._client.style)
+
@cached_property
def brand(self) -> brand.AsyncBrandResourceWithStreamingResponse:
from .resources.brand import AsyncBrandResourceWithStreamingResponse
return AsyncBrandResourceWithStreamingResponse(self._client.brand)
+ @cached_property
+ def industry(self) -> industry.AsyncIndustryResourceWithStreamingResponse:
+ from .resources.industry import AsyncIndustryResourceWithStreamingResponse
+
+ return AsyncIndustryResourceWithStreamingResponse(self._client.industry)
+
+ @cached_property
+ def utility(self) -> utility.AsyncUtilityResourceWithStreamingResponse:
+ from .resources.utility import AsyncUtilityResourceWithStreamingResponse
+
+ return AsyncUtilityResourceWithStreamingResponse(self._client.utility)
+
Client = ContextDev
diff --git a/src/context/dev/resources/__init__.py b/src/context/dev/resources/__init__.py
index cb459fa..2bcb6db 100644
--- a/src/context/dev/resources/__init__.py
+++ b/src/context/dev/resources/__init__.py
@@ -1,5 +1,13 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+from .ai import (
+ AIResource,
+ AsyncAIResource,
+ AIResourceWithRawResponse,
+ AsyncAIResourceWithRawResponse,
+ AIResourceWithStreamingResponse,
+ AsyncAIResourceWithStreamingResponse,
+)
from .web import (
WebResource,
AsyncWebResource,
@@ -16,6 +24,30 @@
BrandResourceWithStreamingResponse,
AsyncBrandResourceWithStreamingResponse,
)
+from .style import (
+ StyleResource,
+ AsyncStyleResource,
+ StyleResourceWithRawResponse,
+ AsyncStyleResourceWithRawResponse,
+ StyleResourceWithStreamingResponse,
+ AsyncStyleResourceWithStreamingResponse,
+)
+from .utility import (
+ UtilityResource,
+ AsyncUtilityResource,
+ UtilityResourceWithRawResponse,
+ AsyncUtilityResourceWithRawResponse,
+ UtilityResourceWithStreamingResponse,
+ AsyncUtilityResourceWithStreamingResponse,
+)
+from .industry import (
+ IndustryResource,
+ AsyncIndustryResource,
+ IndustryResourceWithRawResponse,
+ AsyncIndustryResourceWithRawResponse,
+ IndustryResourceWithStreamingResponse,
+ AsyncIndustryResourceWithStreamingResponse,
+)
__all__ = [
"WebResource",
@@ -24,10 +56,34 @@
"AsyncWebResourceWithRawResponse",
"WebResourceWithStreamingResponse",
"AsyncWebResourceWithStreamingResponse",
+ "AIResource",
+ "AsyncAIResource",
+ "AIResourceWithRawResponse",
+ "AsyncAIResourceWithRawResponse",
+ "AIResourceWithStreamingResponse",
+ "AsyncAIResourceWithStreamingResponse",
+ "StyleResource",
+ "AsyncStyleResource",
+ "StyleResourceWithRawResponse",
+ "AsyncStyleResourceWithRawResponse",
+ "StyleResourceWithStreamingResponse",
+ "AsyncStyleResourceWithStreamingResponse",
"BrandResource",
"AsyncBrandResource",
"BrandResourceWithRawResponse",
"AsyncBrandResourceWithRawResponse",
"BrandResourceWithStreamingResponse",
"AsyncBrandResourceWithStreamingResponse",
+ "IndustryResource",
+ "AsyncIndustryResource",
+ "IndustryResourceWithRawResponse",
+ "AsyncIndustryResourceWithRawResponse",
+ "IndustryResourceWithStreamingResponse",
+ "AsyncIndustryResourceWithStreamingResponse",
+ "UtilityResource",
+ "AsyncUtilityResource",
+ "UtilityResourceWithRawResponse",
+ "AsyncUtilityResourceWithRawResponse",
+ "UtilityResourceWithStreamingResponse",
+ "AsyncUtilityResourceWithStreamingResponse",
]
diff --git a/src/context/dev/resources/ai.py b/src/context/dev/resources/ai.py
new file mode 100644
index 0000000..68bbfe0
--- /dev/null
+++ b/src/context/dev/resources/ai.py
@@ -0,0 +1,550 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Iterable
+from typing_extensions import overload
+
+import httpx
+
+from ..types import ai_ai_query_params, ai_extract_product_params, ai_extract_products_params
+from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
+from .._utils import required_args, maybe_transform, async_maybe_transform
+from .._compat import cached_property
+from .._resource import SyncAPIResource, AsyncAPIResource
+from .._response import (
+ to_raw_response_wrapper,
+ to_streamed_response_wrapper,
+ async_to_raw_response_wrapper,
+ async_to_streamed_response_wrapper,
+)
+from .._base_client import make_request_options
+from ..types.ai_ai_query_response import AIAIQueryResponse
+from ..types.ai_extract_product_response import AIExtractProductResponse
+from ..types.ai_extract_products_response import AIExtractProductsResponse
+
+__all__ = ["AIResource", "AsyncAIResource"]
+
+
+class AIResource(SyncAPIResource):
+ @cached_property
+ def with_raw_response(self) -> AIResourceWithRawResponse:
+ """
+ This property can be used as a prefix for any HTTP method call to return
+ the raw response object instead of the parsed content.
+
+ For more information, see https://www.github.com/brand-dot-dev/context-python-sdk#accessing-raw-response-data-eg-headers
+ """
+ return AIResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> AIResourceWithStreamingResponse:
+ """
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
+
+ For more information, see https://www.github.com/brand-dot-dev/context-python-sdk#with_streaming_response
+ """
+ return AIResourceWithStreamingResponse(self)
+
+ def ai_query(
+ self,
+ *,
+ data_to_extract: Iterable[ai_ai_query_params.DataToExtract],
+ domain: str,
+ specific_pages: ai_ai_query_params.SpecificPages | Omit = omit,
+ timeout_ms: int | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> AIAIQueryResponse:
+ """Use AI to extract specific data points from a brand's website.
+
+ The AI will crawl
+ the website and extract the requested information based on the provided data
+ points.
+
+ Args:
+ data_to_extract: Array of data points to extract from the website
+
+ domain: The domain name to analyze
+
+ specific_pages: Optional object specifying which pages to analyze
+
+ timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
+ than this value, it will be aborted with a 408 status code. Maximum allowed
+ value is 300000ms (5 minutes).
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return self._post(
+ "/brand/ai/query",
+ body=maybe_transform(
+ {
+ "data_to_extract": data_to_extract,
+ "domain": domain,
+ "specific_pages": specific_pages,
+ "timeout_ms": timeout_ms,
+ },
+ ai_ai_query_params.AIAIQueryParams,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AIAIQueryResponse,
+ )
+
+ def extract_product(
+ self,
+ *,
+ url: str,
+ timeout_ms: int | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> AIExtractProductResponse:
+ """
+ Beta feature: Given a single URL, determines if it is a product detail page,
+ classifies the platform/product type, and extracts the product information.
+ Supports Amazon, TikTok Shop, Etsy, and generic ecommerce sites.
+
+ Args:
+ url: The product page URL to extract product data from.
+
+ timeout_ms: Optional timeout in milliseconds for the request. Maximum allowed value is
+ 300000ms (5 minutes).
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return self._post(
+ "/brand/ai/product",
+ body=maybe_transform(
+ {
+ "url": url,
+ "timeout_ms": timeout_ms,
+ },
+ ai_extract_product_params.AIExtractProductParams,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AIExtractProductResponse,
+ )
+
+ @overload
+ def extract_products(
+ self,
+ *,
+ domain: str,
+ max_products: int | Omit = omit,
+ timeout_ms: int | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> AIExtractProductsResponse:
+ """Beta feature: Extract product information from a brand's website.
+
+ Brand.dev will
+ analyze the website and return a list of products with details such as name,
+ description, image, pricing, features, and more.
+
+ Args:
+ domain: The domain name to analyze.
+
+ max_products: Maximum number of products to extract.
+
+ timeout_ms: Optional timeout in milliseconds for the request. Maximum allowed value is
+ 300000ms (5 minutes).
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ ...
+
+ @overload
+ def extract_products(
+ self,
+ *,
+ direct_url: str,
+ max_products: int | Omit = omit,
+ timeout_ms: int | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> AIExtractProductsResponse:
+ """Beta feature: Extract product information from a brand's website.
+
+ Brand.dev will
+ analyze the website and return a list of products with details such as name,
+ description, image, pricing, features, and more.
+
+ Args:
+ direct_url: A specific URL to use directly as the starting point for extraction without
+ domain resolution.
+
+ max_products: Maximum number of products to extract.
+
+ timeout_ms: Optional timeout in milliseconds for the request. Maximum allowed value is
+ 300000ms (5 minutes).
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ ...
+
+ @required_args(["domain"], ["direct_url"])
+ def extract_products(
+ self,
+ *,
+ domain: str | Omit = omit,
+ max_products: int | Omit = omit,
+ timeout_ms: int | Omit = omit,
+ direct_url: str | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> AIExtractProductsResponse:
+ return self._post(
+ "/brand/ai/products",
+ body=maybe_transform(
+ {
+ "domain": domain,
+ "max_products": max_products,
+ "timeout_ms": timeout_ms,
+ "direct_url": direct_url,
+ },
+ ai_extract_products_params.AIExtractProductsParams,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AIExtractProductsResponse,
+ )
+
+
+class AsyncAIResource(AsyncAPIResource):
+ @cached_property
+ def with_raw_response(self) -> AsyncAIResourceWithRawResponse:
+ """
+ This property can be used as a prefix for any HTTP method call to return
+ the raw response object instead of the parsed content.
+
+ For more information, see https://www.github.com/brand-dot-dev/context-python-sdk#accessing-raw-response-data-eg-headers
+ """
+ return AsyncAIResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> AsyncAIResourceWithStreamingResponse:
+ """
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
+
+ For more information, see https://www.github.com/brand-dot-dev/context-python-sdk#with_streaming_response
+ """
+ return AsyncAIResourceWithStreamingResponse(self)
+
+ async def ai_query(
+ self,
+ *,
+ data_to_extract: Iterable[ai_ai_query_params.DataToExtract],
+ domain: str,
+ specific_pages: ai_ai_query_params.SpecificPages | Omit = omit,
+ timeout_ms: int | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> AIAIQueryResponse:
+ """Use AI to extract specific data points from a brand's website.
+
+ The AI will crawl
+ the website and extract the requested information based on the provided data
+ points.
+
+ Args:
+ data_to_extract: Array of data points to extract from the website
+
+ domain: The domain name to analyze
+
+ specific_pages: Optional object specifying which pages to analyze
+
+ timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
+ than this value, it will be aborted with a 408 status code. Maximum allowed
+ value is 300000ms (5 minutes).
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return await self._post(
+ "/brand/ai/query",
+ body=await async_maybe_transform(
+ {
+ "data_to_extract": data_to_extract,
+ "domain": domain,
+ "specific_pages": specific_pages,
+ "timeout_ms": timeout_ms,
+ },
+ ai_ai_query_params.AIAIQueryParams,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AIAIQueryResponse,
+ )
+
+ async def extract_product(
+ self,
+ *,
+ url: str,
+ timeout_ms: int | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> AIExtractProductResponse:
+ """
+ Beta feature: Given a single URL, determines if it is a product detail page,
+ classifies the platform/product type, and extracts the product information.
+ Supports Amazon, TikTok Shop, Etsy, and generic ecommerce sites.
+
+ Args:
+ url: The product page URL to extract product data from.
+
+ timeout_ms: Optional timeout in milliseconds for the request. Maximum allowed value is
+ 300000ms (5 minutes).
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return await self._post(
+ "/brand/ai/product",
+ body=await async_maybe_transform(
+ {
+ "url": url,
+ "timeout_ms": timeout_ms,
+ },
+ ai_extract_product_params.AIExtractProductParams,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AIExtractProductResponse,
+ )
+
+ @overload
+ async def extract_products(
+ self,
+ *,
+ domain: str,
+ max_products: int | Omit = omit,
+ timeout_ms: int | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> AIExtractProductsResponse:
+ """Beta feature: Extract product information from a brand's website.
+
+ Brand.dev will
+ analyze the website and return a list of products with details such as name,
+ description, image, pricing, features, and more.
+
+ Args:
+ domain: The domain name to analyze.
+
+ max_products: Maximum number of products to extract.
+
+ timeout_ms: Optional timeout in milliseconds for the request. Maximum allowed value is
+ 300000ms (5 minutes).
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ ...
+
+ @overload
+ async def extract_products(
+ self,
+ *,
+ direct_url: str,
+ max_products: int | Omit = omit,
+ timeout_ms: int | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> AIExtractProductsResponse:
+ """Beta feature: Extract product information from a brand's website.
+
+ Brand.dev will
+ analyze the website and return a list of products with details such as name,
+ description, image, pricing, features, and more.
+
+ Args:
+ direct_url: A specific URL to use directly as the starting point for extraction without
+ domain resolution.
+
+ max_products: Maximum number of products to extract.
+
+ timeout_ms: Optional timeout in milliseconds for the request. Maximum allowed value is
+ 300000ms (5 minutes).
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ ...
+
+ @required_args(["domain"], ["direct_url"])
+ async def extract_products(
+ self,
+ *,
+ domain: str | Omit = omit,
+ max_products: int | Omit = omit,
+ timeout_ms: int | Omit = omit,
+ direct_url: str | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> AIExtractProductsResponse:
+ return await self._post(
+ "/brand/ai/products",
+ body=await async_maybe_transform(
+ {
+ "domain": domain,
+ "max_products": max_products,
+ "timeout_ms": timeout_ms,
+ "direct_url": direct_url,
+ },
+ ai_extract_products_params.AIExtractProductsParams,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=AIExtractProductsResponse,
+ )
+
+
+class AIResourceWithRawResponse:
+ def __init__(self, ai: AIResource) -> None:
+ self._ai = ai
+
+ self.ai_query = to_raw_response_wrapper(
+ ai.ai_query,
+ )
+ self.extract_product = to_raw_response_wrapper(
+ ai.extract_product,
+ )
+ self.extract_products = to_raw_response_wrapper(
+ ai.extract_products,
+ )
+
+
+class AsyncAIResourceWithRawResponse:
+ def __init__(self, ai: AsyncAIResource) -> None:
+ self._ai = ai
+
+ self.ai_query = async_to_raw_response_wrapper(
+ ai.ai_query,
+ )
+ self.extract_product = async_to_raw_response_wrapper(
+ ai.extract_product,
+ )
+ self.extract_products = async_to_raw_response_wrapper(
+ ai.extract_products,
+ )
+
+
+class AIResourceWithStreamingResponse:
+ def __init__(self, ai: AIResource) -> None:
+ self._ai = ai
+
+ self.ai_query = to_streamed_response_wrapper(
+ ai.ai_query,
+ )
+ self.extract_product = to_streamed_response_wrapper(
+ ai.extract_product,
+ )
+ self.extract_products = to_streamed_response_wrapper(
+ ai.extract_products,
+ )
+
+
+class AsyncAIResourceWithStreamingResponse:
+ def __init__(self, ai: AsyncAIResource) -> None:
+ self._ai = ai
+
+ self.ai_query = async_to_streamed_response_wrapper(
+ ai.ai_query,
+ )
+ self.extract_product = async_to_streamed_response_wrapper(
+ ai.extract_product,
+ )
+ self.extract_products = async_to_streamed_response_wrapper(
+ ai.extract_products,
+ )
diff --git a/src/context/dev/resources/brand.py b/src/context/dev/resources/brand.py
index fa19ecb..7d52db8 100644
--- a/src/context/dev/resources/brand.py
+++ b/src/context/dev/resources/brand.py
@@ -2,31 +2,21 @@
from __future__ import annotations
-from typing import Iterable
-from typing_extensions import Literal, overload
+from typing_extensions import Literal
import httpx
from ..types import (
- brand_fonts_params,
- brand_ai_query_params,
- brand_prefetch_params,
brand_retrieve_params,
- brand_ai_product_params,
- brand_screenshot_params,
- brand_styleguide_params,
- brand_ai_products_params,
- brand_retrieve_naics_params,
brand_retrieve_by_isin_params,
brand_retrieve_by_name_params,
- brand_prefetch_by_email_params,
brand_retrieve_by_email_params,
brand_retrieve_by_ticker_params,
brand_retrieve_simplified_params,
brand_identify_from_transaction_params,
)
from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
-from .._utils import required_args, maybe_transform, async_maybe_transform
+from .._utils import maybe_transform, async_maybe_transform
from .._compat import cached_property
from .._resource import SyncAPIResource, AsyncAPIResource
from .._response import (
@@ -36,18 +26,9 @@
async_to_streamed_response_wrapper,
)
from .._base_client import make_request_options
-from ..types.brand_fonts_response import BrandFontsResponse
-from ..types.brand_ai_query_response import BrandAIQueryResponse
-from ..types.brand_prefetch_response import BrandPrefetchResponse
from ..types.brand_retrieve_response import BrandRetrieveResponse
-from ..types.brand_ai_product_response import BrandAIProductResponse
-from ..types.brand_screenshot_response import BrandScreenshotResponse
-from ..types.brand_styleguide_response import BrandStyleguideResponse
-from ..types.brand_ai_products_response import BrandAIProductsResponse
-from ..types.brand_retrieve_naics_response import BrandRetrieveNaicsResponse
from ..types.brand_retrieve_by_isin_response import BrandRetrieveByIsinResponse
from ..types.brand_retrieve_by_name_response import BrandRetrieveByNameResponse
-from ..types.brand_prefetch_by_email_response import BrandPrefetchByEmailResponse
from ..types.brand_retrieve_by_email_response import BrandRetrieveByEmailResponse
from ..types.brand_retrieve_by_ticker_response import BrandRetrieveByTickerResponse
from ..types.brand_retrieve_simplified_response import BrandRetrieveSimplifiedResponse
@@ -194,267 +175,6 @@ def retrieve(
cast_to=BrandRetrieveResponse,
)
- def ai_product(
- self,
- *,
- url: str,
- timeout_ms: int | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandAIProductResponse:
- """
- Beta feature: Given a single URL, determines if it is a product detail page,
- classifies the platform/product type, and extracts the product information.
- Supports Amazon, TikTok Shop, Etsy, and generic ecommerce sites.
-
- Args:
- url: The product page URL to extract product data from.
-
- timeout_ms: Optional timeout in milliseconds for the request. Maximum allowed value is
- 300000ms (5 minutes).
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return self._post(
- "/brand/ai/product",
- body=maybe_transform(
- {
- "url": url,
- "timeout_ms": timeout_ms,
- },
- brand_ai_product_params.BrandAIProductParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=BrandAIProductResponse,
- )
-
- @overload
- def ai_products(
- self,
- *,
- domain: str,
- max_products: int | Omit = omit,
- timeout_ms: int | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandAIProductsResponse:
- """Beta feature: Extract product information from a brand's website.
-
- Brand.dev will
- analyze the website and return a list of products with details such as name,
- description, image, pricing, features, and more.
-
- Args:
- domain: The domain name to analyze.
-
- max_products: Maximum number of products to extract.
-
- timeout_ms: Optional timeout in milliseconds for the request. Maximum allowed value is
- 300000ms (5 minutes).
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- ...
-
- @overload
- def ai_products(
- self,
- *,
- direct_url: str,
- max_products: int | Omit = omit,
- timeout_ms: int | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandAIProductsResponse:
- """Beta feature: Extract product information from a brand's website.
-
- Brand.dev will
- analyze the website and return a list of products with details such as name,
- description, image, pricing, features, and more.
-
- Args:
- direct_url: A specific URL to use directly as the starting point for extraction without
- domain resolution.
-
- max_products: Maximum number of products to extract.
-
- timeout_ms: Optional timeout in milliseconds for the request. Maximum allowed value is
- 300000ms (5 minutes).
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- ...
-
- @required_args(["domain"], ["direct_url"])
- def ai_products(
- self,
- *,
- domain: str | Omit = omit,
- max_products: int | Omit = omit,
- timeout_ms: int | Omit = omit,
- direct_url: str | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandAIProductsResponse:
- return self._post(
- "/brand/ai/products",
- body=maybe_transform(
- {
- "domain": domain,
- "max_products": max_products,
- "timeout_ms": timeout_ms,
- "direct_url": direct_url,
- },
- brand_ai_products_params.BrandAIProductsParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=BrandAIProductsResponse,
- )
-
- def ai_query(
- self,
- *,
- data_to_extract: Iterable[brand_ai_query_params.DataToExtract],
- domain: str,
- specific_pages: brand_ai_query_params.SpecificPages | Omit = omit,
- timeout_ms: int | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandAIQueryResponse:
- """Use AI to extract specific data points from a brand's website.
-
- The AI will crawl
- the website and extract the requested information based on the provided data
- points.
-
- Args:
- data_to_extract: Array of data points to extract from the website
-
- domain: The domain name to analyze
-
- specific_pages: Optional object specifying which pages to analyze
-
- timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
- than this value, it will be aborted with a 408 status code. Maximum allowed
- value is 300000ms (5 minutes).
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return self._post(
- "/brand/ai/query",
- body=maybe_transform(
- {
- "data_to_extract": data_to_extract,
- "domain": domain,
- "specific_pages": specific_pages,
- "timeout_ms": timeout_ms,
- },
- brand_ai_query_params.BrandAIQueryParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=BrandAIQueryResponse,
- )
-
- def fonts(
- self,
- *,
- domain: str,
- timeout_ms: int | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandFontsResponse:
- """
- Extract font information from a brand's website including font families, usage
- statistics, fallbacks, and element/word counts.
-
- Args:
- domain: Domain name to extract fonts from (e.g., 'example.com', 'google.com'). The
- domain will be automatically normalized and validated.
-
- timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
- than this value, it will be aborted with a 408 status code. Maximum allowed
- value is 300000ms (5 minutes).
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return self._get(
- "/brand/fonts",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=maybe_transform(
- {
- "domain": domain,
- "timeout_ms": timeout_ms,
- },
- brand_fonts_params.BrandFontsParams,
- ),
- ),
- cast_to=BrandFontsResponse,
- )
-
def identify_from_transaction(
self,
*,
@@ -836,106 +556,6 @@ def identify_from_transaction(
cast_to=BrandIdentifyFromTransactionResponse,
)
- def prefetch(
- self,
- *,
- domain: str,
- timeout_ms: int | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandPrefetchResponse:
- """
- Signal that you may fetch brand data for a particular domain soon to improve
- latency. This endpoint does not charge credits and is available for paid
- customers to optimize future requests. [You must be on a paid plan to use this
- endpoint]
-
- Args:
- domain: Domain name to prefetch brand data for
-
- timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
- than this value, it will be aborted with a 408 status code. Maximum allowed
- value is 300000ms (5 minutes).
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return self._post(
- "/brand/prefetch",
- body=maybe_transform(
- {
- "domain": domain,
- "timeout_ms": timeout_ms,
- },
- brand_prefetch_params.BrandPrefetchParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=BrandPrefetchResponse,
- )
-
- def prefetch_by_email(
- self,
- *,
- email: str,
- timeout_ms: int | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandPrefetchByEmailResponse:
- """
- Signal that you may fetch brand data for a particular domain soon to improve
- latency. This endpoint accepts an email address, extracts the domain from it,
- validates that it's not a disposable or free email provider, and queues the
- domain for prefetching. This endpoint does not charge credits and is available
- for paid customers to optimize future requests. [You must be on a paid plan to
- use this endpoint]
-
- Args:
- email: Email address to prefetch brand data for. The domain will be extracted from the
- email. Free email providers (gmail.com, yahoo.com, etc.) and disposable email
- addresses are not allowed.
-
- timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
- than this value, it will be aborted with a 408 status code. Maximum allowed
- value is 300000ms (5 minutes).
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return self._post(
- "/brand/prefetch-by-email",
- body=maybe_transform(
- {
- "email": email,
- "timeout_ms": timeout_ms,
- },
- brand_prefetch_by_email_params.BrandPrefetchByEmailParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=BrandPrefetchByEmailResponse,
- )
-
def retrieve_by_email(
self,
*,
@@ -1735,12 +1355,10 @@ def retrieve_by_ticker(
cast_to=BrandRetrieveByTickerResponse,
)
- def retrieve_naics(
+ def retrieve_simplified(
self,
*,
- input: str,
- max_results: int | Omit = omit,
- min_results: int | Omit = omit,
+ domain: str,
timeout_ms: int | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
@@ -1748,19 +1366,14 @@ def retrieve_naics(
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandRetrieveNaicsResponse:
+ ) -> BrandRetrieveSimplifiedResponse:
"""
- Endpoint to classify any brand into a 2022 NAICS code.
+ Returns a simplified version of brand data containing only essential
+ information: domain, title, colors, logos, and backdrops. This endpoint is
+ optimized for faster responses and reduced data transfer.
Args:
- input: Brand domain or title to retrieve NAICS code for. If a valid domain is provided
- in `input`, it will be used for classification, otherwise, we will search for
- the brand using the provided title.
-
- max_results: Maximum number of NAICS codes to return. Must be between 1 and 10. Defaults
- to 5.
-
- min_results: Minimum number of NAICS codes to return. Must be at least 1. Defaults to 1.
+ domain: Domain name to retrieve simplified brand data for
timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
than this value, it will be aborted with a 408 status code. Maximum allowed
@@ -1775,7 +1388,7 @@ def retrieve_naics(
timeout: Override the client-level default timeout for this request, in seconds
"""
return self._get(
- "/brand/naics",
+ "/brand/retrieve-simplified",
options=make_request_options(
extra_headers=extra_headers,
extra_query=extra_query,
@@ -1783,195 +1396,13 @@ def retrieve_naics(
timeout=timeout,
query=maybe_transform(
{
- "input": input,
- "max_results": max_results,
- "min_results": min_results,
+ "domain": domain,
"timeout_ms": timeout_ms,
},
- brand_retrieve_naics_params.BrandRetrieveNaicsParams,
+ brand_retrieve_simplified_params.BrandRetrieveSimplifiedParams,
),
),
- cast_to=BrandRetrieveNaicsResponse,
- )
-
- def retrieve_simplified(
- self,
- *,
- domain: str,
- timeout_ms: int | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandRetrieveSimplifiedResponse:
- """
- Returns a simplified version of brand data containing only essential
- information: domain, title, colors, logos, and backdrops. This endpoint is
- optimized for faster responses and reduced data transfer.
-
- Args:
- domain: Domain name to retrieve simplified brand data for
-
- timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
- than this value, it will be aborted with a 408 status code. Maximum allowed
- value is 300000ms (5 minutes).
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return self._get(
- "/brand/retrieve-simplified",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=maybe_transform(
- {
- "domain": domain,
- "timeout_ms": timeout_ms,
- },
- brand_retrieve_simplified_params.BrandRetrieveSimplifiedParams,
- ),
- ),
- cast_to=BrandRetrieveSimplifiedResponse,
- )
-
- def screenshot(
- self,
- *,
- domain: str,
- full_screenshot: Literal["true", "false"] | Omit = omit,
- page: Literal["login", "signup", "blog", "careers", "pricing", "terms", "privacy", "contact"] | Omit = omit,
- prioritize: Literal["speed", "quality"] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandScreenshotResponse:
- """Capture a screenshot of a website.
-
- Supports both viewport (standard browser
- view) and full-page screenshots. Can also screenshot specific page types (login,
- pricing, etc.) by using heuristics to find the appropriate URL. Returns a URL to
- the uploaded screenshot image hosted on our CDN.
-
- Args:
- domain: Domain name to take screenshot of (e.g., 'example.com', 'google.com'). The
- domain will be automatically normalized and validated.
-
- full_screenshot: Optional parameter to determine screenshot type. If 'true', takes a full page
- screenshot capturing all content. If 'false' or not provided, takes a viewport
- screenshot (standard browser view).
-
- page: Optional parameter to specify which page type to screenshot. If provided, the
- system will scrape the domain's links and use heuristics to find the most
- appropriate URL for the specified page type (30 supported languages). If not
- provided, screenshots the main domain landing page.
-
- prioritize: Optional parameter to prioritize screenshot capture. If 'speed', optimizes for
- faster capture with basic quality. If 'quality', optimizes for higher quality
- with longer wait times. Defaults to 'quality' if not provided.
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return self._get(
- "/brand/screenshot",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=maybe_transform(
- {
- "domain": domain,
- "full_screenshot": full_screenshot,
- "page": page,
- "prioritize": prioritize,
- },
- brand_screenshot_params.BrandScreenshotParams,
- ),
- ),
- cast_to=BrandScreenshotResponse,
- )
-
- def styleguide(
- self,
- *,
- direct_url: str | Omit = omit,
- domain: str | Omit = omit,
- prioritize: Literal["speed", "quality"] | Omit = omit,
- timeout_ms: int | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandStyleguideResponse:
- """
- Automatically extract comprehensive design system information from a brand's
- website including colors, typography, spacing, shadows, and UI components.
- Either 'domain' or 'directUrl' must be provided as a query parameter, but not
- both.
-
- Args:
- direct_url: A specific URL to fetch the styleguide from directly, bypassing domain
- resolution (e.g., 'https://example.com/design-system').
-
- domain: Domain name to extract styleguide from (e.g., 'example.com', 'google.com'). The
- domain will be automatically normalized and validated.
-
- prioritize: Optional parameter to prioritize screenshot capture for styleguide extraction.
- If 'speed', optimizes for faster capture with basic quality. If 'quality',
- optimizes for higher quality with longer wait times. Defaults to 'quality' if
- not provided.
-
- timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
- than this value, it will be aborted with a 408 status code. Maximum allowed
- value is 300000ms (5 minutes).
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return self._get(
- "/brand/styleguide",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=maybe_transform(
- {
- "direct_url": direct_url,
- "domain": domain,
- "prioritize": prioritize,
- "timeout_ms": timeout_ms,
- },
- brand_styleguide_params.BrandStyleguideParams,
- ),
- ),
- cast_to=BrandStyleguideResponse,
+ cast_to=BrandRetrieveSimplifiedResponse,
)
@@ -2038,296 +1469,26 @@ async def retrieve(
"pidgin",
"polish",
"portuguese",
- "romanian",
- "russian",
- "serbian",
- "slovak",
- "slovene",
- "somali",
- "spanish",
- "swahili",
- "swedish",
- "tagalog",
- "thai",
- "turkish",
- "ukrainian",
- "urdu",
- "uzbek",
- "vietnamese",
- "welsh",
- ]
- | Omit = omit,
- max_speed: bool | Omit = omit,
- timeout_ms: int | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandRetrieveResponse:
- """
- Retrieve logos, backdrops, colors, industry, description, and more from any
- domain
-
- Args:
- domain: Domain name to retrieve brand data for (e.g., 'example.com', 'google.com').
- Cannot be used with name or ticker parameters.
-
- force_language: Optional parameter to force the language of the retrieved brand data. Works with
- all three lookup methods.
-
- max_speed: Optional parameter to optimize the API call for maximum speed. When set to true,
- the API will skip time-consuming operations for faster response at the cost of
- less comprehensive data. Works with all three lookup methods.
-
- timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
- than this value, it will be aborted with a 408 status code. Maximum allowed
- value is 300000ms (5 minutes).
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return await self._get(
- "/brand/retrieve",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=await async_maybe_transform(
- {
- "domain": domain,
- "force_language": force_language,
- "max_speed": max_speed,
- "timeout_ms": timeout_ms,
- },
- brand_retrieve_params.BrandRetrieveParams,
- ),
- ),
- cast_to=BrandRetrieveResponse,
- )
-
- async def ai_product(
- self,
- *,
- url: str,
- timeout_ms: int | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandAIProductResponse:
- """
- Beta feature: Given a single URL, determines if it is a product detail page,
- classifies the platform/product type, and extracts the product information.
- Supports Amazon, TikTok Shop, Etsy, and generic ecommerce sites.
-
- Args:
- url: The product page URL to extract product data from.
-
- timeout_ms: Optional timeout in milliseconds for the request. Maximum allowed value is
- 300000ms (5 minutes).
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return await self._post(
- "/brand/ai/product",
- body=await async_maybe_transform(
- {
- "url": url,
- "timeout_ms": timeout_ms,
- },
- brand_ai_product_params.BrandAIProductParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=BrandAIProductResponse,
- )
-
- @overload
- async def ai_products(
- self,
- *,
- domain: str,
- max_products: int | Omit = omit,
- timeout_ms: int | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandAIProductsResponse:
- """Beta feature: Extract product information from a brand's website.
-
- Brand.dev will
- analyze the website and return a list of products with details such as name,
- description, image, pricing, features, and more.
-
- Args:
- domain: The domain name to analyze.
-
- max_products: Maximum number of products to extract.
-
- timeout_ms: Optional timeout in milliseconds for the request. Maximum allowed value is
- 300000ms (5 minutes).
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- ...
-
- @overload
- async def ai_products(
- self,
- *,
- direct_url: str,
- max_products: int | Omit = omit,
- timeout_ms: int | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandAIProductsResponse:
- """Beta feature: Extract product information from a brand's website.
-
- Brand.dev will
- analyze the website and return a list of products with details such as name,
- description, image, pricing, features, and more.
-
- Args:
- direct_url: A specific URL to use directly as the starting point for extraction without
- domain resolution.
-
- max_products: Maximum number of products to extract.
-
- timeout_ms: Optional timeout in milliseconds for the request. Maximum allowed value is
- 300000ms (5 minutes).
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- ...
-
- @required_args(["domain"], ["direct_url"])
- async def ai_products(
- self,
- *,
- domain: str | Omit = omit,
- max_products: int | Omit = omit,
- timeout_ms: int | Omit = omit,
- direct_url: str | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandAIProductsResponse:
- return await self._post(
- "/brand/ai/products",
- body=await async_maybe_transform(
- {
- "domain": domain,
- "max_products": max_products,
- "timeout_ms": timeout_ms,
- "direct_url": direct_url,
- },
- brand_ai_products_params.BrandAIProductsParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=BrandAIProductsResponse,
- )
-
- async def ai_query(
- self,
- *,
- data_to_extract: Iterable[brand_ai_query_params.DataToExtract],
- domain: str,
- specific_pages: brand_ai_query_params.SpecificPages | Omit = omit,
- timeout_ms: int | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandAIQueryResponse:
- """Use AI to extract specific data points from a brand's website.
-
- The AI will crawl
- the website and extract the requested information based on the provided data
- points.
-
- Args:
- data_to_extract: Array of data points to extract from the website
-
- domain: The domain name to analyze
-
- specific_pages: Optional object specifying which pages to analyze
-
- timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
- than this value, it will be aborted with a 408 status code. Maximum allowed
- value is 300000ms (5 minutes).
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return await self._post(
- "/brand/ai/query",
- body=await async_maybe_transform(
- {
- "data_to_extract": data_to_extract,
- "domain": domain,
- "specific_pages": specific_pages,
- "timeout_ms": timeout_ms,
- },
- brand_ai_query_params.BrandAIQueryParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=BrandAIQueryResponse,
- )
-
- async def fonts(
- self,
- *,
- domain: str,
+ "romanian",
+ "russian",
+ "serbian",
+ "slovak",
+ "slovene",
+ "somali",
+ "spanish",
+ "swahili",
+ "swedish",
+ "tagalog",
+ "thai",
+ "turkish",
+ "ukrainian",
+ "urdu",
+ "uzbek",
+ "vietnamese",
+ "welsh",
+ ]
+ | Omit = omit,
+ max_speed: bool | Omit = omit,
timeout_ms: int | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
@@ -2335,14 +1496,21 @@ async def fonts(
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandFontsResponse:
+ ) -> BrandRetrieveResponse:
"""
- Extract font information from a brand's website including font families, usage
- statistics, fallbacks, and element/word counts.
+ Retrieve logos, backdrops, colors, industry, description, and more from any
+ domain
Args:
- domain: Domain name to extract fonts from (e.g., 'example.com', 'google.com'). The
- domain will be automatically normalized and validated.
+ domain: Domain name to retrieve brand data for (e.g., 'example.com', 'google.com').
+ Cannot be used with name or ticker parameters.
+
+ force_language: Optional parameter to force the language of the retrieved brand data. Works with
+ all three lookup methods.
+
+ max_speed: Optional parameter to optimize the API call for maximum speed. When set to true,
+ the API will skip time-consuming operations for faster response at the cost of
+ less comprehensive data. Works with all three lookup methods.
timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
than this value, it will be aborted with a 408 status code. Maximum allowed
@@ -2357,7 +1525,7 @@ async def fonts(
timeout: Override the client-level default timeout for this request, in seconds
"""
return await self._get(
- "/brand/fonts",
+ "/brand/retrieve",
options=make_request_options(
extra_headers=extra_headers,
extra_query=extra_query,
@@ -2366,12 +1534,14 @@ async def fonts(
query=await async_maybe_transform(
{
"domain": domain,
+ "force_language": force_language,
+ "max_speed": max_speed,
"timeout_ms": timeout_ms,
},
- brand_fonts_params.BrandFontsParams,
+ brand_retrieve_params.BrandRetrieveParams,
),
),
- cast_to=BrandFontsResponse,
+ cast_to=BrandRetrieveResponse,
)
async def identify_from_transaction(
@@ -2755,106 +1925,6 @@ async def identify_from_transaction(
cast_to=BrandIdentifyFromTransactionResponse,
)
- async def prefetch(
- self,
- *,
- domain: str,
- timeout_ms: int | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandPrefetchResponse:
- """
- Signal that you may fetch brand data for a particular domain soon to improve
- latency. This endpoint does not charge credits and is available for paid
- customers to optimize future requests. [You must be on a paid plan to use this
- endpoint]
-
- Args:
- domain: Domain name to prefetch brand data for
-
- timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
- than this value, it will be aborted with a 408 status code. Maximum allowed
- value is 300000ms (5 minutes).
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return await self._post(
- "/brand/prefetch",
- body=await async_maybe_transform(
- {
- "domain": domain,
- "timeout_ms": timeout_ms,
- },
- brand_prefetch_params.BrandPrefetchParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=BrandPrefetchResponse,
- )
-
- async def prefetch_by_email(
- self,
- *,
- email: str,
- timeout_ms: int | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandPrefetchByEmailResponse:
- """
- Signal that you may fetch brand data for a particular domain soon to improve
- latency. This endpoint accepts an email address, extracts the domain from it,
- validates that it's not a disposable or free email provider, and queues the
- domain for prefetching. This endpoint does not charge credits and is available
- for paid customers to optimize future requests. [You must be on a paid plan to
- use this endpoint]
-
- Args:
- email: Email address to prefetch brand data for. The domain will be extracted from the
- email. Free email providers (gmail.com, yahoo.com, etc.) and disposable email
- addresses are not allowed.
-
- timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
- than this value, it will be aborted with a 408 status code. Maximum allowed
- value is 300000ms (5 minutes).
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return await self._post(
- "/brand/prefetch-by-email",
- body=await async_maybe_transform(
- {
- "email": email,
- "timeout_ms": timeout_ms,
- },
- brand_prefetch_by_email_params.BrandPrefetchByEmailParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=BrandPrefetchByEmailResponse,
- )
-
async def retrieve_by_email(
self,
*,
@@ -3654,65 +2724,6 @@ async def retrieve_by_ticker(
cast_to=BrandRetrieveByTickerResponse,
)
- async def retrieve_naics(
- self,
- *,
- input: str,
- max_results: int | Omit = omit,
- min_results: int | Omit = omit,
- timeout_ms: int | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandRetrieveNaicsResponse:
- """
- Endpoint to classify any brand into a 2022 NAICS code.
-
- Args:
- input: Brand domain or title to retrieve NAICS code for. If a valid domain is provided
- in `input`, it will be used for classification, otherwise, we will search for
- the brand using the provided title.
-
- max_results: Maximum number of NAICS codes to return. Must be between 1 and 10. Defaults
- to 5.
-
- min_results: Minimum number of NAICS codes to return. Must be at least 1. Defaults to 1.
-
- timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
- than this value, it will be aborted with a 408 status code. Maximum allowed
- value is 300000ms (5 minutes).
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return await self._get(
- "/brand/naics",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=await async_maybe_transform(
- {
- "input": input,
- "max_results": max_results,
- "min_results": min_results,
- "timeout_ms": timeout_ms,
- },
- brand_retrieve_naics_params.BrandRetrieveNaicsParams,
- ),
- ),
- cast_to=BrandRetrieveNaicsResponse,
- )
-
async def retrieve_simplified(
self,
*,
@@ -3763,136 +2774,6 @@ async def retrieve_simplified(
cast_to=BrandRetrieveSimplifiedResponse,
)
- async def screenshot(
- self,
- *,
- domain: str,
- full_screenshot: Literal["true", "false"] | Omit = omit,
- page: Literal["login", "signup", "blog", "careers", "pricing", "terms", "privacy", "contact"] | Omit = omit,
- prioritize: Literal["speed", "quality"] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandScreenshotResponse:
- """Capture a screenshot of a website.
-
- Supports both viewport (standard browser
- view) and full-page screenshots. Can also screenshot specific page types (login,
- pricing, etc.) by using heuristics to find the appropriate URL. Returns a URL to
- the uploaded screenshot image hosted on our CDN.
-
- Args:
- domain: Domain name to take screenshot of (e.g., 'example.com', 'google.com'). The
- domain will be automatically normalized and validated.
-
- full_screenshot: Optional parameter to determine screenshot type. If 'true', takes a full page
- screenshot capturing all content. If 'false' or not provided, takes a viewport
- screenshot (standard browser view).
-
- page: Optional parameter to specify which page type to screenshot. If provided, the
- system will scrape the domain's links and use heuristics to find the most
- appropriate URL for the specified page type (30 supported languages). If not
- provided, screenshots the main domain landing page.
-
- prioritize: Optional parameter to prioritize screenshot capture. If 'speed', optimizes for
- faster capture with basic quality. If 'quality', optimizes for higher quality
- with longer wait times. Defaults to 'quality' if not provided.
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return await self._get(
- "/brand/screenshot",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=await async_maybe_transform(
- {
- "domain": domain,
- "full_screenshot": full_screenshot,
- "page": page,
- "prioritize": prioritize,
- },
- brand_screenshot_params.BrandScreenshotParams,
- ),
- ),
- cast_to=BrandScreenshotResponse,
- )
-
- async def styleguide(
- self,
- *,
- direct_url: str | Omit = omit,
- domain: str | Omit = omit,
- prioritize: Literal["speed", "quality"] | Omit = omit,
- timeout_ms: int | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrandStyleguideResponse:
- """
- Automatically extract comprehensive design system information from a brand's
- website including colors, typography, spacing, shadows, and UI components.
- Either 'domain' or 'directUrl' must be provided as a query parameter, but not
- both.
-
- Args:
- direct_url: A specific URL to fetch the styleguide from directly, bypassing domain
- resolution (e.g., 'https://example.com/design-system').
-
- domain: Domain name to extract styleguide from (e.g., 'example.com', 'google.com'). The
- domain will be automatically normalized and validated.
-
- prioritize: Optional parameter to prioritize screenshot capture for styleguide extraction.
- If 'speed', optimizes for faster capture with basic quality. If 'quality',
- optimizes for higher quality with longer wait times. Defaults to 'quality' if
- not provided.
-
- timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
- than this value, it will be aborted with a 408 status code. Maximum allowed
- value is 300000ms (5 minutes).
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- return await self._get(
- "/brand/styleguide",
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- query=await async_maybe_transform(
- {
- "direct_url": direct_url,
- "domain": domain,
- "prioritize": prioritize,
- "timeout_ms": timeout_ms,
- },
- brand_styleguide_params.BrandStyleguideParams,
- ),
- ),
- cast_to=BrandStyleguideResponse,
- )
-
class BrandResourceWithRawResponse:
def __init__(self, brand: BrandResource) -> None:
@@ -3901,27 +2782,9 @@ def __init__(self, brand: BrandResource) -> None:
self.retrieve = to_raw_response_wrapper(
brand.retrieve,
)
- self.ai_product = to_raw_response_wrapper(
- brand.ai_product,
- )
- self.ai_products = to_raw_response_wrapper(
- brand.ai_products,
- )
- self.ai_query = to_raw_response_wrapper(
- brand.ai_query,
- )
- self.fonts = to_raw_response_wrapper(
- brand.fonts,
- )
self.identify_from_transaction = to_raw_response_wrapper(
brand.identify_from_transaction,
)
- self.prefetch = to_raw_response_wrapper(
- brand.prefetch,
- )
- self.prefetch_by_email = to_raw_response_wrapper(
- brand.prefetch_by_email,
- )
self.retrieve_by_email = to_raw_response_wrapper(
brand.retrieve_by_email,
)
@@ -3934,18 +2797,9 @@ def __init__(self, brand: BrandResource) -> None:
self.retrieve_by_ticker = to_raw_response_wrapper(
brand.retrieve_by_ticker,
)
- self.retrieve_naics = to_raw_response_wrapper(
- brand.retrieve_naics,
- )
self.retrieve_simplified = to_raw_response_wrapper(
brand.retrieve_simplified,
)
- self.screenshot = to_raw_response_wrapper(
- brand.screenshot,
- )
- self.styleguide = to_raw_response_wrapper(
- brand.styleguide,
- )
class AsyncBrandResourceWithRawResponse:
@@ -3955,27 +2809,9 @@ def __init__(self, brand: AsyncBrandResource) -> None:
self.retrieve = async_to_raw_response_wrapper(
brand.retrieve,
)
- self.ai_product = async_to_raw_response_wrapper(
- brand.ai_product,
- )
- self.ai_products = async_to_raw_response_wrapper(
- brand.ai_products,
- )
- self.ai_query = async_to_raw_response_wrapper(
- brand.ai_query,
- )
- self.fonts = async_to_raw_response_wrapper(
- brand.fonts,
- )
self.identify_from_transaction = async_to_raw_response_wrapper(
brand.identify_from_transaction,
)
- self.prefetch = async_to_raw_response_wrapper(
- brand.prefetch,
- )
- self.prefetch_by_email = async_to_raw_response_wrapper(
- brand.prefetch_by_email,
- )
self.retrieve_by_email = async_to_raw_response_wrapper(
brand.retrieve_by_email,
)
@@ -3988,18 +2824,9 @@ def __init__(self, brand: AsyncBrandResource) -> None:
self.retrieve_by_ticker = async_to_raw_response_wrapper(
brand.retrieve_by_ticker,
)
- self.retrieve_naics = async_to_raw_response_wrapper(
- brand.retrieve_naics,
- )
self.retrieve_simplified = async_to_raw_response_wrapper(
brand.retrieve_simplified,
)
- self.screenshot = async_to_raw_response_wrapper(
- brand.screenshot,
- )
- self.styleguide = async_to_raw_response_wrapper(
- brand.styleguide,
- )
class BrandResourceWithStreamingResponse:
@@ -4009,27 +2836,9 @@ def __init__(self, brand: BrandResource) -> None:
self.retrieve = to_streamed_response_wrapper(
brand.retrieve,
)
- self.ai_product = to_streamed_response_wrapper(
- brand.ai_product,
- )
- self.ai_products = to_streamed_response_wrapper(
- brand.ai_products,
- )
- self.ai_query = to_streamed_response_wrapper(
- brand.ai_query,
- )
- self.fonts = to_streamed_response_wrapper(
- brand.fonts,
- )
self.identify_from_transaction = to_streamed_response_wrapper(
brand.identify_from_transaction,
)
- self.prefetch = to_streamed_response_wrapper(
- brand.prefetch,
- )
- self.prefetch_by_email = to_streamed_response_wrapper(
- brand.prefetch_by_email,
- )
self.retrieve_by_email = to_streamed_response_wrapper(
brand.retrieve_by_email,
)
@@ -4042,18 +2851,9 @@ def __init__(self, brand: BrandResource) -> None:
self.retrieve_by_ticker = to_streamed_response_wrapper(
brand.retrieve_by_ticker,
)
- self.retrieve_naics = to_streamed_response_wrapper(
- brand.retrieve_naics,
- )
self.retrieve_simplified = to_streamed_response_wrapper(
brand.retrieve_simplified,
)
- self.screenshot = to_streamed_response_wrapper(
- brand.screenshot,
- )
- self.styleguide = to_streamed_response_wrapper(
- brand.styleguide,
- )
class AsyncBrandResourceWithStreamingResponse:
@@ -4063,27 +2863,9 @@ def __init__(self, brand: AsyncBrandResource) -> None:
self.retrieve = async_to_streamed_response_wrapper(
brand.retrieve,
)
- self.ai_product = async_to_streamed_response_wrapper(
- brand.ai_product,
- )
- self.ai_products = async_to_streamed_response_wrapper(
- brand.ai_products,
- )
- self.ai_query = async_to_streamed_response_wrapper(
- brand.ai_query,
- )
- self.fonts = async_to_streamed_response_wrapper(
- brand.fonts,
- )
self.identify_from_transaction = async_to_streamed_response_wrapper(
brand.identify_from_transaction,
)
- self.prefetch = async_to_streamed_response_wrapper(
- brand.prefetch,
- )
- self.prefetch_by_email = async_to_streamed_response_wrapper(
- brand.prefetch_by_email,
- )
self.retrieve_by_email = async_to_streamed_response_wrapper(
brand.retrieve_by_email,
)
@@ -4096,15 +2878,6 @@ def __init__(self, brand: AsyncBrandResource) -> None:
self.retrieve_by_ticker = async_to_streamed_response_wrapper(
brand.retrieve_by_ticker,
)
- self.retrieve_naics = async_to_streamed_response_wrapper(
- brand.retrieve_naics,
- )
self.retrieve_simplified = async_to_streamed_response_wrapper(
brand.retrieve_simplified,
)
- self.screenshot = async_to_streamed_response_wrapper(
- brand.screenshot,
- )
- self.styleguide = async_to_streamed_response_wrapper(
- brand.styleguide,
- )
diff --git a/src/context/dev/resources/industry.py b/src/context/dev/resources/industry.py
new file mode 100644
index 0000000..8a995e5
--- /dev/null
+++ b/src/context/dev/resources/industry.py
@@ -0,0 +1,217 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+import httpx
+
+from ..types import industry_retrieve_naics_params
+from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
+from .._utils import maybe_transform, async_maybe_transform
+from .._compat import cached_property
+from .._resource import SyncAPIResource, AsyncAPIResource
+from .._response import (
+ to_raw_response_wrapper,
+ to_streamed_response_wrapper,
+ async_to_raw_response_wrapper,
+ async_to_streamed_response_wrapper,
+)
+from .._base_client import make_request_options
+from ..types.industry_retrieve_naics_response import IndustryRetrieveNaicsResponse
+
+__all__ = ["IndustryResource", "AsyncIndustryResource"]
+
+
+class IndustryResource(SyncAPIResource):
+ @cached_property
+ def with_raw_response(self) -> IndustryResourceWithRawResponse:
+ """
+ This property can be used as a prefix for any HTTP method call to return
+ the raw response object instead of the parsed content.
+
+ For more information, see https://www.github.com/brand-dot-dev/context-python-sdk#accessing-raw-response-data-eg-headers
+ """
+ return IndustryResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> IndustryResourceWithStreamingResponse:
+ """
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
+
+ For more information, see https://www.github.com/brand-dot-dev/context-python-sdk#with_streaming_response
+ """
+ return IndustryResourceWithStreamingResponse(self)
+
+ def retrieve_naics(
+ self,
+ *,
+ input: str,
+ max_results: int | Omit = omit,
+ min_results: int | Omit = omit,
+ timeout_ms: int | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> IndustryRetrieveNaicsResponse:
+ """
+ Endpoint to classify any brand into a 2022 NAICS code.
+
+ Args:
+ input: Brand domain or title to retrieve NAICS code for. If a valid domain is provided
+ in `input`, it will be used for classification, otherwise, we will search for
+ the brand using the provided title.
+
+ max_results: Maximum number of NAICS codes to return. Must be between 1 and 10. Defaults
+ to 5.
+
+ min_results: Minimum number of NAICS codes to return. Must be at least 1. Defaults to 1.
+
+ timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
+ than this value, it will be aborted with a 408 status code. Maximum allowed
+ value is 300000ms (5 minutes).
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return self._get(
+ "/brand/naics",
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=maybe_transform(
+ {
+ "input": input,
+ "max_results": max_results,
+ "min_results": min_results,
+ "timeout_ms": timeout_ms,
+ },
+ industry_retrieve_naics_params.IndustryRetrieveNaicsParams,
+ ),
+ ),
+ cast_to=IndustryRetrieveNaicsResponse,
+ )
+
+
+class AsyncIndustryResource(AsyncAPIResource):
+ @cached_property
+ def with_raw_response(self) -> AsyncIndustryResourceWithRawResponse:
+ """
+ This property can be used as a prefix for any HTTP method call to return
+ the raw response object instead of the parsed content.
+
+ For more information, see https://www.github.com/brand-dot-dev/context-python-sdk#accessing-raw-response-data-eg-headers
+ """
+ return AsyncIndustryResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> AsyncIndustryResourceWithStreamingResponse:
+ """
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
+
+ For more information, see https://www.github.com/brand-dot-dev/context-python-sdk#with_streaming_response
+ """
+ return AsyncIndustryResourceWithStreamingResponse(self)
+
+ async def retrieve_naics(
+ self,
+ *,
+ input: str,
+ max_results: int | Omit = omit,
+ min_results: int | Omit = omit,
+ timeout_ms: int | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> IndustryRetrieveNaicsResponse:
+ """
+ Endpoint to classify any brand into a 2022 NAICS code.
+
+ Args:
+ input: Brand domain or title to retrieve NAICS code for. If a valid domain is provided
+ in `input`, it will be used for classification, otherwise, we will search for
+ the brand using the provided title.
+
+ max_results: Maximum number of NAICS codes to return. Must be between 1 and 10. Defaults
+ to 5.
+
+ min_results: Minimum number of NAICS codes to return. Must be at least 1. Defaults to 1.
+
+ timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
+ than this value, it will be aborted with a 408 status code. Maximum allowed
+ value is 300000ms (5 minutes).
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return await self._get(
+ "/brand/naics",
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=await async_maybe_transform(
+ {
+ "input": input,
+ "max_results": max_results,
+ "min_results": min_results,
+ "timeout_ms": timeout_ms,
+ },
+ industry_retrieve_naics_params.IndustryRetrieveNaicsParams,
+ ),
+ ),
+ cast_to=IndustryRetrieveNaicsResponse,
+ )
+
+
+class IndustryResourceWithRawResponse:
+ def __init__(self, industry: IndustryResource) -> None:
+ self._industry = industry
+
+ self.retrieve_naics = to_raw_response_wrapper(
+ industry.retrieve_naics,
+ )
+
+
+class AsyncIndustryResourceWithRawResponse:
+ def __init__(self, industry: AsyncIndustryResource) -> None:
+ self._industry = industry
+
+ self.retrieve_naics = async_to_raw_response_wrapper(
+ industry.retrieve_naics,
+ )
+
+
+class IndustryResourceWithStreamingResponse:
+ def __init__(self, industry: IndustryResource) -> None:
+ self._industry = industry
+
+ self.retrieve_naics = to_streamed_response_wrapper(
+ industry.retrieve_naics,
+ )
+
+
+class AsyncIndustryResourceWithStreamingResponse:
+ def __init__(self, industry: AsyncIndustryResource) -> None:
+ self._industry = industry
+
+ self.retrieve_naics = async_to_streamed_response_wrapper(
+ industry.retrieve_naics,
+ )
diff --git a/src/context/dev/resources/style.py b/src/context/dev/resources/style.py
new file mode 100644
index 0000000..6a7c23d
--- /dev/null
+++ b/src/context/dev/resources/style.py
@@ -0,0 +1,342 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import Literal
+
+import httpx
+
+from ..types import style_extract_fonts_params, style_extract_styleguide_params
+from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
+from .._utils import maybe_transform, async_maybe_transform
+from .._compat import cached_property
+from .._resource import SyncAPIResource, AsyncAPIResource
+from .._response import (
+ to_raw_response_wrapper,
+ to_streamed_response_wrapper,
+ async_to_raw_response_wrapper,
+ async_to_streamed_response_wrapper,
+)
+from .._base_client import make_request_options
+from ..types.style_extract_fonts_response import StyleExtractFontsResponse
+from ..types.style_extract_styleguide_response import StyleExtractStyleguideResponse
+
+__all__ = ["StyleResource", "AsyncStyleResource"]
+
+
+class StyleResource(SyncAPIResource):
+ @cached_property
+ def with_raw_response(self) -> StyleResourceWithRawResponse:
+ """
+ This property can be used as a prefix for any HTTP method call to return
+ the raw response object instead of the parsed content.
+
+ For more information, see https://www.github.com/brand-dot-dev/context-python-sdk#accessing-raw-response-data-eg-headers
+ """
+ return StyleResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> StyleResourceWithStreamingResponse:
+ """
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
+
+ For more information, see https://www.github.com/brand-dot-dev/context-python-sdk#with_streaming_response
+ """
+ return StyleResourceWithStreamingResponse(self)
+
+ def extract_fonts(
+ self,
+ *,
+ domain: str,
+ timeout_ms: int | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> StyleExtractFontsResponse:
+ """
+ Extract font information from a brand's website including font families, usage
+ statistics, fallbacks, and element/word counts.
+
+ Args:
+ domain: Domain name to extract fonts from (e.g., 'example.com', 'google.com'). The
+ domain will be automatically normalized and validated.
+
+ timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
+ than this value, it will be aborted with a 408 status code. Maximum allowed
+ value is 300000ms (5 minutes).
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return self._get(
+ "/brand/fonts",
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=maybe_transform(
+ {
+ "domain": domain,
+ "timeout_ms": timeout_ms,
+ },
+ style_extract_fonts_params.StyleExtractFontsParams,
+ ),
+ ),
+ cast_to=StyleExtractFontsResponse,
+ )
+
+ def extract_styleguide(
+ self,
+ *,
+ direct_url: str | Omit = omit,
+ domain: str | Omit = omit,
+ prioritize: Literal["speed", "quality"] | Omit = omit,
+ timeout_ms: int | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> StyleExtractStyleguideResponse:
+ """
+ Automatically extract comprehensive design system information from a brand's
+ website including colors, typography, spacing, shadows, and UI components.
+ Either 'domain' or 'directUrl' must be provided as a query parameter, but not
+ both.
+
+ Args:
+ direct_url: A specific URL to fetch the styleguide from directly, bypassing domain
+ resolution (e.g., 'https://example.com/design-system').
+
+ domain: Domain name to extract styleguide from (e.g., 'example.com', 'google.com'). The
+ domain will be automatically normalized and validated.
+
+ prioritize: Optional parameter to prioritize screenshot capture for styleguide extraction.
+ If 'speed', optimizes for faster capture with basic quality. If 'quality',
+ optimizes for higher quality with longer wait times. Defaults to 'quality' if
+ not provided.
+
+ timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
+ than this value, it will be aborted with a 408 status code. Maximum allowed
+ value is 300000ms (5 minutes).
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return self._get(
+ "/brand/styleguide",
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=maybe_transform(
+ {
+ "direct_url": direct_url,
+ "domain": domain,
+ "prioritize": prioritize,
+ "timeout_ms": timeout_ms,
+ },
+ style_extract_styleguide_params.StyleExtractStyleguideParams,
+ ),
+ ),
+ cast_to=StyleExtractStyleguideResponse,
+ )
+
+
+class AsyncStyleResource(AsyncAPIResource):
+ @cached_property
+ def with_raw_response(self) -> AsyncStyleResourceWithRawResponse:
+ """
+ This property can be used as a prefix for any HTTP method call to return
+ the raw response object instead of the parsed content.
+
+ For more information, see https://www.github.com/brand-dot-dev/context-python-sdk#accessing-raw-response-data-eg-headers
+ """
+ return AsyncStyleResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> AsyncStyleResourceWithStreamingResponse:
+ """
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
+
+ For more information, see https://www.github.com/brand-dot-dev/context-python-sdk#with_streaming_response
+ """
+ return AsyncStyleResourceWithStreamingResponse(self)
+
+ async def extract_fonts(
+ self,
+ *,
+ domain: str,
+ timeout_ms: int | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> StyleExtractFontsResponse:
+ """
+ Extract font information from a brand's website including font families, usage
+ statistics, fallbacks, and element/word counts.
+
+ Args:
+ domain: Domain name to extract fonts from (e.g., 'example.com', 'google.com'). The
+ domain will be automatically normalized and validated.
+
+ timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
+ than this value, it will be aborted with a 408 status code. Maximum allowed
+ value is 300000ms (5 minutes).
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return await self._get(
+ "/brand/fonts",
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=await async_maybe_transform(
+ {
+ "domain": domain,
+ "timeout_ms": timeout_ms,
+ },
+ style_extract_fonts_params.StyleExtractFontsParams,
+ ),
+ ),
+ cast_to=StyleExtractFontsResponse,
+ )
+
+ async def extract_styleguide(
+ self,
+ *,
+ direct_url: str | Omit = omit,
+ domain: str | Omit = omit,
+ prioritize: Literal["speed", "quality"] | Omit = omit,
+ timeout_ms: int | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> StyleExtractStyleguideResponse:
+ """
+ Automatically extract comprehensive design system information from a brand's
+ website including colors, typography, spacing, shadows, and UI components.
+ Either 'domain' or 'directUrl' must be provided as a query parameter, but not
+ both.
+
+ Args:
+ direct_url: A specific URL to fetch the styleguide from directly, bypassing domain
+ resolution (e.g., 'https://example.com/design-system').
+
+ domain: Domain name to extract styleguide from (e.g., 'example.com', 'google.com'). The
+ domain will be automatically normalized and validated.
+
+ prioritize: Optional parameter to prioritize screenshot capture for styleguide extraction.
+ If 'speed', optimizes for faster capture with basic quality. If 'quality',
+ optimizes for higher quality with longer wait times. Defaults to 'quality' if
+ not provided.
+
+ timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
+ than this value, it will be aborted with a 408 status code. Maximum allowed
+ value is 300000ms (5 minutes).
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return await self._get(
+ "/brand/styleguide",
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=await async_maybe_transform(
+ {
+ "direct_url": direct_url,
+ "domain": domain,
+ "prioritize": prioritize,
+ "timeout_ms": timeout_ms,
+ },
+ style_extract_styleguide_params.StyleExtractStyleguideParams,
+ ),
+ ),
+ cast_to=StyleExtractStyleguideResponse,
+ )
+
+
+class StyleResourceWithRawResponse:
+ def __init__(self, style: StyleResource) -> None:
+ self._style = style
+
+ self.extract_fonts = to_raw_response_wrapper(
+ style.extract_fonts,
+ )
+ self.extract_styleguide = to_raw_response_wrapper(
+ style.extract_styleguide,
+ )
+
+
+class AsyncStyleResourceWithRawResponse:
+ def __init__(self, style: AsyncStyleResource) -> None:
+ self._style = style
+
+ self.extract_fonts = async_to_raw_response_wrapper(
+ style.extract_fonts,
+ )
+ self.extract_styleguide = async_to_raw_response_wrapper(
+ style.extract_styleguide,
+ )
+
+
+class StyleResourceWithStreamingResponse:
+ def __init__(self, style: StyleResource) -> None:
+ self._style = style
+
+ self.extract_fonts = to_streamed_response_wrapper(
+ style.extract_fonts,
+ )
+ self.extract_styleguide = to_streamed_response_wrapper(
+ style.extract_styleguide,
+ )
+
+
+class AsyncStyleResourceWithStreamingResponse:
+ def __init__(self, style: AsyncStyleResource) -> None:
+ self._style = style
+
+ self.extract_fonts = async_to_streamed_response_wrapper(
+ style.extract_fonts,
+ )
+ self.extract_styleguide = async_to_streamed_response_wrapper(
+ style.extract_styleguide,
+ )
diff --git a/src/context/dev/resources/utility.py b/src/context/dev/resources/utility.py
new file mode 100644
index 0000000..2998696
--- /dev/null
+++ b/src/context/dev/resources/utility.py
@@ -0,0 +1,312 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+import httpx
+
+from ..types import utility_prefetch_params, utility_prefetch_by_email_params
+from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
+from .._utils import maybe_transform, async_maybe_transform
+from .._compat import cached_property
+from .._resource import SyncAPIResource, AsyncAPIResource
+from .._response import (
+ to_raw_response_wrapper,
+ to_streamed_response_wrapper,
+ async_to_raw_response_wrapper,
+ async_to_streamed_response_wrapper,
+)
+from .._base_client import make_request_options
+from ..types.utility_prefetch_response import UtilityPrefetchResponse
+from ..types.utility_prefetch_by_email_response import UtilityPrefetchByEmailResponse
+
+__all__ = ["UtilityResource", "AsyncUtilityResource"]
+
+
+class UtilityResource(SyncAPIResource):
+ @cached_property
+ def with_raw_response(self) -> UtilityResourceWithRawResponse:
+ """
+ This property can be used as a prefix for any HTTP method call to return
+ the raw response object instead of the parsed content.
+
+ For more information, see https://www.github.com/brand-dot-dev/context-python-sdk#accessing-raw-response-data-eg-headers
+ """
+ return UtilityResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> UtilityResourceWithStreamingResponse:
+ """
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
+
+ For more information, see https://www.github.com/brand-dot-dev/context-python-sdk#with_streaming_response
+ """
+ return UtilityResourceWithStreamingResponse(self)
+
+ def prefetch(
+ self,
+ *,
+ domain: str,
+ timeout_ms: int | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> UtilityPrefetchResponse:
+ """
+ Signal that you may fetch brand data for a particular domain soon to improve
+ latency. This endpoint does not charge credits and is available for paid
+ customers to optimize future requests. [You must be on a paid plan to use this
+ endpoint]
+
+ Args:
+ domain: Domain name to prefetch brand data for
+
+ timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
+ than this value, it will be aborted with a 408 status code. Maximum allowed
+ value is 300000ms (5 minutes).
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return self._post(
+ "/brand/prefetch",
+ body=maybe_transform(
+ {
+ "domain": domain,
+ "timeout_ms": timeout_ms,
+ },
+ utility_prefetch_params.UtilityPrefetchParams,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=UtilityPrefetchResponse,
+ )
+
+ def prefetch_by_email(
+ self,
+ *,
+ email: str,
+ timeout_ms: int | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> UtilityPrefetchByEmailResponse:
+ """
+ Signal that you may fetch brand data for a particular domain soon to improve
+ latency. This endpoint accepts an email address, extracts the domain from it,
+ validates that it's not a disposable or free email provider, and queues the
+ domain for prefetching. This endpoint does not charge credits and is available
+ for paid customers to optimize future requests. [You must be on a paid plan to
+ use this endpoint]
+
+ Args:
+ email: Email address to prefetch brand data for. The domain will be extracted from the
+ email. Free email providers (gmail.com, yahoo.com, etc.) and disposable email
+ addresses are not allowed.
+
+ timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
+ than this value, it will be aborted with a 408 status code. Maximum allowed
+ value is 300000ms (5 minutes).
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return self._post(
+ "/brand/prefetch-by-email",
+ body=maybe_transform(
+ {
+ "email": email,
+ "timeout_ms": timeout_ms,
+ },
+ utility_prefetch_by_email_params.UtilityPrefetchByEmailParams,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=UtilityPrefetchByEmailResponse,
+ )
+
+
+class AsyncUtilityResource(AsyncAPIResource):
+ @cached_property
+ def with_raw_response(self) -> AsyncUtilityResourceWithRawResponse:
+ """
+ This property can be used as a prefix for any HTTP method call to return
+ the raw response object instead of the parsed content.
+
+ For more information, see https://www.github.com/brand-dot-dev/context-python-sdk#accessing-raw-response-data-eg-headers
+ """
+ return AsyncUtilityResourceWithRawResponse(self)
+
+ @cached_property
+ def with_streaming_response(self) -> AsyncUtilityResourceWithStreamingResponse:
+ """
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
+
+ For more information, see https://www.github.com/brand-dot-dev/context-python-sdk#with_streaming_response
+ """
+ return AsyncUtilityResourceWithStreamingResponse(self)
+
+ async def prefetch(
+ self,
+ *,
+ domain: str,
+ timeout_ms: int | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> UtilityPrefetchResponse:
+ """
+ Signal that you may fetch brand data for a particular domain soon to improve
+ latency. This endpoint does not charge credits and is available for paid
+ customers to optimize future requests. [You must be on a paid plan to use this
+ endpoint]
+
+ Args:
+ domain: Domain name to prefetch brand data for
+
+ timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
+ than this value, it will be aborted with a 408 status code. Maximum allowed
+ value is 300000ms (5 minutes).
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return await self._post(
+ "/brand/prefetch",
+ body=await async_maybe_transform(
+ {
+ "domain": domain,
+ "timeout_ms": timeout_ms,
+ },
+ utility_prefetch_params.UtilityPrefetchParams,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=UtilityPrefetchResponse,
+ )
+
+ async def prefetch_by_email(
+ self,
+ *,
+ email: str,
+ timeout_ms: int | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> UtilityPrefetchByEmailResponse:
+ """
+ Signal that you may fetch brand data for a particular domain soon to improve
+ latency. This endpoint accepts an email address, extracts the domain from it,
+ validates that it's not a disposable or free email provider, and queues the
+ domain for prefetching. This endpoint does not charge credits and is available
+ for paid customers to optimize future requests. [You must be on a paid plan to
+ use this endpoint]
+
+ Args:
+ email: Email address to prefetch brand data for. The domain will be extracted from the
+ email. Free email providers (gmail.com, yahoo.com, etc.) and disposable email
+ addresses are not allowed.
+
+ timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
+ than this value, it will be aborted with a 408 status code. Maximum allowed
+ value is 300000ms (5 minutes).
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return await self._post(
+ "/brand/prefetch-by-email",
+ body=await async_maybe_transform(
+ {
+ "email": email,
+ "timeout_ms": timeout_ms,
+ },
+ utility_prefetch_by_email_params.UtilityPrefetchByEmailParams,
+ ),
+ options=make_request_options(
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ ),
+ cast_to=UtilityPrefetchByEmailResponse,
+ )
+
+
+class UtilityResourceWithRawResponse:
+ def __init__(self, utility: UtilityResource) -> None:
+ self._utility = utility
+
+ self.prefetch = to_raw_response_wrapper(
+ utility.prefetch,
+ )
+ self.prefetch_by_email = to_raw_response_wrapper(
+ utility.prefetch_by_email,
+ )
+
+
+class AsyncUtilityResourceWithRawResponse:
+ def __init__(self, utility: AsyncUtilityResource) -> None:
+ self._utility = utility
+
+ self.prefetch = async_to_raw_response_wrapper(
+ utility.prefetch,
+ )
+ self.prefetch_by_email = async_to_raw_response_wrapper(
+ utility.prefetch_by_email,
+ )
+
+
+class UtilityResourceWithStreamingResponse:
+ def __init__(self, utility: UtilityResource) -> None:
+ self._utility = utility
+
+ self.prefetch = to_streamed_response_wrapper(
+ utility.prefetch,
+ )
+ self.prefetch_by_email = to_streamed_response_wrapper(
+ utility.prefetch_by_email,
+ )
+
+
+class AsyncUtilityResourceWithStreamingResponse:
+ def __init__(self, utility: AsyncUtilityResource) -> None:
+ self._utility = utility
+
+ self.prefetch = async_to_streamed_response_wrapper(
+ utility.prefetch,
+ )
+ self.prefetch_by_email = async_to_streamed_response_wrapper(
+ utility.prefetch_by_email,
+ )
diff --git a/src/context/dev/resources/web.py b/src/context/dev/resources/web.py
index 4e227c2..5ba2455 100644
--- a/src/context/dev/resources/web.py
+++ b/src/context/dev/resources/web.py
@@ -2,9 +2,12 @@
from __future__ import annotations
+from typing_extensions import Literal
+
import httpx
from ..types import (
+ web_screenshot_params,
web_web_scrape_md_params,
web_web_scrape_html_params,
web_web_scrape_images_params,
@@ -21,6 +24,7 @@
async_to_streamed_response_wrapper,
)
from .._base_client import make_request_options
+from ..types.web_screenshot_response import WebScreenshotResponse
from ..types.web_web_scrape_md_response import WebWebScrapeMdResponse
from ..types.web_web_scrape_html_response import WebWebScrapeHTMLResponse
from ..types.web_web_scrape_images_response import WebWebScrapeImagesResponse
@@ -49,6 +53,72 @@ def with_streaming_response(self) -> WebResourceWithStreamingResponse:
"""
return WebResourceWithStreamingResponse(self)
+ def screenshot(
+ self,
+ *,
+ domain: str,
+ full_screenshot: Literal["true", "false"] | Omit = omit,
+ page: Literal["login", "signup", "blog", "careers", "pricing", "terms", "privacy", "contact"] | Omit = omit,
+ prioritize: Literal["speed", "quality"] | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> WebScreenshotResponse:
+ """Capture a screenshot of a website.
+
+ Supports both viewport (standard browser
+ view) and full-page screenshots. Can also screenshot specific page types (login,
+ pricing, etc.) by using heuristics to find the appropriate URL. Returns a URL to
+ the uploaded screenshot image hosted on our CDN.
+
+ Args:
+ domain: Domain name to take screenshot of (e.g., 'example.com', 'google.com'). The
+ domain will be automatically normalized and validated.
+
+ full_screenshot: Optional parameter to determine screenshot type. If 'true', takes a full page
+ screenshot capturing all content. If 'false' or not provided, takes a viewport
+ screenshot (standard browser view).
+
+ page: Optional parameter to specify which page type to screenshot. If provided, the
+ system will scrape the domain's links and use heuristics to find the most
+ appropriate URL for the specified page type (30 supported languages). If not
+ provided, screenshots the main domain landing page.
+
+ prioritize: Optional parameter to prioritize screenshot capture. If 'speed', optimizes for
+ faster capture with basic quality. If 'quality', optimizes for higher quality
+ with longer wait times. Defaults to 'quality' if not provided.
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return self._get(
+ "/brand/screenshot",
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=maybe_transform(
+ {
+ "domain": domain,
+ "full_screenshot": full_screenshot,
+ "page": page,
+ "prioritize": prioritize,
+ },
+ web_screenshot_params.WebScreenshotParams,
+ ),
+ ),
+ cast_to=WebScreenshotResponse,
+ )
+
def web_scrape_html(
self,
*,
@@ -246,6 +316,72 @@ def with_streaming_response(self) -> AsyncWebResourceWithStreamingResponse:
"""
return AsyncWebResourceWithStreamingResponse(self)
+ async def screenshot(
+ self,
+ *,
+ domain: str,
+ full_screenshot: Literal["true", "false"] | Omit = omit,
+ page: Literal["login", "signup", "blog", "careers", "pricing", "terms", "privacy", "contact"] | Omit = omit,
+ prioritize: Literal["speed", "quality"] | Omit = omit,
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
+ # The extra values given here take precedence over values defined on the client or passed to this method.
+ extra_headers: Headers | None = None,
+ extra_query: Query | None = None,
+ extra_body: Body | None = None,
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
+ ) -> WebScreenshotResponse:
+ """Capture a screenshot of a website.
+
+ Supports both viewport (standard browser
+ view) and full-page screenshots. Can also screenshot specific page types (login,
+ pricing, etc.) by using heuristics to find the appropriate URL. Returns a URL to
+ the uploaded screenshot image hosted on our CDN.
+
+ Args:
+ domain: Domain name to take screenshot of (e.g., 'example.com', 'google.com'). The
+ domain will be automatically normalized and validated.
+
+ full_screenshot: Optional parameter to determine screenshot type. If 'true', takes a full page
+ screenshot capturing all content. If 'false' or not provided, takes a viewport
+ screenshot (standard browser view).
+
+ page: Optional parameter to specify which page type to screenshot. If provided, the
+ system will scrape the domain's links and use heuristics to find the most
+ appropriate URL for the specified page type (30 supported languages). If not
+ provided, screenshots the main domain landing page.
+
+ prioritize: Optional parameter to prioritize screenshot capture. If 'speed', optimizes for
+ faster capture with basic quality. If 'quality', optimizes for higher quality
+ with longer wait times. Defaults to 'quality' if not provided.
+
+ extra_headers: Send extra headers
+
+ extra_query: Add additional query parameters to the request
+
+ extra_body: Add additional JSON properties to the request
+
+ timeout: Override the client-level default timeout for this request, in seconds
+ """
+ return await self._get(
+ "/brand/screenshot",
+ options=make_request_options(
+ extra_headers=extra_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=await async_maybe_transform(
+ {
+ "domain": domain,
+ "full_screenshot": full_screenshot,
+ "page": page,
+ "prioritize": prioritize,
+ },
+ web_screenshot_params.WebScreenshotParams,
+ ),
+ ),
+ cast_to=WebScreenshotResponse,
+ )
+
async def web_scrape_html(
self,
*,
@@ -429,6 +565,9 @@ class WebResourceWithRawResponse:
def __init__(self, web: WebResource) -> None:
self._web = web
+ self.screenshot = to_raw_response_wrapper(
+ web.screenshot,
+ )
self.web_scrape_html = to_raw_response_wrapper(
web.web_scrape_html,
)
@@ -447,6 +586,9 @@ class AsyncWebResourceWithRawResponse:
def __init__(self, web: AsyncWebResource) -> None:
self._web = web
+ self.screenshot = async_to_raw_response_wrapper(
+ web.screenshot,
+ )
self.web_scrape_html = async_to_raw_response_wrapper(
web.web_scrape_html,
)
@@ -465,6 +607,9 @@ class WebResourceWithStreamingResponse:
def __init__(self, web: WebResource) -> None:
self._web = web
+ self.screenshot = to_streamed_response_wrapper(
+ web.screenshot,
+ )
self.web_scrape_html = to_streamed_response_wrapper(
web.web_scrape_html,
)
@@ -483,6 +628,9 @@ class AsyncWebResourceWithStreamingResponse:
def __init__(self, web: AsyncWebResource) -> None:
self._web = web
+ self.screenshot = async_to_streamed_response_wrapper(
+ web.screenshot,
+ )
self.web_scrape_html = async_to_streamed_response_wrapper(
web.web_scrape_html,
)
diff --git a/src/context/dev/types/__init__.py b/src/context/dev/types/__init__.py
index 56273fc..c485ed5 100644
--- a/src/context/dev/types/__init__.py
+++ b/src/context/dev/types/__init__.py
@@ -2,44 +2,44 @@
from __future__ import annotations
-from .brand_fonts_params import BrandFontsParams as BrandFontsParams
-from .brand_fonts_response import BrandFontsResponse as BrandFontsResponse
-from .brand_ai_query_params import BrandAIQueryParams as BrandAIQueryParams
-from .brand_prefetch_params import BrandPrefetchParams as BrandPrefetchParams
+from .ai_ai_query_params import AIAIQueryParams as AIAIQueryParams
+from .ai_ai_query_response import AIAIQueryResponse as AIAIQueryResponse
from .brand_retrieve_params import BrandRetrieveParams as BrandRetrieveParams
-from .brand_ai_product_params import BrandAIProductParams as BrandAIProductParams
-from .brand_ai_query_response import BrandAIQueryResponse as BrandAIQueryResponse
-from .brand_prefetch_response import BrandPrefetchResponse as BrandPrefetchResponse
+from .web_screenshot_params import WebScreenshotParams as WebScreenshotParams
from .brand_retrieve_response import BrandRetrieveResponse as BrandRetrieveResponse
-from .brand_screenshot_params import BrandScreenshotParams as BrandScreenshotParams
-from .brand_styleguide_params import BrandStyleguideParams as BrandStyleguideParams
-from .brand_ai_products_params import BrandAIProductsParams as BrandAIProductsParams
+from .utility_prefetch_params import UtilityPrefetchParams as UtilityPrefetchParams
+from .web_screenshot_response import WebScreenshotResponse as WebScreenshotResponse
from .web_web_scrape_md_params import WebWebScrapeMdParams as WebWebScrapeMdParams
-from .brand_ai_product_response import BrandAIProductResponse as BrandAIProductResponse
-from .brand_screenshot_response import BrandScreenshotResponse as BrandScreenshotResponse
-from .brand_styleguide_response import BrandStyleguideResponse as BrandStyleguideResponse
-from .brand_ai_products_response import BrandAIProductsResponse as BrandAIProductsResponse
+from .ai_extract_product_params import AIExtractProductParams as AIExtractProductParams
+from .utility_prefetch_response import UtilityPrefetchResponse as UtilityPrefetchResponse
+from .ai_extract_products_params import AIExtractProductsParams as AIExtractProductsParams
+from .style_extract_fonts_params import StyleExtractFontsParams as StyleExtractFontsParams
from .web_web_scrape_html_params import WebWebScrapeHTMLParams as WebWebScrapeHTMLParams
from .web_web_scrape_md_response import WebWebScrapeMdResponse as WebWebScrapeMdResponse
-from .brand_retrieve_naics_params import BrandRetrieveNaicsParams as BrandRetrieveNaicsParams
+from .ai_extract_product_response import AIExtractProductResponse as AIExtractProductResponse
+from .ai_extract_products_response import AIExtractProductsResponse as AIExtractProductsResponse
+from .style_extract_fonts_response import StyleExtractFontsResponse as StyleExtractFontsResponse
from .web_web_scrape_html_response import WebWebScrapeHTMLResponse as WebWebScrapeHTMLResponse
from .web_web_scrape_images_params import WebWebScrapeImagesParams as WebWebScrapeImagesParams
from .brand_retrieve_by_isin_params import BrandRetrieveByIsinParams as BrandRetrieveByIsinParams
from .brand_retrieve_by_name_params import BrandRetrieveByNameParams as BrandRetrieveByNameParams
-from .brand_retrieve_naics_response import BrandRetrieveNaicsResponse as BrandRetrieveNaicsResponse
from .web_web_scrape_sitemap_params import WebWebScrapeSitemapParams as WebWebScrapeSitemapParams
-from .brand_prefetch_by_email_params import BrandPrefetchByEmailParams as BrandPrefetchByEmailParams
from .brand_retrieve_by_email_params import BrandRetrieveByEmailParams as BrandRetrieveByEmailParams
+from .industry_retrieve_naics_params import IndustryRetrieveNaicsParams as IndustryRetrieveNaicsParams
from .web_web_scrape_images_response import WebWebScrapeImagesResponse as WebWebScrapeImagesResponse
from .brand_retrieve_by_isin_response import BrandRetrieveByIsinResponse as BrandRetrieveByIsinResponse
from .brand_retrieve_by_name_response import BrandRetrieveByNameResponse as BrandRetrieveByNameResponse
from .brand_retrieve_by_ticker_params import BrandRetrieveByTickerParams as BrandRetrieveByTickerParams
+from .style_extract_styleguide_params import StyleExtractStyleguideParams as StyleExtractStyleguideParams
from .web_web_scrape_sitemap_response import WebWebScrapeSitemapResponse as WebWebScrapeSitemapResponse
-from .brand_prefetch_by_email_response import BrandPrefetchByEmailResponse as BrandPrefetchByEmailResponse
from .brand_retrieve_by_email_response import BrandRetrieveByEmailResponse as BrandRetrieveByEmailResponse
from .brand_retrieve_simplified_params import BrandRetrieveSimplifiedParams as BrandRetrieveSimplifiedParams
+from .industry_retrieve_naics_response import IndustryRetrieveNaicsResponse as IndustryRetrieveNaicsResponse
+from .utility_prefetch_by_email_params import UtilityPrefetchByEmailParams as UtilityPrefetchByEmailParams
from .brand_retrieve_by_ticker_response import BrandRetrieveByTickerResponse as BrandRetrieveByTickerResponse
+from .style_extract_styleguide_response import StyleExtractStyleguideResponse as StyleExtractStyleguideResponse
from .brand_retrieve_simplified_response import BrandRetrieveSimplifiedResponse as BrandRetrieveSimplifiedResponse
+from .utility_prefetch_by_email_response import UtilityPrefetchByEmailResponse as UtilityPrefetchByEmailResponse
from .brand_identify_from_transaction_params import (
BrandIdentifyFromTransactionParams as BrandIdentifyFromTransactionParams,
)
diff --git a/src/context/dev/types/brand_ai_query_params.py b/src/context/dev/types/ai_ai_query_params.py
similarity index 95%
rename from src/context/dev/types/brand_ai_query_params.py
rename to src/context/dev/types/ai_ai_query_params.py
index d45a821..dd21b8e 100644
--- a/src/context/dev/types/brand_ai_query_params.py
+++ b/src/context/dev/types/ai_ai_query_params.py
@@ -7,10 +7,10 @@
from .._utils import PropertyInfo
-__all__ = ["BrandAIQueryParams", "DataToExtract", "SpecificPages"]
+__all__ = ["AIAIQueryParams", "DataToExtract", "SpecificPages"]
-class BrandAIQueryParams(TypedDict, total=False):
+class AIAIQueryParams(TypedDict, total=False):
data_to_extract: Required[Iterable[DataToExtract]]
"""Array of data points to extract from the website"""
diff --git a/src/context/dev/types/brand_ai_query_response.py b/src/context/dev/types/ai_ai_query_response.py
similarity index 90%
rename from src/context/dev/types/brand_ai_query_response.py
rename to src/context/dev/types/ai_ai_query_response.py
index 9971458..1c49c53 100644
--- a/src/context/dev/types/brand_ai_query_response.py
+++ b/src/context/dev/types/ai_ai_query_response.py
@@ -4,7 +4,7 @@
from .._models import BaseModel
-__all__ = ["BrandAIQueryResponse", "DataExtracted"]
+__all__ = ["AIAIQueryResponse", "DataExtracted"]
class DataExtracted(BaseModel):
@@ -19,7 +19,7 @@ class DataExtracted(BaseModel):
"""
-class BrandAIQueryResponse(BaseModel):
+class AIAIQueryResponse(BaseModel):
data_extracted: Optional[List[DataExtracted]] = None
"""Array of extracted data points"""
diff --git a/src/context/dev/types/brand_ai_product_params.py b/src/context/dev/types/ai_extract_product_params.py
similarity index 84%
rename from src/context/dev/types/brand_ai_product_params.py
rename to src/context/dev/types/ai_extract_product_params.py
index 17e62c9..b570411 100644
--- a/src/context/dev/types/brand_ai_product_params.py
+++ b/src/context/dev/types/ai_extract_product_params.py
@@ -6,10 +6,10 @@
from .._utils import PropertyInfo
-__all__ = ["BrandAIProductParams"]
+__all__ = ["AIExtractProductParams"]
-class BrandAIProductParams(TypedDict, total=False):
+class AIExtractProductParams(TypedDict, total=False):
url: Required[str]
"""The product page URL to extract product data from."""
diff --git a/src/context/dev/types/brand_ai_product_response.py b/src/context/dev/types/ai_extract_product_response.py
similarity index 94%
rename from src/context/dev/types/brand_ai_product_response.py
rename to src/context/dev/types/ai_extract_product_response.py
index eb31de2..b2db947 100644
--- a/src/context/dev/types/brand_ai_product_response.py
+++ b/src/context/dev/types/ai_extract_product_response.py
@@ -5,7 +5,7 @@
from .._models import BaseModel
-__all__ = ["BrandAIProductResponse", "Product"]
+__all__ = ["AIExtractProductResponse", "Product"]
class Product(BaseModel):
@@ -51,7 +51,7 @@ class Product(BaseModel):
"""URL to the product page"""
-class BrandAIProductResponse(BaseModel):
+class AIExtractProductResponse(BaseModel):
is_product_page: Optional[bool] = None
"""Whether the given URL is a product detail page"""
diff --git a/src/context/dev/types/brand_ai_products_params.py b/src/context/dev/types/ai_extract_products_params.py
similarity index 90%
rename from src/context/dev/types/brand_ai_products_params.py
rename to src/context/dev/types/ai_extract_products_params.py
index 9a61efe..1aaa868 100644
--- a/src/context/dev/types/brand_ai_products_params.py
+++ b/src/context/dev/types/ai_extract_products_params.py
@@ -7,7 +7,7 @@
from .._utils import PropertyInfo
-__all__ = ["BrandAIProductsParams", "ByDomain", "ByDirectURL"]
+__all__ = ["AIExtractProductsParams", "ByDomain", "ByDirectURL"]
class ByDomain(TypedDict, total=False):
@@ -41,4 +41,4 @@ class ByDirectURL(TypedDict, total=False):
"""
-BrandAIProductsParams: TypeAlias = Union[ByDomain, ByDirectURL]
+AIExtractProductsParams: TypeAlias = Union[ByDomain, ByDirectURL]
diff --git a/src/context/dev/types/brand_ai_products_response.py b/src/context/dev/types/ai_extract_products_response.py
similarity index 93%
rename from src/context/dev/types/brand_ai_products_response.py
rename to src/context/dev/types/ai_extract_products_response.py
index 4100a1a..5cb7f2f 100644
--- a/src/context/dev/types/brand_ai_products_response.py
+++ b/src/context/dev/types/ai_extract_products_response.py
@@ -5,7 +5,7 @@
from .._models import BaseModel
-__all__ = ["BrandAIProductsResponse", "Product"]
+__all__ = ["AIExtractProductsResponse", "Product"]
class Product(BaseModel):
@@ -49,6 +49,6 @@ class Product(BaseModel):
"""URL to the product page"""
-class BrandAIProductsResponse(BaseModel):
+class AIExtractProductsResponse(BaseModel):
products: Optional[List[Product]] = None
"""Array of products extracted from the website"""
diff --git a/src/context/dev/types/brand_retrieve_naics_params.py b/src/context/dev/types/industry_retrieve_naics_params.py
similarity index 91%
rename from src/context/dev/types/brand_retrieve_naics_params.py
rename to src/context/dev/types/industry_retrieve_naics_params.py
index 2803c13..cbaed87 100644
--- a/src/context/dev/types/brand_retrieve_naics_params.py
+++ b/src/context/dev/types/industry_retrieve_naics_params.py
@@ -6,10 +6,10 @@
from .._utils import PropertyInfo
-__all__ = ["BrandRetrieveNaicsParams"]
+__all__ = ["IndustryRetrieveNaicsParams"]
-class BrandRetrieveNaicsParams(TypedDict, total=False):
+class IndustryRetrieveNaicsParams(TypedDict, total=False):
input: Required[str]
"""Brand domain or title to retrieve NAICS code for.
diff --git a/src/context/dev/types/brand_retrieve_naics_response.py b/src/context/dev/types/industry_retrieve_naics_response.py
similarity index 88%
rename from src/context/dev/types/brand_retrieve_naics_response.py
rename to src/context/dev/types/industry_retrieve_naics_response.py
index a53da5e..bcfc2ad 100644
--- a/src/context/dev/types/brand_retrieve_naics_response.py
+++ b/src/context/dev/types/industry_retrieve_naics_response.py
@@ -5,7 +5,7 @@
from .._models import BaseModel
-__all__ = ["BrandRetrieveNaicsResponse", "Code"]
+__all__ = ["IndustryRetrieveNaicsResponse", "Code"]
class Code(BaseModel):
@@ -19,7 +19,7 @@ class Code(BaseModel):
"""NAICS title"""
-class BrandRetrieveNaicsResponse(BaseModel):
+class IndustryRetrieveNaicsResponse(BaseModel):
codes: Optional[List[Code]] = None
"""Array of NAICS codes and titles."""
diff --git a/src/context/dev/types/brand_fonts_params.py b/src/context/dev/types/style_extract_fonts_params.py
similarity index 87%
rename from src/context/dev/types/brand_fonts_params.py
rename to src/context/dev/types/style_extract_fonts_params.py
index db13d2f..178f6f3 100644
--- a/src/context/dev/types/brand_fonts_params.py
+++ b/src/context/dev/types/style_extract_fonts_params.py
@@ -6,10 +6,10 @@
from .._utils import PropertyInfo
-__all__ = ["BrandFontsParams"]
+__all__ = ["StyleExtractFontsParams"]
-class BrandFontsParams(TypedDict, total=False):
+class StyleExtractFontsParams(TypedDict, total=False):
domain: Required[str]
"""Domain name to extract fonts from (e.g., 'example.com', 'google.com').
diff --git a/src/context/dev/types/brand_fonts_response.py b/src/context/dev/types/style_extract_fonts_response.py
similarity index 90%
rename from src/context/dev/types/brand_fonts_response.py
rename to src/context/dev/types/style_extract_fonts_response.py
index 2721af9..ab00e10 100644
--- a/src/context/dev/types/brand_fonts_response.py
+++ b/src/context/dev/types/style_extract_fonts_response.py
@@ -4,7 +4,7 @@
from .._models import BaseModel
-__all__ = ["BrandFontsResponse", "Font"]
+__all__ = ["StyleExtractFontsResponse", "Font"]
class Font(BaseModel):
@@ -30,7 +30,7 @@ class Font(BaseModel):
"""Array of CSS selectors or element types where this font is used"""
-class BrandFontsResponse(BaseModel):
+class StyleExtractFontsResponse(BaseModel):
code: int
"""HTTP status code, e.g., 200"""
diff --git a/src/context/dev/types/brand_styleguide_params.py b/src/context/dev/types/style_extract_styleguide_params.py
similarity index 92%
rename from src/context/dev/types/brand_styleguide_params.py
rename to src/context/dev/types/style_extract_styleguide_params.py
index e97cf77..c338cb6 100644
--- a/src/context/dev/types/brand_styleguide_params.py
+++ b/src/context/dev/types/style_extract_styleguide_params.py
@@ -6,10 +6,10 @@
from .._utils import PropertyInfo
-__all__ = ["BrandStyleguideParams"]
+__all__ = ["StyleExtractStyleguideParams"]
-class BrandStyleguideParams(TypedDict, total=False):
+class StyleExtractStyleguideParams(TypedDict, total=False):
direct_url: Annotated[str, PropertyInfo(alias="directUrl")]
"""
A specific URL to fetch the styleguide from directly, bypassing domain
diff --git a/src/context/dev/types/brand_styleguide_response.py b/src/context/dev/types/style_extract_styleguide_response.py
similarity index 99%
rename from src/context/dev/types/brand_styleguide_response.py
rename to src/context/dev/types/style_extract_styleguide_response.py
index 35b51b3..56ef048 100644
--- a/src/context/dev/types/brand_styleguide_response.py
+++ b/src/context/dev/types/style_extract_styleguide_response.py
@@ -8,7 +8,7 @@
from .._models import BaseModel
__all__ = [
- "BrandStyleguideResponse",
+ "StyleExtractStyleguideResponse",
"Styleguide",
"StyleguideColors",
"StyleguideComponents",
@@ -307,7 +307,7 @@ class Styleguide(BaseModel):
"""Typography styles used on the website"""
-class BrandStyleguideResponse(BaseModel):
+class StyleExtractStyleguideResponse(BaseModel):
code: Optional[int] = None
"""HTTP status code"""
diff --git a/src/context/dev/types/brand_prefetch_by_email_params.py b/src/context/dev/types/utility_prefetch_by_email_params.py
similarity index 87%
rename from src/context/dev/types/brand_prefetch_by_email_params.py
rename to src/context/dev/types/utility_prefetch_by_email_params.py
index ec7cc6f..b9a36a8 100644
--- a/src/context/dev/types/brand_prefetch_by_email_params.py
+++ b/src/context/dev/types/utility_prefetch_by_email_params.py
@@ -6,10 +6,10 @@
from .._utils import PropertyInfo
-__all__ = ["BrandPrefetchByEmailParams"]
+__all__ = ["UtilityPrefetchByEmailParams"]
-class BrandPrefetchByEmailParams(TypedDict, total=False):
+class UtilityPrefetchByEmailParams(TypedDict, total=False):
email: Required[str]
"""Email address to prefetch brand data for.
diff --git a/src/context/dev/types/brand_prefetch_by_email_response.py b/src/context/dev/types/utility_prefetch_by_email_response.py
similarity index 80%
rename from src/context/dev/types/brand_prefetch_by_email_response.py
rename to src/context/dev/types/utility_prefetch_by_email_response.py
index c117f7d..7061284 100644
--- a/src/context/dev/types/brand_prefetch_by_email_response.py
+++ b/src/context/dev/types/utility_prefetch_by_email_response.py
@@ -4,10 +4,10 @@
from .._models import BaseModel
-__all__ = ["BrandPrefetchByEmailResponse"]
+__all__ = ["UtilityPrefetchByEmailResponse"]
-class BrandPrefetchByEmailResponse(BaseModel):
+class UtilityPrefetchByEmailResponse(BaseModel):
domain: Optional[str] = None
"""The domain that was queued for prefetching"""
diff --git a/src/context/dev/types/brand_prefetch_params.py b/src/context/dev/types/utility_prefetch_params.py
similarity index 86%
rename from src/context/dev/types/brand_prefetch_params.py
rename to src/context/dev/types/utility_prefetch_params.py
index 02c13f6..51993af 100644
--- a/src/context/dev/types/brand_prefetch_params.py
+++ b/src/context/dev/types/utility_prefetch_params.py
@@ -6,10 +6,10 @@
from .._utils import PropertyInfo
-__all__ = ["BrandPrefetchParams"]
+__all__ = ["UtilityPrefetchParams"]
-class BrandPrefetchParams(TypedDict, total=False):
+class UtilityPrefetchParams(TypedDict, total=False):
domain: Required[str]
"""Domain name to prefetch brand data for"""
diff --git a/src/context/dev/types/brand_prefetch_response.py b/src/context/dev/types/utility_prefetch_response.py
similarity index 82%
rename from src/context/dev/types/brand_prefetch_response.py
rename to src/context/dev/types/utility_prefetch_response.py
index 4995856..b99a78d 100644
--- a/src/context/dev/types/brand_prefetch_response.py
+++ b/src/context/dev/types/utility_prefetch_response.py
@@ -4,10 +4,10 @@
from .._models import BaseModel
-__all__ = ["BrandPrefetchResponse"]
+__all__ = ["UtilityPrefetchResponse"]
-class BrandPrefetchResponse(BaseModel):
+class UtilityPrefetchResponse(BaseModel):
domain: Optional[str] = None
"""The domain that was queued for prefetching"""
diff --git a/src/context/dev/types/brand_screenshot_params.py b/src/context/dev/types/web_screenshot_params.py
similarity index 94%
rename from src/context/dev/types/brand_screenshot_params.py
rename to src/context/dev/types/web_screenshot_params.py
index 4f26b1f..000ff23 100644
--- a/src/context/dev/types/brand_screenshot_params.py
+++ b/src/context/dev/types/web_screenshot_params.py
@@ -6,10 +6,10 @@
from .._utils import PropertyInfo
-__all__ = ["BrandScreenshotParams"]
+__all__ = ["WebScreenshotParams"]
-class BrandScreenshotParams(TypedDict, total=False):
+class WebScreenshotParams(TypedDict, total=False):
domain: Required[str]
"""Domain name to take screenshot of (e.g., 'example.com', 'google.com').
diff --git a/src/context/dev/types/brand_screenshot_response.py b/src/context/dev/types/web_screenshot_response.py
similarity index 89%
rename from src/context/dev/types/brand_screenshot_response.py
rename to src/context/dev/types/web_screenshot_response.py
index c43ae74..e81a5b2 100644
--- a/src/context/dev/types/brand_screenshot_response.py
+++ b/src/context/dev/types/web_screenshot_response.py
@@ -7,10 +7,10 @@
from .._models import BaseModel
-__all__ = ["BrandScreenshotResponse"]
+__all__ = ["WebScreenshotResponse"]
-class BrandScreenshotResponse(BaseModel):
+class WebScreenshotResponse(BaseModel):
code: Optional[int] = None
"""HTTP status code"""
diff --git a/tests/api_resources/test_ai.py b/tests/api_resources/test_ai.py
new file mode 100644
index 0000000..8dd7e51
--- /dev/null
+++ b/tests/api_resources/test_ai.py
@@ -0,0 +1,472 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+import os
+from typing import Any, cast
+
+import pytest
+
+from context.dev import ContextDev, AsyncContextDev
+from tests.utils import assert_matches_type
+from context.dev.types import (
+ AIAIQueryResponse,
+ AIExtractProductResponse,
+ AIExtractProductsResponse,
+)
+
+base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
+
+
+class TestAI:
+ parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_ai_query(self, client: ContextDev) -> None:
+ ai = client.ai.ai_query(
+ data_to_extract=[
+ {
+ "datapoint_description": "datapoint_description",
+ "datapoint_example": "datapoint_example",
+ "datapoint_name": "datapoint_name",
+ "datapoint_type": "text",
+ }
+ ],
+ domain="domain",
+ )
+ assert_matches_type(AIAIQueryResponse, ai, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_ai_query_with_all_params(self, client: ContextDev) -> None:
+ ai = client.ai.ai_query(
+ data_to_extract=[
+ {
+ "datapoint_description": "datapoint_description",
+ "datapoint_example": "datapoint_example",
+ "datapoint_name": "datapoint_name",
+ "datapoint_type": "text",
+ "datapoint_list_type": "string",
+ "datapoint_object_schema": {
+ "testimonial_text": "string",
+ "testimonial_author": "string",
+ },
+ }
+ ],
+ domain="domain",
+ specific_pages={
+ "about_us": True,
+ "blog": True,
+ "careers": True,
+ "contact_us": True,
+ "faq": True,
+ "home_page": True,
+ "pricing": True,
+ "privacy_policy": True,
+ "terms_and_conditions": True,
+ },
+ timeout_ms=1000,
+ )
+ assert_matches_type(AIAIQueryResponse, ai, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_ai_query(self, client: ContextDev) -> None:
+ response = client.ai.with_raw_response.ai_query(
+ data_to_extract=[
+ {
+ "datapoint_description": "datapoint_description",
+ "datapoint_example": "datapoint_example",
+ "datapoint_name": "datapoint_name",
+ "datapoint_type": "text",
+ }
+ ],
+ domain="domain",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ ai = response.parse()
+ assert_matches_type(AIAIQueryResponse, ai, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_ai_query(self, client: ContextDev) -> None:
+ with client.ai.with_streaming_response.ai_query(
+ data_to_extract=[
+ {
+ "datapoint_description": "datapoint_description",
+ "datapoint_example": "datapoint_example",
+ "datapoint_name": "datapoint_name",
+ "datapoint_type": "text",
+ }
+ ],
+ domain="domain",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ ai = response.parse()
+ assert_matches_type(AIAIQueryResponse, ai, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_extract_product(self, client: ContextDev) -> None:
+ ai = client.ai.extract_product(
+ url="https://example.com",
+ )
+ assert_matches_type(AIExtractProductResponse, ai, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_extract_product_with_all_params(self, client: ContextDev) -> None:
+ ai = client.ai.extract_product(
+ url="https://example.com",
+ timeout_ms=1000,
+ )
+ assert_matches_type(AIExtractProductResponse, ai, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_extract_product(self, client: ContextDev) -> None:
+ response = client.ai.with_raw_response.extract_product(
+ url="https://example.com",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ ai = response.parse()
+ assert_matches_type(AIExtractProductResponse, ai, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_extract_product(self, client: ContextDev) -> None:
+ with client.ai.with_streaming_response.extract_product(
+ url="https://example.com",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ ai = response.parse()
+ assert_matches_type(AIExtractProductResponse, ai, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_extract_products_overload_1(self, client: ContextDev) -> None:
+ ai = client.ai.extract_products(
+ domain="domain",
+ )
+ assert_matches_type(AIExtractProductsResponse, ai, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_extract_products_with_all_params_overload_1(self, client: ContextDev) -> None:
+ ai = client.ai.extract_products(
+ domain="domain",
+ max_products=1,
+ timeout_ms=1000,
+ )
+ assert_matches_type(AIExtractProductsResponse, ai, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_extract_products_overload_1(self, client: ContextDev) -> None:
+ response = client.ai.with_raw_response.extract_products(
+ domain="domain",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ ai = response.parse()
+ assert_matches_type(AIExtractProductsResponse, ai, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_extract_products_overload_1(self, client: ContextDev) -> None:
+ with client.ai.with_streaming_response.extract_products(
+ domain="domain",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ ai = response.parse()
+ assert_matches_type(AIExtractProductsResponse, ai, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_extract_products_overload_2(self, client: ContextDev) -> None:
+ ai = client.ai.extract_products(
+ direct_url="https://example.com",
+ )
+ assert_matches_type(AIExtractProductsResponse, ai, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_extract_products_with_all_params_overload_2(self, client: ContextDev) -> None:
+ ai = client.ai.extract_products(
+ direct_url="https://example.com",
+ max_products=1,
+ timeout_ms=1000,
+ )
+ assert_matches_type(AIExtractProductsResponse, ai, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_extract_products_overload_2(self, client: ContextDev) -> None:
+ response = client.ai.with_raw_response.extract_products(
+ direct_url="https://example.com",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ ai = response.parse()
+ assert_matches_type(AIExtractProductsResponse, ai, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_extract_products_overload_2(self, client: ContextDev) -> None:
+ with client.ai.with_streaming_response.extract_products(
+ direct_url="https://example.com",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ ai = response.parse()
+ assert_matches_type(AIExtractProductsResponse, ai, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+
+class TestAsyncAI:
+ parametrize = pytest.mark.parametrize(
+ "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_ai_query(self, async_client: AsyncContextDev) -> None:
+ ai = await async_client.ai.ai_query(
+ data_to_extract=[
+ {
+ "datapoint_description": "datapoint_description",
+ "datapoint_example": "datapoint_example",
+ "datapoint_name": "datapoint_name",
+ "datapoint_type": "text",
+ }
+ ],
+ domain="domain",
+ )
+ assert_matches_type(AIAIQueryResponse, ai, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_ai_query_with_all_params(self, async_client: AsyncContextDev) -> None:
+ ai = await async_client.ai.ai_query(
+ data_to_extract=[
+ {
+ "datapoint_description": "datapoint_description",
+ "datapoint_example": "datapoint_example",
+ "datapoint_name": "datapoint_name",
+ "datapoint_type": "text",
+ "datapoint_list_type": "string",
+ "datapoint_object_schema": {
+ "testimonial_text": "string",
+ "testimonial_author": "string",
+ },
+ }
+ ],
+ domain="domain",
+ specific_pages={
+ "about_us": True,
+ "blog": True,
+ "careers": True,
+ "contact_us": True,
+ "faq": True,
+ "home_page": True,
+ "pricing": True,
+ "privacy_policy": True,
+ "terms_and_conditions": True,
+ },
+ timeout_ms=1000,
+ )
+ assert_matches_type(AIAIQueryResponse, ai, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_ai_query(self, async_client: AsyncContextDev) -> None:
+ response = await async_client.ai.with_raw_response.ai_query(
+ data_to_extract=[
+ {
+ "datapoint_description": "datapoint_description",
+ "datapoint_example": "datapoint_example",
+ "datapoint_name": "datapoint_name",
+ "datapoint_type": "text",
+ }
+ ],
+ domain="domain",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ ai = await response.parse()
+ assert_matches_type(AIAIQueryResponse, ai, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_ai_query(self, async_client: AsyncContextDev) -> None:
+ async with async_client.ai.with_streaming_response.ai_query(
+ data_to_extract=[
+ {
+ "datapoint_description": "datapoint_description",
+ "datapoint_example": "datapoint_example",
+ "datapoint_name": "datapoint_name",
+ "datapoint_type": "text",
+ }
+ ],
+ domain="domain",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ ai = await response.parse()
+ assert_matches_type(AIAIQueryResponse, ai, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_extract_product(self, async_client: AsyncContextDev) -> None:
+ ai = await async_client.ai.extract_product(
+ url="https://example.com",
+ )
+ assert_matches_type(AIExtractProductResponse, ai, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_extract_product_with_all_params(self, async_client: AsyncContextDev) -> None:
+ ai = await async_client.ai.extract_product(
+ url="https://example.com",
+ timeout_ms=1000,
+ )
+ assert_matches_type(AIExtractProductResponse, ai, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_extract_product(self, async_client: AsyncContextDev) -> None:
+ response = await async_client.ai.with_raw_response.extract_product(
+ url="https://example.com",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ ai = await response.parse()
+ assert_matches_type(AIExtractProductResponse, ai, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_extract_product(self, async_client: AsyncContextDev) -> None:
+ async with async_client.ai.with_streaming_response.extract_product(
+ url="https://example.com",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ ai = await response.parse()
+ assert_matches_type(AIExtractProductResponse, ai, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_extract_products_overload_1(self, async_client: AsyncContextDev) -> None:
+ ai = await async_client.ai.extract_products(
+ domain="domain",
+ )
+ assert_matches_type(AIExtractProductsResponse, ai, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_extract_products_with_all_params_overload_1(self, async_client: AsyncContextDev) -> None:
+ ai = await async_client.ai.extract_products(
+ domain="domain",
+ max_products=1,
+ timeout_ms=1000,
+ )
+ assert_matches_type(AIExtractProductsResponse, ai, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_extract_products_overload_1(self, async_client: AsyncContextDev) -> None:
+ response = await async_client.ai.with_raw_response.extract_products(
+ domain="domain",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ ai = await response.parse()
+ assert_matches_type(AIExtractProductsResponse, ai, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_extract_products_overload_1(self, async_client: AsyncContextDev) -> None:
+ async with async_client.ai.with_streaming_response.extract_products(
+ domain="domain",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ ai = await response.parse()
+ assert_matches_type(AIExtractProductsResponse, ai, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_extract_products_overload_2(self, async_client: AsyncContextDev) -> None:
+ ai = await async_client.ai.extract_products(
+ direct_url="https://example.com",
+ )
+ assert_matches_type(AIExtractProductsResponse, ai, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_extract_products_with_all_params_overload_2(self, async_client: AsyncContextDev) -> None:
+ ai = await async_client.ai.extract_products(
+ direct_url="https://example.com",
+ max_products=1,
+ timeout_ms=1000,
+ )
+ assert_matches_type(AIExtractProductsResponse, ai, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_extract_products_overload_2(self, async_client: AsyncContextDev) -> None:
+ response = await async_client.ai.with_raw_response.extract_products(
+ direct_url="https://example.com",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ ai = await response.parse()
+ assert_matches_type(AIExtractProductsResponse, ai, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_extract_products_overload_2(self, async_client: AsyncContextDev) -> None:
+ async with async_client.ai.with_streaming_response.extract_products(
+ direct_url="https://example.com",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ ai = await response.parse()
+ assert_matches_type(AIExtractProductsResponse, ai, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
diff --git a/tests/api_resources/test_brand.py b/tests/api_resources/test_brand.py
index 34ee5d3..f02f01e 100644
--- a/tests/api_resources/test_brand.py
+++ b/tests/api_resources/test_brand.py
@@ -10,18 +10,9 @@
from context.dev import ContextDev, AsyncContextDev
from tests.utils import assert_matches_type
from context.dev.types import (
- BrandFontsResponse,
- BrandAIQueryResponse,
- BrandPrefetchResponse,
BrandRetrieveResponse,
- BrandAIProductResponse,
- BrandAIProductsResponse,
- BrandScreenshotResponse,
- BrandStyleguideResponse,
- BrandRetrieveNaicsResponse,
BrandRetrieveByIsinResponse,
BrandRetrieveByNameResponse,
- BrandPrefetchByEmailResponse,
BrandRetrieveByEmailResponse,
BrandRetrieveByTickerResponse,
BrandRetrieveSimplifiedResponse,
@@ -79,271 +70,6 @@ def test_streaming_response_retrieve(self, client: ContextDev) -> None:
assert cast(Any, response.is_closed) is True
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_ai_product(self, client: ContextDev) -> None:
- brand = client.brand.ai_product(
- url="https://example.com",
- )
- assert_matches_type(BrandAIProductResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_ai_product_with_all_params(self, client: ContextDev) -> None:
- brand = client.brand.ai_product(
- url="https://example.com",
- timeout_ms=1000,
- )
- assert_matches_type(BrandAIProductResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_ai_product(self, client: ContextDev) -> None:
- response = client.brand.with_raw_response.ai_product(
- url="https://example.com",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = response.parse()
- assert_matches_type(BrandAIProductResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_ai_product(self, client: ContextDev) -> None:
- with client.brand.with_streaming_response.ai_product(
- url="https://example.com",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = response.parse()
- assert_matches_type(BrandAIProductResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_ai_products_overload_1(self, client: ContextDev) -> None:
- brand = client.brand.ai_products(
- domain="domain",
- )
- assert_matches_type(BrandAIProductsResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_ai_products_with_all_params_overload_1(self, client: ContextDev) -> None:
- brand = client.brand.ai_products(
- domain="domain",
- max_products=1,
- timeout_ms=1000,
- )
- assert_matches_type(BrandAIProductsResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_ai_products_overload_1(self, client: ContextDev) -> None:
- response = client.brand.with_raw_response.ai_products(
- domain="domain",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = response.parse()
- assert_matches_type(BrandAIProductsResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_ai_products_overload_1(self, client: ContextDev) -> None:
- with client.brand.with_streaming_response.ai_products(
- domain="domain",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = response.parse()
- assert_matches_type(BrandAIProductsResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_ai_products_overload_2(self, client: ContextDev) -> None:
- brand = client.brand.ai_products(
- direct_url="https://example.com",
- )
- assert_matches_type(BrandAIProductsResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_ai_products_with_all_params_overload_2(self, client: ContextDev) -> None:
- brand = client.brand.ai_products(
- direct_url="https://example.com",
- max_products=1,
- timeout_ms=1000,
- )
- assert_matches_type(BrandAIProductsResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_ai_products_overload_2(self, client: ContextDev) -> None:
- response = client.brand.with_raw_response.ai_products(
- direct_url="https://example.com",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = response.parse()
- assert_matches_type(BrandAIProductsResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_ai_products_overload_2(self, client: ContextDev) -> None:
- with client.brand.with_streaming_response.ai_products(
- direct_url="https://example.com",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = response.parse()
- assert_matches_type(BrandAIProductsResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_ai_query(self, client: ContextDev) -> None:
- brand = client.brand.ai_query(
- data_to_extract=[
- {
- "datapoint_description": "datapoint_description",
- "datapoint_example": "datapoint_example",
- "datapoint_name": "datapoint_name",
- "datapoint_type": "text",
- }
- ],
- domain="domain",
- )
- assert_matches_type(BrandAIQueryResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_ai_query_with_all_params(self, client: ContextDev) -> None:
- brand = client.brand.ai_query(
- data_to_extract=[
- {
- "datapoint_description": "datapoint_description",
- "datapoint_example": "datapoint_example",
- "datapoint_name": "datapoint_name",
- "datapoint_type": "text",
- "datapoint_list_type": "string",
- "datapoint_object_schema": {
- "testimonial_text": "string",
- "testimonial_author": "string",
- },
- }
- ],
- domain="domain",
- specific_pages={
- "about_us": True,
- "blog": True,
- "careers": True,
- "contact_us": True,
- "faq": True,
- "home_page": True,
- "pricing": True,
- "privacy_policy": True,
- "terms_and_conditions": True,
- },
- timeout_ms=1000,
- )
- assert_matches_type(BrandAIQueryResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_ai_query(self, client: ContextDev) -> None:
- response = client.brand.with_raw_response.ai_query(
- data_to_extract=[
- {
- "datapoint_description": "datapoint_description",
- "datapoint_example": "datapoint_example",
- "datapoint_name": "datapoint_name",
- "datapoint_type": "text",
- }
- ],
- domain="domain",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = response.parse()
- assert_matches_type(BrandAIQueryResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_ai_query(self, client: ContextDev) -> None:
- with client.brand.with_streaming_response.ai_query(
- data_to_extract=[
- {
- "datapoint_description": "datapoint_description",
- "datapoint_example": "datapoint_example",
- "datapoint_name": "datapoint_name",
- "datapoint_type": "text",
- }
- ],
- domain="domain",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = response.parse()
- assert_matches_type(BrandAIQueryResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_fonts(self, client: ContextDev) -> None:
- brand = client.brand.fonts(
- domain="domain",
- )
- assert_matches_type(BrandFontsResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_fonts_with_all_params(self, client: ContextDev) -> None:
- brand = client.brand.fonts(
- domain="domain",
- timeout_ms=1000,
- )
- assert_matches_type(BrandFontsResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_fonts(self, client: ContextDev) -> None:
- response = client.brand.with_raw_response.fonts(
- domain="domain",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = response.parse()
- assert_matches_type(BrandFontsResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_fonts(self, client: ContextDev) -> None:
- with client.brand.with_streaming_response.fonts(
- domain="domain",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = response.parse()
- assert_matches_type(BrandFontsResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
def test_method_identify_from_transaction(self, client: ContextDev) -> None:
@@ -394,92 +120,6 @@ def test_streaming_response_identify_from_transaction(self, client: ContextDev)
assert cast(Any, response.is_closed) is True
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_prefetch(self, client: ContextDev) -> None:
- brand = client.brand.prefetch(
- domain="domain",
- )
- assert_matches_type(BrandPrefetchResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_prefetch_with_all_params(self, client: ContextDev) -> None:
- brand = client.brand.prefetch(
- domain="domain",
- timeout_ms=1000,
- )
- assert_matches_type(BrandPrefetchResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_prefetch(self, client: ContextDev) -> None:
- response = client.brand.with_raw_response.prefetch(
- domain="domain",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = response.parse()
- assert_matches_type(BrandPrefetchResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_prefetch(self, client: ContextDev) -> None:
- with client.brand.with_streaming_response.prefetch(
- domain="domain",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = response.parse()
- assert_matches_type(BrandPrefetchResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_prefetch_by_email(self, client: ContextDev) -> None:
- brand = client.brand.prefetch_by_email(
- email="dev@stainless.com",
- )
- assert_matches_type(BrandPrefetchByEmailResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_prefetch_by_email_with_all_params(self, client: ContextDev) -> None:
- brand = client.brand.prefetch_by_email(
- email="dev@stainless.com",
- timeout_ms=1000,
- )
- assert_matches_type(BrandPrefetchByEmailResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_prefetch_by_email(self, client: ContextDev) -> None:
- response = client.brand.with_raw_response.prefetch_by_email(
- email="dev@stainless.com",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = response.parse()
- assert_matches_type(BrandPrefetchByEmailResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_prefetch_by_email(self, client: ContextDev) -> None:
- with client.brand.with_streaming_response.prefetch_by_email(
- email="dev@stainless.com",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = response.parse()
- assert_matches_type(BrandPrefetchByEmailResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
def test_method_retrieve_by_email(self, client: ContextDev) -> None:
@@ -520,633 +160,239 @@ def test_streaming_response_retrieve_by_email(self, client: ContextDev) -> None:
assert not response.is_closed
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = response.parse()
- assert_matches_type(BrandRetrieveByEmailResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_retrieve_by_isin(self, client: ContextDev) -> None:
- brand = client.brand.retrieve_by_isin(
- isin="SE60513A9993",
- )
- assert_matches_type(BrandRetrieveByIsinResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_retrieve_by_isin_with_all_params(self, client: ContextDev) -> None:
- brand = client.brand.retrieve_by_isin(
- isin="SE60513A9993",
- force_language="albanian",
- max_speed=True,
- timeout_ms=1000,
- )
- assert_matches_type(BrandRetrieveByIsinResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_retrieve_by_isin(self, client: ContextDev) -> None:
- response = client.brand.with_raw_response.retrieve_by_isin(
- isin="SE60513A9993",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = response.parse()
- assert_matches_type(BrandRetrieveByIsinResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_retrieve_by_isin(self, client: ContextDev) -> None:
- with client.brand.with_streaming_response.retrieve_by_isin(
- isin="SE60513A9993",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = response.parse()
- assert_matches_type(BrandRetrieveByIsinResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_retrieve_by_name(self, client: ContextDev) -> None:
- brand = client.brand.retrieve_by_name(
- name="xxx",
- )
- assert_matches_type(BrandRetrieveByNameResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_retrieve_by_name_with_all_params(self, client: ContextDev) -> None:
- brand = client.brand.retrieve_by_name(
- name="xxx",
- country_gl="ad",
- force_language="albanian",
- max_speed=True,
- timeout_ms=1000,
- )
- assert_matches_type(BrandRetrieveByNameResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_retrieve_by_name(self, client: ContextDev) -> None:
- response = client.brand.with_raw_response.retrieve_by_name(
- name="xxx",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = response.parse()
- assert_matches_type(BrandRetrieveByNameResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_retrieve_by_name(self, client: ContextDev) -> None:
- with client.brand.with_streaming_response.retrieve_by_name(
- name="xxx",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = response.parse()
- assert_matches_type(BrandRetrieveByNameResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_retrieve_by_ticker(self, client: ContextDev) -> None:
- brand = client.brand.retrieve_by_ticker(
- ticker="ticker",
- )
- assert_matches_type(BrandRetrieveByTickerResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_retrieve_by_ticker_with_all_params(self, client: ContextDev) -> None:
- brand = client.brand.retrieve_by_ticker(
- ticker="ticker",
- force_language="albanian",
- max_speed=True,
- ticker_exchange="AMEX",
- timeout_ms=1000,
- )
- assert_matches_type(BrandRetrieveByTickerResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_retrieve_by_ticker(self, client: ContextDev) -> None:
- response = client.brand.with_raw_response.retrieve_by_ticker(
- ticker="ticker",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = response.parse()
- assert_matches_type(BrandRetrieveByTickerResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_retrieve_by_ticker(self, client: ContextDev) -> None:
- with client.brand.with_streaming_response.retrieve_by_ticker(
- ticker="ticker",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = response.parse()
- assert_matches_type(BrandRetrieveByTickerResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_retrieve_naics(self, client: ContextDev) -> None:
- brand = client.brand.retrieve_naics(
- input="input",
- )
- assert_matches_type(BrandRetrieveNaicsResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_retrieve_naics_with_all_params(self, client: ContextDev) -> None:
- brand = client.brand.retrieve_naics(
- input="input",
- max_results=1,
- min_results=1,
- timeout_ms=1000,
- )
- assert_matches_type(BrandRetrieveNaicsResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_retrieve_naics(self, client: ContextDev) -> None:
- response = client.brand.with_raw_response.retrieve_naics(
- input="input",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = response.parse()
- assert_matches_type(BrandRetrieveNaicsResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_retrieve_naics(self, client: ContextDev) -> None:
- with client.brand.with_streaming_response.retrieve_naics(
- input="input",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = response.parse()
- assert_matches_type(BrandRetrieveNaicsResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_retrieve_simplified(self, client: ContextDev) -> None:
- brand = client.brand.retrieve_simplified(
- domain="domain",
- )
- assert_matches_type(BrandRetrieveSimplifiedResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_retrieve_simplified_with_all_params(self, client: ContextDev) -> None:
- brand = client.brand.retrieve_simplified(
- domain="domain",
- timeout_ms=1000,
- )
- assert_matches_type(BrandRetrieveSimplifiedResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_retrieve_simplified(self, client: ContextDev) -> None:
- response = client.brand.with_raw_response.retrieve_simplified(
- domain="domain",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = response.parse()
- assert_matches_type(BrandRetrieveSimplifiedResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_retrieve_simplified(self, client: ContextDev) -> None:
- with client.brand.with_streaming_response.retrieve_simplified(
- domain="domain",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = response.parse()
- assert_matches_type(BrandRetrieveSimplifiedResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_screenshot(self, client: ContextDev) -> None:
- brand = client.brand.screenshot(
- domain="domain",
- )
- assert_matches_type(BrandScreenshotResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_screenshot_with_all_params(self, client: ContextDev) -> None:
- brand = client.brand.screenshot(
- domain="domain",
- full_screenshot="true",
- page="login",
- prioritize="speed",
- )
- assert_matches_type(BrandScreenshotResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_screenshot(self, client: ContextDev) -> None:
- response = client.brand.with_raw_response.screenshot(
- domain="domain",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = response.parse()
- assert_matches_type(BrandScreenshotResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_screenshot(self, client: ContextDev) -> None:
- with client.brand.with_streaming_response.screenshot(
- domain="domain",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = response.parse()
- assert_matches_type(BrandScreenshotResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_styleguide(self, client: ContextDev) -> None:
- brand = client.brand.styleguide()
- assert_matches_type(BrandStyleguideResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_method_styleguide_with_all_params(self, client: ContextDev) -> None:
- brand = client.brand.styleguide(
- direct_url="https://example.com",
- domain="domain",
- prioritize="speed",
- timeout_ms=1000,
- )
- assert_matches_type(BrandStyleguideResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_raw_response_styleguide(self, client: ContextDev) -> None:
- response = client.brand.with_raw_response.styleguide()
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = response.parse()
- assert_matches_type(BrandStyleguideResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- def test_streaming_response_styleguide(self, client: ContextDev) -> None:
- with client.brand.with_streaming_response.styleguide() as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = response.parse()
- assert_matches_type(BrandStyleguideResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
-
-class TestAsyncBrand:
- parametrize = pytest.mark.parametrize(
- "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
- )
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_retrieve(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.retrieve(
- domain="domain",
- )
- assert_matches_type(BrandRetrieveResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_retrieve_with_all_params(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.retrieve(
- domain="domain",
- force_language="albanian",
- max_speed=True,
- timeout_ms=1000,
- )
- assert_matches_type(BrandRetrieveResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_retrieve(self, async_client: AsyncContextDev) -> None:
- response = await async_client.brand.with_raw_response.retrieve(
- domain="domain",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = await response.parse()
- assert_matches_type(BrandRetrieveResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_retrieve(self, async_client: AsyncContextDev) -> None:
- async with async_client.brand.with_streaming_response.retrieve(
- domain="domain",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = await response.parse()
- assert_matches_type(BrandRetrieveResponse, brand, path=["response"])
+ brand = response.parse()
+ assert_matches_type(BrandRetrieveByEmailResponse, brand, path=["response"])
assert cast(Any, response.is_closed) is True
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_method_ai_product(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.ai_product(
- url="https://example.com",
+ def test_method_retrieve_by_isin(self, client: ContextDev) -> None:
+ brand = client.brand.retrieve_by_isin(
+ isin="SE60513A9993",
)
- assert_matches_type(BrandAIProductResponse, brand, path=["response"])
+ assert_matches_type(BrandRetrieveByIsinResponse, brand, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_method_ai_product_with_all_params(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.ai_product(
- url="https://example.com",
+ def test_method_retrieve_by_isin_with_all_params(self, client: ContextDev) -> None:
+ brand = client.brand.retrieve_by_isin(
+ isin="SE60513A9993",
+ force_language="albanian",
+ max_speed=True,
timeout_ms=1000,
)
- assert_matches_type(BrandAIProductResponse, brand, path=["response"])
+ assert_matches_type(BrandRetrieveByIsinResponse, brand, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_raw_response_ai_product(self, async_client: AsyncContextDev) -> None:
- response = await async_client.brand.with_raw_response.ai_product(
- url="https://example.com",
+ def test_raw_response_retrieve_by_isin(self, client: ContextDev) -> None:
+ response = client.brand.with_raw_response.retrieve_by_isin(
+ isin="SE60513A9993",
)
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = await response.parse()
- assert_matches_type(BrandAIProductResponse, brand, path=["response"])
+ brand = response.parse()
+ assert_matches_type(BrandRetrieveByIsinResponse, brand, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_streaming_response_ai_product(self, async_client: AsyncContextDev) -> None:
- async with async_client.brand.with_streaming_response.ai_product(
- url="https://example.com",
+ def test_streaming_response_retrieve_by_isin(self, client: ContextDev) -> None:
+ with client.brand.with_streaming_response.retrieve_by_isin(
+ isin="SE60513A9993",
) as response:
assert not response.is_closed
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = await response.parse()
- assert_matches_type(BrandAIProductResponse, brand, path=["response"])
+ brand = response.parse()
+ assert_matches_type(BrandRetrieveByIsinResponse, brand, path=["response"])
assert cast(Any, response.is_closed) is True
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_method_ai_products_overload_1(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.ai_products(
- domain="domain",
+ def test_method_retrieve_by_name(self, client: ContextDev) -> None:
+ brand = client.brand.retrieve_by_name(
+ name="xxx",
)
- assert_matches_type(BrandAIProductsResponse, brand, path=["response"])
+ assert_matches_type(BrandRetrieveByNameResponse, brand, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_method_ai_products_with_all_params_overload_1(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.ai_products(
- domain="domain",
- max_products=1,
+ def test_method_retrieve_by_name_with_all_params(self, client: ContextDev) -> None:
+ brand = client.brand.retrieve_by_name(
+ name="xxx",
+ country_gl="ad",
+ force_language="albanian",
+ max_speed=True,
timeout_ms=1000,
)
- assert_matches_type(BrandAIProductsResponse, brand, path=["response"])
+ assert_matches_type(BrandRetrieveByNameResponse, brand, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_raw_response_ai_products_overload_1(self, async_client: AsyncContextDev) -> None:
- response = await async_client.brand.with_raw_response.ai_products(
- domain="domain",
+ def test_raw_response_retrieve_by_name(self, client: ContextDev) -> None:
+ response = client.brand.with_raw_response.retrieve_by_name(
+ name="xxx",
)
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = await response.parse()
- assert_matches_type(BrandAIProductsResponse, brand, path=["response"])
+ brand = response.parse()
+ assert_matches_type(BrandRetrieveByNameResponse, brand, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_streaming_response_ai_products_overload_1(self, async_client: AsyncContextDev) -> None:
- async with async_client.brand.with_streaming_response.ai_products(
- domain="domain",
+ def test_streaming_response_retrieve_by_name(self, client: ContextDev) -> None:
+ with client.brand.with_streaming_response.retrieve_by_name(
+ name="xxx",
) as response:
assert not response.is_closed
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = await response.parse()
- assert_matches_type(BrandAIProductsResponse, brand, path=["response"])
+ brand = response.parse()
+ assert_matches_type(BrandRetrieveByNameResponse, brand, path=["response"])
assert cast(Any, response.is_closed) is True
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_method_ai_products_overload_2(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.ai_products(
- direct_url="https://example.com",
+ def test_method_retrieve_by_ticker(self, client: ContextDev) -> None:
+ brand = client.brand.retrieve_by_ticker(
+ ticker="ticker",
)
- assert_matches_type(BrandAIProductsResponse, brand, path=["response"])
+ assert_matches_type(BrandRetrieveByTickerResponse, brand, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_method_ai_products_with_all_params_overload_2(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.ai_products(
- direct_url="https://example.com",
- max_products=1,
+ def test_method_retrieve_by_ticker_with_all_params(self, client: ContextDev) -> None:
+ brand = client.brand.retrieve_by_ticker(
+ ticker="ticker",
+ force_language="albanian",
+ max_speed=True,
+ ticker_exchange="AMEX",
timeout_ms=1000,
)
- assert_matches_type(BrandAIProductsResponse, brand, path=["response"])
+ assert_matches_type(BrandRetrieveByTickerResponse, brand, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_raw_response_ai_products_overload_2(self, async_client: AsyncContextDev) -> None:
- response = await async_client.brand.with_raw_response.ai_products(
- direct_url="https://example.com",
+ def test_raw_response_retrieve_by_ticker(self, client: ContextDev) -> None:
+ response = client.brand.with_raw_response.retrieve_by_ticker(
+ ticker="ticker",
)
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = await response.parse()
- assert_matches_type(BrandAIProductsResponse, brand, path=["response"])
+ brand = response.parse()
+ assert_matches_type(BrandRetrieveByTickerResponse, brand, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_streaming_response_ai_products_overload_2(self, async_client: AsyncContextDev) -> None:
- async with async_client.brand.with_streaming_response.ai_products(
- direct_url="https://example.com",
+ def test_streaming_response_retrieve_by_ticker(self, client: ContextDev) -> None:
+ with client.brand.with_streaming_response.retrieve_by_ticker(
+ ticker="ticker",
) as response:
assert not response.is_closed
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = await response.parse()
- assert_matches_type(BrandAIProductsResponse, brand, path=["response"])
+ brand = response.parse()
+ assert_matches_type(BrandRetrieveByTickerResponse, brand, path=["response"])
assert cast(Any, response.is_closed) is True
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_method_ai_query(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.ai_query(
- data_to_extract=[
- {
- "datapoint_description": "datapoint_description",
- "datapoint_example": "datapoint_example",
- "datapoint_name": "datapoint_name",
- "datapoint_type": "text",
- }
- ],
+ def test_method_retrieve_simplified(self, client: ContextDev) -> None:
+ brand = client.brand.retrieve_simplified(
domain="domain",
)
- assert_matches_type(BrandAIQueryResponse, brand, path=["response"])
+ assert_matches_type(BrandRetrieveSimplifiedResponse, brand, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_method_ai_query_with_all_params(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.ai_query(
- data_to_extract=[
- {
- "datapoint_description": "datapoint_description",
- "datapoint_example": "datapoint_example",
- "datapoint_name": "datapoint_name",
- "datapoint_type": "text",
- "datapoint_list_type": "string",
- "datapoint_object_schema": {
- "testimonial_text": "string",
- "testimonial_author": "string",
- },
- }
- ],
+ def test_method_retrieve_simplified_with_all_params(self, client: ContextDev) -> None:
+ brand = client.brand.retrieve_simplified(
domain="domain",
- specific_pages={
- "about_us": True,
- "blog": True,
- "careers": True,
- "contact_us": True,
- "faq": True,
- "home_page": True,
- "pricing": True,
- "privacy_policy": True,
- "terms_and_conditions": True,
- },
timeout_ms=1000,
)
- assert_matches_type(BrandAIQueryResponse, brand, path=["response"])
+ assert_matches_type(BrandRetrieveSimplifiedResponse, brand, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_raw_response_ai_query(self, async_client: AsyncContextDev) -> None:
- response = await async_client.brand.with_raw_response.ai_query(
- data_to_extract=[
- {
- "datapoint_description": "datapoint_description",
- "datapoint_example": "datapoint_example",
- "datapoint_name": "datapoint_name",
- "datapoint_type": "text",
- }
- ],
+ def test_raw_response_retrieve_simplified(self, client: ContextDev) -> None:
+ response = client.brand.with_raw_response.retrieve_simplified(
domain="domain",
)
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = await response.parse()
- assert_matches_type(BrandAIQueryResponse, brand, path=["response"])
+ brand = response.parse()
+ assert_matches_type(BrandRetrieveSimplifiedResponse, brand, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_streaming_response_ai_query(self, async_client: AsyncContextDev) -> None:
- async with async_client.brand.with_streaming_response.ai_query(
- data_to_extract=[
- {
- "datapoint_description": "datapoint_description",
- "datapoint_example": "datapoint_example",
- "datapoint_name": "datapoint_name",
- "datapoint_type": "text",
- }
- ],
+ def test_streaming_response_retrieve_simplified(self, client: ContextDev) -> None:
+ with client.brand.with_streaming_response.retrieve_simplified(
domain="domain",
) as response:
assert not response.is_closed
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = await response.parse()
- assert_matches_type(BrandAIQueryResponse, brand, path=["response"])
+ brand = response.parse()
+ assert_matches_type(BrandRetrieveSimplifiedResponse, brand, path=["response"])
assert cast(Any, response.is_closed) is True
+
+class TestAsyncBrand:
+ parametrize = pytest.mark.parametrize(
+ "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
+ )
+
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_method_fonts(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.fonts(
+ async def test_method_retrieve(self, async_client: AsyncContextDev) -> None:
+ brand = await async_client.brand.retrieve(
domain="domain",
)
- assert_matches_type(BrandFontsResponse, brand, path=["response"])
+ assert_matches_type(BrandRetrieveResponse, brand, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_method_fonts_with_all_params(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.fonts(
+ async def test_method_retrieve_with_all_params(self, async_client: AsyncContextDev) -> None:
+ brand = await async_client.brand.retrieve(
domain="domain",
+ force_language="albanian",
+ max_speed=True,
timeout_ms=1000,
)
- assert_matches_type(BrandFontsResponse, brand, path=["response"])
+ assert_matches_type(BrandRetrieveResponse, brand, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_raw_response_fonts(self, async_client: AsyncContextDev) -> None:
- response = await async_client.brand.with_raw_response.fonts(
+ async def test_raw_response_retrieve(self, async_client: AsyncContextDev) -> None:
+ response = await async_client.brand.with_raw_response.retrieve(
domain="domain",
)
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
brand = await response.parse()
- assert_matches_type(BrandFontsResponse, brand, path=["response"])
+ assert_matches_type(BrandRetrieveResponse, brand, path=["response"])
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
- async def test_streaming_response_fonts(self, async_client: AsyncContextDev) -> None:
- async with async_client.brand.with_streaming_response.fonts(
+ async def test_streaming_response_retrieve(self, async_client: AsyncContextDev) -> None:
+ async with async_client.brand.with_streaming_response.retrieve(
domain="domain",
) as response:
assert not response.is_closed
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
brand = await response.parse()
- assert_matches_type(BrandFontsResponse, brand, path=["response"])
+ assert_matches_type(BrandRetrieveResponse, brand, path=["response"])
assert cast(Any, response.is_closed) is True
@@ -1200,92 +446,6 @@ async def test_streaming_response_identify_from_transaction(self, async_client:
assert cast(Any, response.is_closed) is True
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_prefetch(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.prefetch(
- domain="domain",
- )
- assert_matches_type(BrandPrefetchResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_prefetch_with_all_params(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.prefetch(
- domain="domain",
- timeout_ms=1000,
- )
- assert_matches_type(BrandPrefetchResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_prefetch(self, async_client: AsyncContextDev) -> None:
- response = await async_client.brand.with_raw_response.prefetch(
- domain="domain",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = await response.parse()
- assert_matches_type(BrandPrefetchResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_prefetch(self, async_client: AsyncContextDev) -> None:
- async with async_client.brand.with_streaming_response.prefetch(
- domain="domain",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = await response.parse()
- assert_matches_type(BrandPrefetchResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_prefetch_by_email(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.prefetch_by_email(
- email="dev@stainless.com",
- )
- assert_matches_type(BrandPrefetchByEmailResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_prefetch_by_email_with_all_params(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.prefetch_by_email(
- email="dev@stainless.com",
- timeout_ms=1000,
- )
- assert_matches_type(BrandPrefetchByEmailResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_prefetch_by_email(self, async_client: AsyncContextDev) -> None:
- response = await async_client.brand.with_raw_response.prefetch_by_email(
- email="dev@stainless.com",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = await response.parse()
- assert_matches_type(BrandPrefetchByEmailResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_prefetch_by_email(self, async_client: AsyncContextDev) -> None:
- async with async_client.brand.with_streaming_response.prefetch_by_email(
- email="dev@stainless.com",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = await response.parse()
- assert_matches_type(BrandPrefetchByEmailResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
async def test_method_retrieve_by_email(self, async_client: AsyncContextDev) -> None:
@@ -1468,51 +628,6 @@ async def test_streaming_response_retrieve_by_ticker(self, async_client: AsyncCo
assert cast(Any, response.is_closed) is True
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_retrieve_naics(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.retrieve_naics(
- input="input",
- )
- assert_matches_type(BrandRetrieveNaicsResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_retrieve_naics_with_all_params(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.retrieve_naics(
- input="input",
- max_results=1,
- min_results=1,
- timeout_ms=1000,
- )
- assert_matches_type(BrandRetrieveNaicsResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_retrieve_naics(self, async_client: AsyncContextDev) -> None:
- response = await async_client.brand.with_raw_response.retrieve_naics(
- input="input",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = await response.parse()
- assert_matches_type(BrandRetrieveNaicsResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_retrieve_naics(self, async_client: AsyncContextDev) -> None:
- async with async_client.brand.with_streaming_response.retrieve_naics(
- input="input",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = await response.parse()
- assert_matches_type(BrandRetrieveNaicsResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
async def test_method_retrieve_simplified(self, async_client: AsyncContextDev) -> None:
@@ -1555,87 +670,3 @@ async def test_streaming_response_retrieve_simplified(self, async_client: AsyncC
assert_matches_type(BrandRetrieveSimplifiedResponse, brand, path=["response"])
assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_screenshot(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.screenshot(
- domain="domain",
- )
- assert_matches_type(BrandScreenshotResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_screenshot_with_all_params(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.screenshot(
- domain="domain",
- full_screenshot="true",
- page="login",
- prioritize="speed",
- )
- assert_matches_type(BrandScreenshotResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_screenshot(self, async_client: AsyncContextDev) -> None:
- response = await async_client.brand.with_raw_response.screenshot(
- domain="domain",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = await response.parse()
- assert_matches_type(BrandScreenshotResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_screenshot(self, async_client: AsyncContextDev) -> None:
- async with async_client.brand.with_streaming_response.screenshot(
- domain="domain",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = await response.parse()
- assert_matches_type(BrandScreenshotResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_styleguide(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.styleguide()
- assert_matches_type(BrandStyleguideResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_method_styleguide_with_all_params(self, async_client: AsyncContextDev) -> None:
- brand = await async_client.brand.styleguide(
- direct_url="https://example.com",
- domain="domain",
- prioritize="speed",
- timeout_ms=1000,
- )
- assert_matches_type(BrandStyleguideResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_raw_response_styleguide(self, async_client: AsyncContextDev) -> None:
- response = await async_client.brand.with_raw_response.styleguide()
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- brand = await response.parse()
- assert_matches_type(BrandStyleguideResponse, brand, path=["response"])
-
- @pytest.mark.skip(reason="Mock server tests are disabled")
- @parametrize
- async def test_streaming_response_styleguide(self, async_client: AsyncContextDev) -> None:
- async with async_client.brand.with_streaming_response.styleguide() as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- brand = await response.parse()
- assert_matches_type(BrandStyleguideResponse, brand, path=["response"])
-
- assert cast(Any, response.is_closed) is True
diff --git a/tests/api_resources/test_industry.py b/tests/api_resources/test_industry.py
new file mode 100644
index 0000000..543c358
--- /dev/null
+++ b/tests/api_resources/test_industry.py
@@ -0,0 +1,114 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+import os
+from typing import Any, cast
+
+import pytest
+
+from context.dev import ContextDev, AsyncContextDev
+from tests.utils import assert_matches_type
+from context.dev.types import IndustryRetrieveNaicsResponse
+
+base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
+
+
+class TestIndustry:
+ parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_retrieve_naics(self, client: ContextDev) -> None:
+ industry = client.industry.retrieve_naics(
+ input="input",
+ )
+ assert_matches_type(IndustryRetrieveNaicsResponse, industry, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_retrieve_naics_with_all_params(self, client: ContextDev) -> None:
+ industry = client.industry.retrieve_naics(
+ input="input",
+ max_results=1,
+ min_results=1,
+ timeout_ms=1000,
+ )
+ assert_matches_type(IndustryRetrieveNaicsResponse, industry, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_retrieve_naics(self, client: ContextDev) -> None:
+ response = client.industry.with_raw_response.retrieve_naics(
+ input="input",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ industry = response.parse()
+ assert_matches_type(IndustryRetrieveNaicsResponse, industry, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_retrieve_naics(self, client: ContextDev) -> None:
+ with client.industry.with_streaming_response.retrieve_naics(
+ input="input",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ industry = response.parse()
+ assert_matches_type(IndustryRetrieveNaicsResponse, industry, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+
+class TestAsyncIndustry:
+ parametrize = pytest.mark.parametrize(
+ "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_retrieve_naics(self, async_client: AsyncContextDev) -> None:
+ industry = await async_client.industry.retrieve_naics(
+ input="input",
+ )
+ assert_matches_type(IndustryRetrieveNaicsResponse, industry, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_retrieve_naics_with_all_params(self, async_client: AsyncContextDev) -> None:
+ industry = await async_client.industry.retrieve_naics(
+ input="input",
+ max_results=1,
+ min_results=1,
+ timeout_ms=1000,
+ )
+ assert_matches_type(IndustryRetrieveNaicsResponse, industry, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_retrieve_naics(self, async_client: AsyncContextDev) -> None:
+ response = await async_client.industry.with_raw_response.retrieve_naics(
+ input="input",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ industry = await response.parse()
+ assert_matches_type(IndustryRetrieveNaicsResponse, industry, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_retrieve_naics(self, async_client: AsyncContextDev) -> None:
+ async with async_client.industry.with_streaming_response.retrieve_naics(
+ input="input",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ industry = await response.parse()
+ assert_matches_type(IndustryRetrieveNaicsResponse, industry, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
diff --git a/tests/api_resources/test_style.py b/tests/api_resources/test_style.py
new file mode 100644
index 0000000..d1e8bc6
--- /dev/null
+++ b/tests/api_resources/test_style.py
@@ -0,0 +1,191 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+import os
+from typing import Any, cast
+
+import pytest
+
+from context.dev import ContextDev, AsyncContextDev
+from tests.utils import assert_matches_type
+from context.dev.types import (
+ StyleExtractFontsResponse,
+ StyleExtractStyleguideResponse,
+)
+
+base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
+
+
+class TestStyle:
+ parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_extract_fonts(self, client: ContextDev) -> None:
+ style = client.style.extract_fonts(
+ domain="domain",
+ )
+ assert_matches_type(StyleExtractFontsResponse, style, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_extract_fonts_with_all_params(self, client: ContextDev) -> None:
+ style = client.style.extract_fonts(
+ domain="domain",
+ timeout_ms=1000,
+ )
+ assert_matches_type(StyleExtractFontsResponse, style, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_extract_fonts(self, client: ContextDev) -> None:
+ response = client.style.with_raw_response.extract_fonts(
+ domain="domain",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ style = response.parse()
+ assert_matches_type(StyleExtractFontsResponse, style, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_extract_fonts(self, client: ContextDev) -> None:
+ with client.style.with_streaming_response.extract_fonts(
+ domain="domain",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ style = response.parse()
+ assert_matches_type(StyleExtractFontsResponse, style, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_extract_styleguide(self, client: ContextDev) -> None:
+ style = client.style.extract_styleguide()
+ assert_matches_type(StyleExtractStyleguideResponse, style, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_extract_styleguide_with_all_params(self, client: ContextDev) -> None:
+ style = client.style.extract_styleguide(
+ direct_url="https://example.com",
+ domain="domain",
+ prioritize="speed",
+ timeout_ms=1000,
+ )
+ assert_matches_type(StyleExtractStyleguideResponse, style, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_extract_styleguide(self, client: ContextDev) -> None:
+ response = client.style.with_raw_response.extract_styleguide()
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ style = response.parse()
+ assert_matches_type(StyleExtractStyleguideResponse, style, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_extract_styleguide(self, client: ContextDev) -> None:
+ with client.style.with_streaming_response.extract_styleguide() as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ style = response.parse()
+ assert_matches_type(StyleExtractStyleguideResponse, style, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+
+class TestAsyncStyle:
+ parametrize = pytest.mark.parametrize(
+ "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_extract_fonts(self, async_client: AsyncContextDev) -> None:
+ style = await async_client.style.extract_fonts(
+ domain="domain",
+ )
+ assert_matches_type(StyleExtractFontsResponse, style, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_extract_fonts_with_all_params(self, async_client: AsyncContextDev) -> None:
+ style = await async_client.style.extract_fonts(
+ domain="domain",
+ timeout_ms=1000,
+ )
+ assert_matches_type(StyleExtractFontsResponse, style, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_extract_fonts(self, async_client: AsyncContextDev) -> None:
+ response = await async_client.style.with_raw_response.extract_fonts(
+ domain="domain",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ style = await response.parse()
+ assert_matches_type(StyleExtractFontsResponse, style, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_extract_fonts(self, async_client: AsyncContextDev) -> None:
+ async with async_client.style.with_streaming_response.extract_fonts(
+ domain="domain",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ style = await response.parse()
+ assert_matches_type(StyleExtractFontsResponse, style, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_extract_styleguide(self, async_client: AsyncContextDev) -> None:
+ style = await async_client.style.extract_styleguide()
+ assert_matches_type(StyleExtractStyleguideResponse, style, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_extract_styleguide_with_all_params(self, async_client: AsyncContextDev) -> None:
+ style = await async_client.style.extract_styleguide(
+ direct_url="https://example.com",
+ domain="domain",
+ prioritize="speed",
+ timeout_ms=1000,
+ )
+ assert_matches_type(StyleExtractStyleguideResponse, style, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_extract_styleguide(self, async_client: AsyncContextDev) -> None:
+ response = await async_client.style.with_raw_response.extract_styleguide()
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ style = await response.parse()
+ assert_matches_type(StyleExtractStyleguideResponse, style, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_extract_styleguide(self, async_client: AsyncContextDev) -> None:
+ async with async_client.style.with_streaming_response.extract_styleguide() as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ style = await response.parse()
+ assert_matches_type(StyleExtractStyleguideResponse, style, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
diff --git a/tests/api_resources/test_utility.py b/tests/api_resources/test_utility.py
new file mode 100644
index 0000000..112de67
--- /dev/null
+++ b/tests/api_resources/test_utility.py
@@ -0,0 +1,199 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+import os
+from typing import Any, cast
+
+import pytest
+
+from context.dev import ContextDev, AsyncContextDev
+from tests.utils import assert_matches_type
+from context.dev.types import (
+ UtilityPrefetchResponse,
+ UtilityPrefetchByEmailResponse,
+)
+
+base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
+
+
+class TestUtility:
+ parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_prefetch(self, client: ContextDev) -> None:
+ utility = client.utility.prefetch(
+ domain="domain",
+ )
+ assert_matches_type(UtilityPrefetchResponse, utility, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_prefetch_with_all_params(self, client: ContextDev) -> None:
+ utility = client.utility.prefetch(
+ domain="domain",
+ timeout_ms=1000,
+ )
+ assert_matches_type(UtilityPrefetchResponse, utility, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_prefetch(self, client: ContextDev) -> None:
+ response = client.utility.with_raw_response.prefetch(
+ domain="domain",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ utility = response.parse()
+ assert_matches_type(UtilityPrefetchResponse, utility, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_prefetch(self, client: ContextDev) -> None:
+ with client.utility.with_streaming_response.prefetch(
+ domain="domain",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ utility = response.parse()
+ assert_matches_type(UtilityPrefetchResponse, utility, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_prefetch_by_email(self, client: ContextDev) -> None:
+ utility = client.utility.prefetch_by_email(
+ email="dev@stainless.com",
+ )
+ assert_matches_type(UtilityPrefetchByEmailResponse, utility, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_prefetch_by_email_with_all_params(self, client: ContextDev) -> None:
+ utility = client.utility.prefetch_by_email(
+ email="dev@stainless.com",
+ timeout_ms=1000,
+ )
+ assert_matches_type(UtilityPrefetchByEmailResponse, utility, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_prefetch_by_email(self, client: ContextDev) -> None:
+ response = client.utility.with_raw_response.prefetch_by_email(
+ email="dev@stainless.com",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ utility = response.parse()
+ assert_matches_type(UtilityPrefetchByEmailResponse, utility, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_prefetch_by_email(self, client: ContextDev) -> None:
+ with client.utility.with_streaming_response.prefetch_by_email(
+ email="dev@stainless.com",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ utility = response.parse()
+ assert_matches_type(UtilityPrefetchByEmailResponse, utility, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+
+class TestAsyncUtility:
+ parametrize = pytest.mark.parametrize(
+ "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
+ )
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_prefetch(self, async_client: AsyncContextDev) -> None:
+ utility = await async_client.utility.prefetch(
+ domain="domain",
+ )
+ assert_matches_type(UtilityPrefetchResponse, utility, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_prefetch_with_all_params(self, async_client: AsyncContextDev) -> None:
+ utility = await async_client.utility.prefetch(
+ domain="domain",
+ timeout_ms=1000,
+ )
+ assert_matches_type(UtilityPrefetchResponse, utility, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_prefetch(self, async_client: AsyncContextDev) -> None:
+ response = await async_client.utility.with_raw_response.prefetch(
+ domain="domain",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ utility = await response.parse()
+ assert_matches_type(UtilityPrefetchResponse, utility, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_prefetch(self, async_client: AsyncContextDev) -> None:
+ async with async_client.utility.with_streaming_response.prefetch(
+ domain="domain",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ utility = await response.parse()
+ assert_matches_type(UtilityPrefetchResponse, utility, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_prefetch_by_email(self, async_client: AsyncContextDev) -> None:
+ utility = await async_client.utility.prefetch_by_email(
+ email="dev@stainless.com",
+ )
+ assert_matches_type(UtilityPrefetchByEmailResponse, utility, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_prefetch_by_email_with_all_params(self, async_client: AsyncContextDev) -> None:
+ utility = await async_client.utility.prefetch_by_email(
+ email="dev@stainless.com",
+ timeout_ms=1000,
+ )
+ assert_matches_type(UtilityPrefetchByEmailResponse, utility, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_prefetch_by_email(self, async_client: AsyncContextDev) -> None:
+ response = await async_client.utility.with_raw_response.prefetch_by_email(
+ email="dev@stainless.com",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ utility = await response.parse()
+ assert_matches_type(UtilityPrefetchByEmailResponse, utility, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_prefetch_by_email(self, async_client: AsyncContextDev) -> None:
+ async with async_client.utility.with_streaming_response.prefetch_by_email(
+ email="dev@stainless.com",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ utility = await response.parse()
+ assert_matches_type(UtilityPrefetchByEmailResponse, utility, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
diff --git a/tests/api_resources/test_web.py b/tests/api_resources/test_web.py
index 1f9e029..c837e7d 100644
--- a/tests/api_resources/test_web.py
+++ b/tests/api_resources/test_web.py
@@ -10,6 +10,7 @@
from context.dev import ContextDev, AsyncContextDev
from tests.utils import assert_matches_type
from context.dev.types import (
+ WebScreenshotResponse,
WebWebScrapeMdResponse,
WebWebScrapeHTMLResponse,
WebWebScrapeImagesResponse,
@@ -22,6 +23,51 @@
class TestWeb:
parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_screenshot(self, client: ContextDev) -> None:
+ web = client.web.screenshot(
+ domain="domain",
+ )
+ assert_matches_type(WebScreenshotResponse, web, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_method_screenshot_with_all_params(self, client: ContextDev) -> None:
+ web = client.web.screenshot(
+ domain="domain",
+ full_screenshot="true",
+ page="login",
+ prioritize="speed",
+ )
+ assert_matches_type(WebScreenshotResponse, web, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_raw_response_screenshot(self, client: ContextDev) -> None:
+ response = client.web.with_raw_response.screenshot(
+ domain="domain",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ web = response.parse()
+ assert_matches_type(WebScreenshotResponse, web, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ def test_streaming_response_screenshot(self, client: ContextDev) -> None:
+ with client.web.with_streaming_response.screenshot(
+ domain="domain",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ web = response.parse()
+ assert_matches_type(WebScreenshotResponse, web, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
def test_method_web_scrape_html(self, client: ContextDev) -> None:
@@ -175,6 +221,51 @@ class TestAsyncWeb:
"async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
)
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_screenshot(self, async_client: AsyncContextDev) -> None:
+ web = await async_client.web.screenshot(
+ domain="domain",
+ )
+ assert_matches_type(WebScreenshotResponse, web, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_method_screenshot_with_all_params(self, async_client: AsyncContextDev) -> None:
+ web = await async_client.web.screenshot(
+ domain="domain",
+ full_screenshot="true",
+ page="login",
+ prioritize="speed",
+ )
+ assert_matches_type(WebScreenshotResponse, web, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_raw_response_screenshot(self, async_client: AsyncContextDev) -> None:
+ response = await async_client.web.with_raw_response.screenshot(
+ domain="domain",
+ )
+
+ assert response.is_closed is True
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ web = await response.parse()
+ assert_matches_type(WebScreenshotResponse, web, path=["response"])
+
+ @pytest.mark.skip(reason="Mock server tests are disabled")
+ @parametrize
+ async def test_streaming_response_screenshot(self, async_client: AsyncContextDev) -> None:
+ async with async_client.web.with_streaming_response.screenshot(
+ domain="domain",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+
+ web = await response.parse()
+ assert_matches_type(WebScreenshotResponse, web, path=["response"])
+
+ assert cast(Any, response.is_closed) is True
+
@pytest.mark.skip(reason="Mock server tests are disabled")
@parametrize
async def test_method_web_scrape_html(self, async_client: AsyncContextDev) -> None:
From 50394e6f215e080cf1f09b64b9ed5c5f29640e7c Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 18 Mar 2026 20:31:17 +0000
Subject: [PATCH 4/4] release: 0.2.0
---
.release-please-manifest.json | 2 +-
CHANGELOG.md | 10 ++++++++++
pyproject.toml | 2 +-
src/context/dev/_version.py | 2 +-
4 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index 3d2ac0b..10f3091 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "0.1.0"
+ ".": "0.2.0"
}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c550c0f..5ff88eb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,15 @@
# Changelog
+## 0.2.0 (2026-03-18)
+
+Full Changelog: [v0.1.0...v0.2.0](https://github.com/brand-dot-dev/context-python-sdk/compare/v0.1.0...v0.2.0)
+
+### Features
+
+* **api:** api update ([c4538b4](https://github.com/brand-dot-dev/context-python-sdk/commit/c4538b459e6dcee56fb4b2ca85c94db4589d4318))
+* **api:** manual updates ([8304083](https://github.com/brand-dot-dev/context-python-sdk/commit/830408303450a4b85dfd444a2c4790cc8fecf292))
+* **api:** manual updates ([3285d21](https://github.com/brand-dot-dev/context-python-sdk/commit/3285d21cae790e5529ba6fcd7a79612ffc7e7738))
+
## 0.1.0 (2026-03-18)
Full Changelog: [v0.0.3...v0.1.0](https://github.com/brand-dot-dev/context-python-sdk/compare/v0.0.3...v0.1.0)
diff --git a/pyproject.toml b/pyproject.toml
index 767433b..8c72792 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "context.dev"
-version = "0.1.0"
+version = "0.2.0"
description = "The official Python library for the context.dev API"
dynamic = ["readme"]
license = "Apache-2.0"
diff --git a/src/context/dev/_version.py b/src/context/dev/_version.py
index f96f8e2..b3d54a5 100644
--- a/src/context/dev/_version.py
+++ b/src/context/dev/_version.py
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
__title__ = "context.dev"
-__version__ = "0.1.0" # x-release-please-version
+__version__ = "0.2.0" # x-release-please-version