Skip to content

Commit 3e1e166

Browse files
authored
Merge pull request #34 from context-dot-dev/release-please--branches--main--changes--next
release: 0.29.0
2 parents 76d7bb4 + 36a1263 commit 3e1e166

11 files changed

Lines changed: 316 additions & 6 deletions

File tree

‎.release-please-manifest.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
".": "0.28.0"
2+
".": "0.29.0"
33
}

‎.stats.yml‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
configured_endpoints: 24
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/context-dev/context.dev-1785aa93e6fb2784640a4c32eb0221f0b31aa06644d090f72f8533524aeef7c6.yml
1+
configured_endpoints: 25
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/context-dev/context.dev-30ba67603321f69c2ba0432320c45caa4727ebbe353bea8874c9e7db8b95b09e.yml
33
openapi_spec_hash: 7dc1fadcec32637e795f641a0e97c63e
4-
config_hash: cf2c7f48b329e0a61612b30cd2755ad1
4+
config_hash: f86a4e06ae5ed725aa79d58d7a8dc27c

‎CHANGELOG.md‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# Changelog
22

3+
## 0.29.0 (2026-06-01)
4+
5+
Full Changelog: [v0.28.0...v0.29.0](https://github.com/context-dot-dev/context-python-sdk/compare/v0.28.0...v0.29.0)
6+
7+
### Features
8+
9+
* **api:** manual updates ([9aecc62](https://github.com/context-dot-dev/context-python-sdk/commit/9aecc620c9ab42cb2453afb104022486dab7339f))
10+
311
## 0.28.0 (2026-06-01)
412

513
Full Changelog: [v0.27.0...v0.28.0](https://github.com/context-dot-dev/context-python-sdk/compare/v0.27.0...v0.28.0)

‎api.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Types:
55
```python
66
from context.dev.types import (
77
WebExtractResponse,
8+
WebExtractCompetitorsResponse,
89
WebExtractFontsResponse,
910
WebExtractStyleguideResponse,
1011
WebScreenshotResponse,
@@ -20,6 +21,7 @@ from context.dev.types import (
2021
Methods:
2122

2223
- <code title="post /web/extract">client.web.<a href="./src/context/dev/resources/web.py">extract</a>(\*\*<a href="src/context/dev/types/web_extract_params.py">params</a>) -> <a href="./src/context/dev/types/web_extract_response.py">WebExtractResponse</a></code>
24+
- <code title="get /web/competitors">client.web.<a href="./src/context/dev/resources/web.py">extract_competitors</a>(\*\*<a href="src/context/dev/types/web_extract_competitors_params.py">params</a>) -> <a href="./src/context/dev/types/web_extract_competitors_response.py">WebExtractCompetitorsResponse</a></code>
2325
- <code title="get /web/fonts">client.web.<a href="./src/context/dev/resources/web.py">extract_fonts</a>(\*\*<a href="src/context/dev/types/web_extract_fonts_params.py">params</a>) -> <a href="./src/context/dev/types/web_extract_fonts_response.py">WebExtractFontsResponse</a></code>
2426
- <code title="get /web/styleguide">client.web.<a href="./src/context/dev/resources/web.py">extract_styleguide</a>(\*\*<a href="src/context/dev/types/web_extract_styleguide_params.py">params</a>) -> <a href="./src/context/dev/types/web_extract_styleguide_response.py">WebExtractStyleguideResponse</a></code>
2527
- <code title="get /web/screenshot">client.web.<a href="./src/context/dev/resources/web.py">screenshot</a>(\*\*<a href="src/context/dev/types/web_screenshot_params.py">params</a>) -> <a href="./src/context/dev/types/web_screenshot_response.py">WebScreenshotResponse</a></code>

‎pyproject.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "context.dev"
3-
version = "0.28.0"
3+
version = "0.29.0"
44
description = "The official Python library for the context.dev API"
55
dynamic = ["readme"]
66
license = "Apache-2.0"

‎src/context/dev/_version.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
22

33
__title__ = "context.dev"
4-
__version__ = "0.28.0" # x-release-please-version
4+
__version__ = "0.29.0" # x-release-please-version

‎src/context/dev/resources/web.py‎

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
web_web_scrape_images_params,
1919
web_extract_styleguide_params,
2020
web_web_scrape_sitemap_params,
21+
web_extract_competitors_params,
2122
)
2223
from .._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given
2324
from .._utils import maybe_transform, async_maybe_transform
@@ -40,6 +41,7 @@
4041
from ..types.web_web_scrape_images_response import WebWebScrapeImagesResponse
4142
from ..types.web_extract_styleguide_response import WebExtractStyleguideResponse
4243
from ..types.web_web_scrape_sitemap_response import WebWebScrapeSitemapResponse
44+
from ..types.web_extract_competitors_response import WebExtractCompetitorsResponse
4345

4446
__all__ = ["WebResource", "AsyncWebResource"]
4547

@@ -155,6 +157,60 @@ def extract(
155157
cast_to=WebExtractResponse,
156158
)
157159

160+
def extract_competitors(
161+
self,
162+
*,
163+
domain: str,
164+
num_competitors: int | Omit = omit,
165+
timeout_ms: int | Omit = omit,
166+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
167+
# The extra values given here take precedence over values defined on the client or passed to this method.
168+
extra_headers: Headers | None = None,
169+
extra_query: Query | None = None,
170+
extra_body: Body | None = None,
171+
timeout: float | httpx.Timeout | None | NotGiven = not_given,
172+
) -> WebExtractCompetitorsResponse:
173+
"""
174+
Analyze a company's landing page and web search evidence to return direct
175+
competitors for the same product or market.
176+
177+
Args:
178+
domain: Company domain to analyze, such as `stripe.com`. Full http(s) URLs are accepted
179+
and normalized to their domain.
180+
181+
num_competitors: Exact number of direct competitors to return. Defaults to 5.
182+
183+
timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
184+
than this value, it will be aborted with a 408 status code. Maximum allowed
185+
value is 300000ms (5 minutes).
186+
187+
extra_headers: Send extra headers
188+
189+
extra_query: Add additional query parameters to the request
190+
191+
extra_body: Add additional JSON properties to the request
192+
193+
timeout: Override the client-level default timeout for this request, in seconds
194+
"""
195+
return self._get(
196+
"/web/competitors",
197+
options=make_request_options(
198+
extra_headers=extra_headers,
199+
extra_query=extra_query,
200+
extra_body=extra_body,
201+
timeout=timeout,
202+
query=maybe_transform(
203+
{
204+
"domain": domain,
205+
"num_competitors": num_competitors,
206+
"timeout_ms": timeout_ms,
207+
},
208+
web_extract_competitors_params.WebExtractCompetitorsParams,
209+
),
210+
),
211+
cast_to=WebExtractCompetitorsResponse,
212+
)
213+
158214
def extract_fonts(
159215
self,
160216
*,
@@ -943,6 +999,60 @@ async def extract(
943999
cast_to=WebExtractResponse,
9441000
)
9451001

1002+
async def extract_competitors(
1003+
self,
1004+
*,
1005+
domain: str,
1006+
num_competitors: int | Omit = omit,
1007+
timeout_ms: int | Omit = omit,
1008+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
1009+
# The extra values given here take precedence over values defined on the client or passed to this method.
1010+
extra_headers: Headers | None = None,
1011+
extra_query: Query | None = None,
1012+
extra_body: Body | None = None,
1013+
timeout: float | httpx.Timeout | None | NotGiven = not_given,
1014+
) -> WebExtractCompetitorsResponse:
1015+
"""
1016+
Analyze a company's landing page and web search evidence to return direct
1017+
competitors for the same product or market.
1018+
1019+
Args:
1020+
domain: Company domain to analyze, such as `stripe.com`. Full http(s) URLs are accepted
1021+
and normalized to their domain.
1022+
1023+
num_competitors: Exact number of direct competitors to return. Defaults to 5.
1024+
1025+
timeout_ms: Optional timeout in milliseconds for the request. If the request takes longer
1026+
than this value, it will be aborted with a 408 status code. Maximum allowed
1027+
value is 300000ms (5 minutes).
1028+
1029+
extra_headers: Send extra headers
1030+
1031+
extra_query: Add additional query parameters to the request
1032+
1033+
extra_body: Add additional JSON properties to the request
1034+
1035+
timeout: Override the client-level default timeout for this request, in seconds
1036+
"""
1037+
return await self._get(
1038+
"/web/competitors",
1039+
options=make_request_options(
1040+
extra_headers=extra_headers,
1041+
extra_query=extra_query,
1042+
extra_body=extra_body,
1043+
timeout=timeout,
1044+
query=await async_maybe_transform(
1045+
{
1046+
"domain": domain,
1047+
"num_competitors": num_competitors,
1048+
"timeout_ms": timeout_ms,
1049+
},
1050+
web_extract_competitors_params.WebExtractCompetitorsParams,
1051+
),
1052+
),
1053+
cast_to=WebExtractCompetitorsResponse,
1054+
)
1055+
9461056
async def extract_fonts(
9471057
self,
9481058
*,
@@ -1627,6 +1737,9 @@ def __init__(self, web: WebResource) -> None:
16271737
self.extract = to_raw_response_wrapper(
16281738
web.extract,
16291739
)
1740+
self.extract_competitors = to_raw_response_wrapper(
1741+
web.extract_competitors,
1742+
)
16301743
self.extract_fonts = to_raw_response_wrapper(
16311744
web.extract_fonts,
16321745
)
@@ -1663,6 +1776,9 @@ def __init__(self, web: AsyncWebResource) -> None:
16631776
self.extract = async_to_raw_response_wrapper(
16641777
web.extract,
16651778
)
1779+
self.extract_competitors = async_to_raw_response_wrapper(
1780+
web.extract_competitors,
1781+
)
16661782
self.extract_fonts = async_to_raw_response_wrapper(
16671783
web.extract_fonts,
16681784
)
@@ -1699,6 +1815,9 @@ def __init__(self, web: WebResource) -> None:
16991815
self.extract = to_streamed_response_wrapper(
17001816
web.extract,
17011817
)
1818+
self.extract_competitors = to_streamed_response_wrapper(
1819+
web.extract_competitors,
1820+
)
17021821
self.extract_fonts = to_streamed_response_wrapper(
17031822
web.extract_fonts,
17041823
)
@@ -1735,6 +1854,9 @@ def __init__(self, web: AsyncWebResource) -> None:
17351854
self.extract = async_to_streamed_response_wrapper(
17361855
web.extract,
17371856
)
1857+
self.extract_competitors = async_to_streamed_response_wrapper(
1858+
web.extract_competitors,
1859+
)
17381860
self.extract_fonts = async_to_streamed_response_wrapper(
17391861
web.extract_fonts,
17401862
)

‎src/context/dev/types/__init__.py‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
from .brand_retrieve_by_email_params import BrandRetrieveByEmailParams as BrandRetrieveByEmailParams
3636
from .industry_retrieve_naics_params import IndustryRetrieveNaicsParams as IndustryRetrieveNaicsParams
3737
from .industry_retrieve_sic_response import IndustryRetrieveSicResponse as IndustryRetrieveSicResponse
38+
from .web_extract_competitors_params import WebExtractCompetitorsParams as WebExtractCompetitorsParams
3839
from .web_web_scrape_images_response import WebWebScrapeImagesResponse as WebWebScrapeImagesResponse
3940
from .brand_retrieve_by_isin_response import BrandRetrieveByIsinResponse as BrandRetrieveByIsinResponse
4041
from .brand_retrieve_by_name_response import BrandRetrieveByNameResponse as BrandRetrieveByNameResponse
@@ -45,6 +46,7 @@
4546
from .brand_retrieve_simplified_params import BrandRetrieveSimplifiedParams as BrandRetrieveSimplifiedParams
4647
from .industry_retrieve_naics_response import IndustryRetrieveNaicsResponse as IndustryRetrieveNaicsResponse
4748
from .utility_prefetch_by_email_params import UtilityPrefetchByEmailParams as UtilityPrefetchByEmailParams
49+
from .web_extract_competitors_response import WebExtractCompetitorsResponse as WebExtractCompetitorsResponse
4850
from .brand_retrieve_by_ticker_response import BrandRetrieveByTickerResponse as BrandRetrieveByTickerResponse
4951
from .brand_retrieve_simplified_response import BrandRetrieveSimplifiedResponse as BrandRetrieveSimplifiedResponse
5052
from .utility_prefetch_by_email_response import UtilityPrefetchByEmailResponse as UtilityPrefetchByEmailResponse
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from __future__ import annotations
4+
5+
from typing_extensions import Required, Annotated, TypedDict
6+
7+
from .._utils import PropertyInfo
8+
9+
__all__ = ["WebExtractCompetitorsParams"]
10+
11+
12+
class WebExtractCompetitorsParams(TypedDict, total=False):
13+
domain: Required[str]
14+
"""Company domain to analyze, such as `stripe.com`.
15+
16+
Full http(s) URLs are accepted and normalized to their domain.
17+
"""
18+
19+
num_competitors: Annotated[int, PropertyInfo(alias="numCompetitors")]
20+
"""Exact number of direct competitors to return. Defaults to 5."""
21+
22+
timeout_ms: Annotated[int, PropertyInfo(alias="timeoutMS")]
23+
"""Optional timeout in milliseconds for the request.
24+
25+
If the request takes longer than this value, it will be aborted with a 408
26+
status code. Maximum allowed value is 300000ms (5 minutes).
27+
"""
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from typing import List
4+
from typing_extensions import Literal
5+
6+
from pydantic import Field as FieldInfo
7+
8+
from .._models import BaseModel
9+
10+
__all__ = ["WebExtractCompetitorsResponse", "Competitor", "Target"]
11+
12+
13+
class Competitor(BaseModel):
14+
confidence: Literal["high", "medium"]
15+
"""Confidence that this company is a direct competitor."""
16+
17+
description: str
18+
"""Short description of the competitor."""
19+
20+
domain: str
21+
"""Competitor's normalized official domain."""
22+
23+
name: str
24+
"""Competitor company or product name."""
25+
26+
source_urls: List[str] = FieldInfo(alias="sourceUrls")
27+
"""Search result URLs used as evidence for this competitor."""
28+
29+
url: str
30+
"""Competitor website URL."""
31+
32+
33+
class Target(BaseModel):
34+
"""Target company profile inferred from the landing page."""
35+
36+
company_name: str = FieldInfo(alias="companyName")
37+
"""Company or product name inferred from the landing page."""
38+
39+
field: str
40+
"""Specific operating field, product category, or market."""
41+
42+
field_description: str = FieldInfo(alias="fieldDescription")
43+
"""One-sentence description of what the target company sells and who it serves."""
44+
45+
website_url: str = FieldInfo(alias="websiteUrl")
46+
"""Resolved URL used for the landing page analysis."""
47+
48+
49+
class WebExtractCompetitorsResponse(BaseModel):
50+
competitors: List[Competitor]
51+
"""Direct competitors ordered by relevance and confidence."""
52+
53+
domain: str
54+
"""Normalized input domain."""
55+
56+
status: Literal["ok"]
57+
"""Status of the response."""
58+
59+
target: Target
60+
"""Target company profile inferred from the landing page."""

0 commit comments

Comments
 (0)