The whole web, as function calls.
Official Python SDK for WebUplink.
Installation
pip install webuplink
Quickstart
from webuplink import WebUplink
client = WebUplink() # reads WEBUPLINK_API_KEY from env
# Browse a page — get back structured, callable tools
page = client.browse("https://example.com")
print(page.summary)
print(page.tools) # [Tool(name='...', description='...', params=[...]), ...]
# Execute a tool discovered on the page
tool = page.tools[0]
result = client.browse(
session_id=page.session_id,
tool=tool.name,
params={tool.params[0].name: "some value"},
)
# Clean up
client.close_session(page.session_id)
Async
from webuplink import AsyncWebUplink
async with AsyncWebUplink() as client:
page = await client.browse("https://example.com")
print(page.tools)
What you can build
- AI agents that act on the web — browse any site, get back named, callable tool definitions, execute actions
- No selectors, no scraping — WebUplink understands pages and generates callable tools automatically
- Multi-step workflows — sessions persist across navigations, so your agent can search → filter → select → checkout
- Any website, zero configuration — works on sites you've never seen before
Error handling
Every non-2xx response raises a typed WebUplinkError carrying the machine-readable code, HTTP status_code, and request_id (cite it in support tickets):
from webuplink import WebUplink, WebUplinkError
client = WebUplink()
try:
page = client.browse("https://example.com")
except WebUplinkError as err:
print(err.code) # e.g. 'QUOTA_EXCEEDED', 'SITE_BLOCKED'
print(err.status_code) # e.g. 429, 502
print(err.request_id) # 'req-abc-123'
Transient error responses that carry retry_after (e.g. BROWSER_ERROR, AI_PROCESSING_ERROR) are retried automatically for observe-only requests. Raw transport failures for any browse POST are not retried and have retryable = False, because the server may already have received the request; idempotent GET/DELETE operations retain bounded transport retries. SITE_BLOCKED — the site served a bot-verification challenge or access-denied page; the request is not billed — carries no retry_after and is never auto-retried. Tool executions are never auto-retried (non-idempotent), and errors from tool-bearing calls expose retryable = False even when the server includes a diagnostic retry_after.
Full error reference at webuplink.ai/docs/errors.
Documentation
Full reference at webuplink.ai/docs.
Contributing
git clone https://github.com/webuplink-dev/webuplink-python.git
cd webuplink-python
pip install -e ".[dev]"
pytest
License
MIT
Metadata
Release files for webuplink 1.1.0
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 | Actions |
|---|---|---|---|---|
| webuplink-1.1.0.tar.gz | 18.3 kB | With provenance | Details for webuplink-1.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| webuplink-1.1.0-py3-none-any.whl | Python 3 | none | any | Details for webuplink-1.1.0-py3-none-any.whl |
Total release size: 32.9 kB
Release files / webuplink-1.1.0.tar.gz
| Download URL | webuplink-1.1.0.tar.gz |
|---|---|
| Size | 18.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c68e71521afc94528249e7331108613598bb3ed39bacd3d4cbed2f3c2f2dde26
|
|
BLAKE2b-256 checksum How to use checksums |
cd34c4cf84fd675782dfb3fdb0a106ff8a207805ef7ae610f1089cfd2b71b7c1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 2, 2026.
Transparency logRelease files / webuplink-1.1.0-py3-none-any.whl
| Download URL | webuplink-1.1.0-py3-none-any.whl |
|---|---|
| Size | 14.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
61c3fe76d9d53c95a2ca4063d3af9033b9ff9fb73379b3d28221f2c0047ca54f
|
|
BLAKE2b-256 checksum How to use checksums |
9d00fadce5bf9bca2ff815c128aef0491c61c67b5fa34af02ee86097fa28ce54
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 2, 2026.
Transparency logSecurity for webuplink 1.1.0
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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for webuplink-1.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 2, 2026.
Transparency logA 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.
To learn more about protecting yourself from malicious actors, visit our package security documentation.