BuiltWith Python SDK
Official Python client for BuiltWith technology, company, and website intelligence. Python 3.10+, synchronous and asynchronous HTTPX clients, typed interfaces, and optional MCP tools.
Install
python -m pip install builtwith-official
# Optional integration with the existing BuiltWith MCP server:
python -m pip install "builtwith-official[mcp]"
Import from builtwith_official, not builtwith: the latter is an unrelated existing
PyPI distribution. For development, install from this checkout with pip install -e ".[dev,mcp]".
First request
No API key or credits are needed for public VAT registration types:
from builtwith_official import BuiltWith
with BuiltWith() as client:
print(client.vat_types().data)
Get an API key from BuiltWith API.
Set BUILTWITH_API_KEY in your environment or secret manager:
export BUILTWITH_API_KEY="YOUR_API_KEY"
PowerShell: $env:BUILTWITH_API_KEY = "YOUR_API_KEY".
from builtwith_official import BuiltWith
with BuiltWith() as client:
print(client.usage().data) # No credits used
result = client.domain("shopify.com", no_pii=True) # Uses API credits
print(result.data)
print(result.headers.get("x-api-credits-remaining"))
An explicit BuiltWith(api_key="YOUR_API_KEY") overrides the environment. Empty keys
disable authenticated calls but still allow public reference requests. Credentials are
sent in Authorization: API …, never a query parameter. The SDK does not log requests,
credentials or response bodies. Avoid logging raw customer data or enabling third-party
HTTP tracing that records authorization headers. Proxy environment variables are ignored;
configure a transport explicitly when needed.
Async and notebooks
import asyncio
from builtwith_official import AsyncBuiltWith
async def main() -> None:
async with AsyncBuiltWith() as client:
result = await client.domain("shopify.com", no_pii=True)
print(result.data)
if __name__ == "__main__":
asyncio.run(main())
In Jupyter use await main() instead of asyncio.run. Reuse one async client per
application lifespan in FastAPI; close it with await client.aclose(). See
examples for FastAPI, pipelines, agent functions and optional framework adapters.
The core installation does not depend on any AI framework.
Responses and errors
Every API method returns APIResponse(data, status_code, headers, content).
data is recursively typed JSON (JSONValue), preserving original spelling, unknown
fields, arrays, missing fields, and registration numbers with leading zeros. No model
silently drops new fields. Narrow dictionaries/lists before accessing nested values.
content contains original response bytes; headers use lowercase keys. No authenticated
request object is attached.
from builtwith_official import BuiltWith, APIError, RateLimitError, TimeoutError
with BuiltWith(timeout=15, max_retries=2) as client:
try:
result = client.trends("Shopify")
except RateLimitError as error:
print("Rate limited", error.status_code)
except TimeoutError:
print("Request timed out")
except APIError as error:
print("API failure", error.status_code, error.codes)
# error.response retains the payload, including any partial successes.
AuthenticationError covers missing keys, HTTP 401 and documented API error -2.
EntitlementError covers HTTP 402/403 and codes -3/-5. Other application Errors,
including errors in HTTP 200 responses, raise APIError. Malformed success responses
raise ResponseError; connection failures raise TransportError. Exception messages
omit upstream text and URLs; explicitly inspected response data may contain sensitive values.
Retries, limits and pagination
Defaults: 30-second HTTPX timeout per operation, no retries. max_retries=2 enables
exponential backoff (0.5 seconds initially, at most 60 seconds) for transport failures,
timeouts, and HTTP 429/500/502/503/504. Retry-After seconds and HTTP dates take precedence.
A server delay above max_retry_after (default 120 seconds) stops retries instead of
retrying early. Retries may incur additional credits; no automatic retries apply to
bulk submission or one-time bulk results. There is no global request-rate scheduler.
Coordinate callers with account limits from whoami(): documentation gives 10 requests
per second / 8 concurrent requests generally, and 1 request per second for the MCP registry.
with BuiltWith() as client:
for page in client.lists_pages("Shopify", country="US", max_pages=5):
print(page.data)
Async: async for page in client.lists_pages(...).
Page iterators are lazy, preserve filters, yield complete APIResponse objects, stop
at the documented end marker, reject repeated cursors, and stop at max_pages (100 by
default). That bound intentionally truncates iteration; use the last response cursor to
resume if needed. No requests occur until iteration. Helpers cover Lists, Ask, Keyword
Search, Relationships, Product Search and MCP Registry. Product URLs are parsed only for
page parameters; the SDK never follows their host or embedded credentials.
Coverage and access
See the complete method signatures and machine-readable endpoint inventory.
| Capability | API version / access |
|---|---|
| Domain, changes, relationships | v26, change1, rv5; credits |
| Free summary, trends, account identity and usage | free1, trends/v6, whoamiv1, usagev2; key, no credits |
| Lists and keyword search | lists13, kws1; subscription required |
| Ask, company-to-URL, tags, recommendations, redirects, keywords | ask1, ctu3, tag1, rec1, redirect1, kw2; credits |
| Product, trust, vector search | productv1, trustv2, vector/v1; credits |
| VAT | vat1; 1 credit per domain returning records, 1–16 domains |
| VAT types and MCP categories | Public; no key or credits |
| MCP registry | mcp2; key, no credits; 1 request/second |
| Bulk domain | v23/domain/bulk; credits per domain |
Domain trust=True adds an extra Trust API credit. Ask normally returns a sample;
commit=True runs a full report. Lists/prospect access requires a plan; lookup credits
alone do not grant it. Confirm current entitlements, costs and batch limits through
whoami() before large workloads. Relationships may reuse one domain credit across
pages while its server cache survives; cache eviction or server changes can charge again.
Change API credit details are not specified in the local reference; inspect account
costs rather than assume a free call.
Bulk jobs accept up to the account limit (documented ceiling 5000).
bulk_submit() may return synchronous results or HTTP 202 with a job ID.
Poll bulk_status(job_id) at an application-controlled interval.
bulk_result(job_id) is consumed/deleted after successful retrieval: persist its response.
The SDK does not auto-poll or auto-retrieve jobs.
MCP and agents
MCP setup covers Python client integration with the existing hosted BuiltWith endpoint. Agent guidance provides function schemas and framework integration advice. llms.txt is a proposal for future public documentation; this change does not modify the BuiltWith website.
Development and distribution
See development and release instructions and changelog. MIT license, consistent with the existing BuiltWith MCP and examples repositories.
The implementation follows the workspace API llms-full.txt reference (snapshot inspected
2026-10-20), rather than older endpoint versions in existing clients.
Public reference: BuiltWith full API documentation.
Known scope exclusions and discovery findings are in discovery.md.
Metadata
Release files for builtwith-official 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| builtwith_official-0.1.1.tar.gz | 28.0 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| builtwith_official-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 46.8 kB
Release files / builtwith_official-0.1.1.tar.gz
| Download URL | builtwith_official-0.1.1.tar.gz |
|---|---|
| Size | 28.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5b97ea34425dd17d3d81e61b555b69afd8608613296f0ebf51c140baa8f15b36
|
|
BLAKE2b-256 checksum How to use checksums |
5f6f1962e1e8fb23c7e5112db9092b11cdcfa679aa795b20c1c2f550beddf395
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.7
|
Release files / builtwith_official-0.1.1-py3-none-any.whl
| Download URL | builtwith_official-0.1.1-py3-none-any.whl |
|---|---|
| Size | 18.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
aa800e984234446ffa11157880ab78a53dd788db16b5f030886e013d44a034ab
|
|
BLAKE2b-256 checksum How to use checksums |
50ef5272b13644a386e439283f699c8e88c215cac73a4a9b047c15f5048488f7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.7
|
Security for builtwith-official 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.