Repository files navigation

TollBit

TollBit: Front Door Access for AI Agents

Web automation, API access, and content access all through a standard entry point.


GitHub starsDocumentationTwitter Follow

TollBit

A managed entry point to any web app, specifically meant for AI agents. Direct, authorized, and reliable agent <-> service interactions for any web service on the internet. Built for web automation, API access, and content access.

Why TollBit Exists

It's no secret that AI agents are going to run the web in the near future. However, for that to become a reality, the way agents interact with the internet needs to change. Currently, agent builders' options are limited to typical developer APIs and/or web automation. While great for demos, these patterns seem like the initial "hack" waiting for a more long term solution.

Developer APIs work well, but there is a very short list beyond the overused Google Drive, Slack, etc. Web automation is extremely slow, unreliable and insecure. Not only that, but most websites don't want bots on them, leading to doing all the grunt work of solving captchas and avoiding getting blocked.

The main reason for all this trouble? The web was not built for agents to be first class citzens.

TollBit aims to build critical infrastructure that opens up new pathways for agents to act on the web, at native speed, and to actually bring real value to their users.

We are building on one ethical principle: agents shouldn't (need to) pretend to be humans on the internet.

This approach solves problems for both sides: website owners gain a reliable way to identify legitimate AI agents, manage their access privileges, and monetize their usage, while AI developers get stable, authorized access to first-party APIs, content, or web UI.

How TollBit Works

TollBit creates a gateway for AI agents through a simple convention:

Any service with a tollbit subdomain (tollbit.example.com) explicitly welcomes agent access with standardized authorization, permissions, and monetization.

We call this subdomain the "front door" - a dedicated entry point built specifically for AI agents, separate from human traffic.

flowchart LR
%% Define the AI agent client
A[AI Agent with<br>Tollbit Client]
%% Define the Tollbit front doors
B1[tollbit.service-a.com]
B2[tollbit.service-b.com]
B3[tollbit.service-c.com]
%% Define the actual services
C1[service-a.com]
C2[service-b.com]
C3[service-c.com]
%% Define the human user (simple)
H[Human User]
%% Connect AI agent to Tollbit front doors
A -->|"HTTP"| B1
A -->|"HTTP"| B2
A -->|"HTTP"| B3
%% Connect human to just service-a
H -->|"Browser"| C1
%% Connect Tollbit front doors to actual services - no labels
B1 --- C1
B2 --- C2
B3 --- C3
Loading

For Service Providers

TollBit lets you monetize AI agent access to your service without building custom infrastructure:

  • Implement once, work with any agent
  • Set different pricing tiers and usage limits
  • Separate human and bot traffic transparently
  • Prevent abuse through standardized authentication

For AI Developers

TollBit gives your agents reliable access to services:

  • One consistent pattern for authentication and access
  • No more brittle web automation that breaks with UI changes
  • Clear permissions model designed for non-human users
  • Focus on building intelligence, not maintaining integration code

tollbit-python-sdk

TollBit's python SDK for interacting with TollBit's services. Pull this directly into your code to make requests; no need to write your own clients. The SDK supports both synchronous and asynchronous calls.

The SDK currently supports the following operations:

Installing

pip install tollbit-python-sdk

Indexing Content

Synchronous

fromtollbitimportcrawl_contentfromtollbitimportcontent_formatsclient=crawl_content.create_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
pages=client.list_content_catalog(
url="https://pioneervalleygazette.com",
page_size=5,
)
forpageinpages.pages:
print(f"URL: {page.page_url} Last Modified: {page.last_mod}")
data=client.crawl_content(url=page.page_url)
print(data.content.main)

For more examples please see examples/crawl_content.py

Asynchronous

fromtollbitimportcrawl_contentfromtollbitimportcontent_formatsclient=crawl_content.create_async_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
pages=awaitclient.list_content_catalog(
url="https://pioneervalleygazette.com",
page_size=5,
)

For more examples please see examples/crawl_content_async.py

Checking Rates

You can use either the use_client or the crawl_client to check rates.

Synchronous

fromtollbitimportuse_contentfromtollbitimportcrawl_contentuse=use_content.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
rate_info=use.get_rate(url="https://pioneervalleygazette.com/daydream")
crawl=crawl_content.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
rate_info=crawl.get_rate(url="https://pioneervalleygazette.com/daydream")

For more examples please see examples/get_rates.py.

Asynchronous

fromtollbitimportuse_contentfromtollbitimportcrawl_contentuse=use_content.create_async_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
rate_info=awaituse.get_rate(url="https://pioneervalleygazette.com/daydream")
crawl=crawl_content.create_async_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
rate_info=awaitcrawl.get_rate(url="https://pioneervalleygazette.com/daydream")

For more examples please see examples/get_rates_async.py

Accessing sanctioned content

Synchronous

fromtollbitimportuse_contentfromtollbitimportlicensesfromtollbitimportcurrenciesclient=use_content.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
data=client.get_sanctioned_content(
url="https://pioneervalleygazette.com/daydream",
max_price_micros=11000000,
currency=currencies.USD,
license_type=licenses.types.ON_DEMAND_LICENSE
)
print(data.content.main)

For more examples please see examples/get_content.py.

Asynchronous

fromtollbitimportuse_contentfromtollbitimportlicensesfromtollbitimportcurrenciesclient=use_content.create_async_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
data=awaitclient.get_sanctioned_content(
url="https://pioneervalleygazette.com/daydream",
max_price_micros=11000000,
currency=currencies.USD,
license_type=licenses.types.ON_DEMAND_LICENSE
)
print(data.content.main)

For more examples please see examples/get_content_async.py.

Self reporting usage

Synchronous

fromtollbitimportself_reportingfromtollbitimportlicensesfromtollbitimportuse_contentreporting_client=self_reporting.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
# Create an array of your usagesusages= [self_reporting.usage(
url="https://pioneervalleygazette.com/daydream",
times_used=1,
license_permissions=[licenses.permissions.LICENSE_PERMISSION_PARTIAL_USE],
license_id="licenses-id-123",
license_type=licenses.types.ON_DEMAND_LICENSE,
)]
# Create an idempotent transaction blocktransaction_block=reporting_client.create_transaction_block(usages)
# Report usagesresult=reporting_client.report(transaction_block)

For more examples please see examples/self_reporting.py

Asynchronous

fromtollbitimportself_reportingfromtollbitimportlicensesfromtollbitimportuse_contentreporting_client=self_reporting.create_async_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
# Create an array of your usagesusages= [self_reporting.usage(
url="https://pioneervalleygazette.com/daydream",
times_used=1,
license_permissions=[licenses.permissions.LICENSE_PERMISSION_PARTIAL_USE],
license_id="licenses-id-123",
license_type=licenses.types.ON_DEMAND_LICENSE,
)]
# Create an idempotent transaction blocktransaction_block=reporting_client.create_transaction_block(usages)
# Report usagesresult=awaitreporting_client.report(transaction_block)

For more examples please see examples/self_reporting_async.py

Search

Synchronous

fromtollbitimportsearchsearch_client=search.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
results=client.search(q="DIY home projects for millenials")

For more examples please see examples/search.py

Asynchronous

fromtollbitimportsearchsearch_client=search.create_async_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
results=awaitclient.search(q="DIY home projects for millenials")

For more examples please see examples/search_async.py

Configuration

request_timeout

All create client function can take the optional parameters request_timeout (float; defaults to 5.0) which sets a timeout for all network requests. Please be aware that some operations use multiple network calls, and the timeout is set for each individual network request not for the client function call overall.

Issues

We have disabled issues for the time being. Please reach out directly to TollBit.

Contributions

We are not currently accepting contributions at this time. Thank you for your interest.

Local setup

For internal development teams only

Requirements

  • pyenv

  • poetry

    pipx install poetry

Setup

make install

Tests

Run standard tests

make tests

Run on all pythons

make matrix-tests

Examples

Example code is available in examples

About

Tollbit's Official Python SDK for interacting with Tollbit's services

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

TollBit

TollBit: Front Door Access for AI Agents

Web automation, API access, and content access all through a standard entry point.


GitHub starsDocumentationTwitter Follow

TollBit

A managed entry point to any web app, specifically meant for AI agents. Direct, authorized, and reliable agent <-> service interactions for any web service on the internet. Built for web automation, API access, and content access.

Why TollBit Exists

It's no secret that AI agents are going to run the web in the near future. However, for that to become a reality, the way agents interact with the internet needs to change. Currently, agent builders' options are limited to typical developer APIs and/or web automation. While great for demos, these patterns seem like the initial "hack" waiting for a more long term solution.

Developer APIs work well, but there is a very short list beyond the overused Google Drive, Slack, etc. Web automation is extremely slow, unreliable and insecure. Not only that, but most websites don't want bots on them, leading to doing all the grunt work of solving captchas and avoiding getting blocked.

The main reason for all this trouble? The web was not built for agents to be first class citzens.

TollBit aims to build critical infrastructure that opens up new pathways for agents to act on the web, at native speed, and to actually bring real value to their users.

We are building on one ethical principle: agents shouldn't (need to) pretend to be humans on the internet.

This approach solves problems for both sides: website owners gain a reliable way to identify legitimate AI agents, manage their access privileges, and monetize their usage, while AI developers get stable, authorized access to first-party APIs, content, or web UI.

How TollBit Works

TollBit creates a gateway for AI agents through a simple convention:

Any service with a tollbit subdomain (tollbit.example.com) explicitly welcomes agent access with standardized authorization, permissions, and monetization.

We call this subdomain the "front door" - a dedicated entry point built specifically for AI agents, separate from human traffic.

flowchart LR
%% Define the AI agent client
A[AI Agent with<br>Tollbit Client]
%% Define the Tollbit front doors
B1[tollbit.service-a.com]
B2[tollbit.service-b.com]
B3[tollbit.service-c.com]
%% Define the actual services
C1[service-a.com]
C2[service-b.com]
C3[service-c.com]
%% Define the human user (simple)
H[Human User]
%% Connect AI agent to Tollbit front doors
A -->|"HTTP"| B1
A -->|"HTTP"| B2
A -->|"HTTP"| B3
%% Connect human to just service-a
H -->|"Browser"| C1
%% Connect Tollbit front doors to actual services - no labels
B1 --- C1
B2 --- C2
B3 --- C3
Loading

For Service Providers

TollBit lets you monetize AI agent access to your service without building custom infrastructure:

  • Implement once, work with any agent
  • Set different pricing tiers and usage limits
  • Separate human and bot traffic transparently
  • Prevent abuse through standardized authentication

For AI Developers

TollBit gives your agents reliable access to services:

  • One consistent pattern for authentication and access
  • No more brittle web automation that breaks with UI changes
  • Clear permissions model designed for non-human users
  • Focus on building intelligence, not maintaining integration code

tollbit-python-sdk

TollBit's python SDK for interacting with TollBit's services. Pull this directly into your code to make requests; no need to write your own clients. The SDK supports both synchronous and asynchronous calls.

The SDK currently supports the following operations:

Installing

pip install tollbit-python-sdk

Indexing Content

Synchronous

fromtollbitimportcrawl_contentfromtollbitimportcontent_formatsclient=crawl_content.create_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
pages=client.list_content_catalog(
url="https://pioneervalleygazette.com",
page_size=5,
)
forpageinpages.pages:
print(f"URL: {page.page_url} Last Modified: {page.last_mod}")
data=client.crawl_content(url=page.page_url)
print(data.content.main)

For more examples please see examples/crawl_content.py

Asynchronous

fromtollbitimportcrawl_contentfromtollbitimportcontent_formatsclient=crawl_content.create_async_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
pages=awaitclient.list_content_catalog(
url="https://pioneervalleygazette.com",
page_size=5,
)

For more examples please see examples/crawl_content_async.py

Checking Rates

You can use either the use_client or the crawl_client to check rates.

Synchronous

fromtollbitimportuse_contentfromtollbitimportcrawl_contentuse=use_content.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
rate_info=use.get_rate(url="https://pioneervalleygazette.com/daydream")
crawl=crawl_content.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
rate_info=crawl.get_rate(url="https://pioneervalleygazette.com/daydream")

For more examples please see examples/get_rates.py.

Asynchronous

fromtollbitimportuse_contentfromtollbitimportcrawl_contentuse=use_content.create_async_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
rate_info=awaituse.get_rate(url="https://pioneervalleygazette.com/daydream")
crawl=crawl_content.create_async_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
rate_info=awaitcrawl.get_rate(url="https://pioneervalleygazette.com/daydream")

For more examples please see examples/get_rates_async.py

Accessing sanctioned content

Synchronous

fromtollbitimportuse_contentfromtollbitimportlicensesfromtollbitimportcurrenciesclient=use_content.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
data=client.get_sanctioned_content(
url="https://pioneervalleygazette.com/daydream",
max_price_micros=11000000,
currency=currencies.USD,
license_type=licenses.types.ON_DEMAND_LICENSE
)
print(data.content.main)

For more examples please see examples/get_content.py.

Asynchronous

fromtollbitimportuse_contentfromtollbitimportlicensesfromtollbitimportcurrenciesclient=use_content.create_async_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
data=awaitclient.get_sanctioned_content(
url="https://pioneervalleygazette.com/daydream",
max_price_micros=11000000,
currency=currencies.USD,
license_type=licenses.types.ON_DEMAND_LICENSE
)
print(data.content.main)

For more examples please see examples/get_content_async.py.

Self reporting usage

Synchronous

fromtollbitimportself_reportingfromtollbitimportlicensesfromtollbitimportuse_contentreporting_client=self_reporting.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
# Create an array of your usagesusages= [self_reporting.usage(
url="https://pioneervalleygazette.com/daydream",
times_used=1,
license_permissions=[licenses.permissions.LICENSE_PERMISSION_PARTIAL_USE],
license_id="licenses-id-123",
license_type=licenses.types.ON_DEMAND_LICENSE,
)]
# Create an idempotent transaction blocktransaction_block=reporting_client.create_transaction_block(usages)
# Report usagesresult=reporting_client.report(transaction_block)

For more examples please see examples/self_reporting.py

Asynchronous

fromtollbitimportself_reportingfromtollbitimportlicensesfromtollbitimportuse_contentreporting_client=self_reporting.create_async_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
# Create an array of your usagesusages= [self_reporting.usage(
url="https://pioneervalleygazette.com/daydream",
times_used=1,
license_permissions=[licenses.permissions.LICENSE_PERMISSION_PARTIAL_USE],
license_id="licenses-id-123",
license_type=licenses.types.ON_DEMAND_LICENSE,
)]
# Create an idempotent transaction blocktransaction_block=reporting_client.create_transaction_block(usages)
# Report usagesresult=awaitreporting_client.report(transaction_block)

For more examples please see examples/self_reporting_async.py

Search

Synchronous

fromtollbitimportsearchsearch_client=search.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
results=client.search(q="DIY home projects for millenials")

For more examples please see examples/search.py

Asynchronous

fromtollbitimportsearchsearch_client=search.create_async_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
results=awaitclient.search(q="DIY home projects for millenials")

For more examples please see examples/search_async.py

Configuration

request_timeout

All create client function can take the optional parameters request_timeout (float; defaults to 5.0) which sets a timeout for all network requests. Please be aware that some operations use multiple network calls, and the timeout is set for each individual network request not for the client function call overall.

Issues

We have disabled issues for the time being. Please reach out directly to TollBit.

Contributions

We are not currently accepting contributions at this time. Thank you for your interest.

Local setup

For internal development teams only

Requirements

  • pyenv

  • poetry

    pipx install poetry

Setup

make install

Tests

Run standard tests

make tests

Run on all pythons

make matrix-tests

Examples

Example code is available in examples

About

Tollbit's Official Python SDK for interacting with Tollbit's services

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

TollBit

TollBit: Front Door Access for AI Agents

Web automation, API access, and content access all through a standard entry point.


GitHub starsDocumentationTwitter Follow

TollBit

A managed entry point to any web app, specifically meant for AI agents. Direct, authorized, and reliable agent <-> service interactions for any web service on the internet. Built for web automation, API access, and content access.

Why TollBit Exists

It's no secret that AI agents are going to run the web in the near future. However, for that to become a reality, the way agents interact with the internet needs to change. Currently, agent builders' options are limited to typical developer APIs and/or web automation. While great for demos, these patterns seem like the initial "hack" waiting for a more long term solution.

Developer APIs work well, but there is a very short list beyond the overused Google Drive, Slack, etc. Web automation is extremely slow, unreliable and insecure. Not only that, but most websites don't want bots on them, leading to doing all the grunt work of solving captchas and avoiding getting blocked.

The main reason for all this trouble? The web was not built for agents to be first class citzens.

TollBit aims to build critical infrastructure that opens up new pathways for agents to act on the web, at native speed, and to actually bring real value to their users.

We are building on one ethical principle: agents shouldn't (need to) pretend to be humans on the internet.

This approach solves problems for both sides: website owners gain a reliable way to identify legitimate AI agents, manage their access privileges, and monetize their usage, while AI developers get stable, authorized access to first-party APIs, content, or web UI.

How TollBit Works

TollBit creates a gateway for AI agents through a simple convention:

Any service with a tollbit subdomain (tollbit.example.com) explicitly welcomes agent access with standardized authorization, permissions, and monetization.

We call this subdomain the "front door" - a dedicated entry point built specifically for AI agents, separate from human traffic.

flowchart LR
%% Define the AI agent client
A[AI Agent with<br>Tollbit Client]
%% Define the Tollbit front doors
B1[tollbit.service-a.com]
B2[tollbit.service-b.com]
B3[tollbit.service-c.com]
%% Define the actual services
C1[service-a.com]
C2[service-b.com]
C3[service-c.com]
%% Define the human user (simple)
H[Human User]
%% Connect AI agent to Tollbit front doors
A -->|"HTTP"| B1
A -->|"HTTP"| B2
A -->|"HTTP"| B3
%% Connect human to just service-a
H -->|"Browser"| C1
%% Connect Tollbit front doors to actual services - no labels
B1 --- C1
B2 --- C2
B3 --- C3
Loading

For Service Providers

TollBit lets you monetize AI agent access to your service without building custom infrastructure:

  • Implement once, work with any agent
  • Set different pricing tiers and usage limits
  • Separate human and bot traffic transparently
  • Prevent abuse through standardized authentication

For AI Developers

TollBit gives your agents reliable access to services:

  • One consistent pattern for authentication and access
  • No more brittle web automation that breaks with UI changes
  • Clear permissions model designed for non-human users
  • Focus on building intelligence, not maintaining integration code

tollbit-python-sdk

TollBit's python SDK for interacting with TollBit's services. Pull this directly into your code to make requests; no need to write your own clients. The SDK supports both synchronous and asynchronous calls.

The SDK currently supports the following operations:

Installing

pip install tollbit-python-sdk

Indexing Content

Synchronous

fromtollbitimportcrawl_contentfromtollbitimportcontent_formatsclient=crawl_content.create_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
pages=client.list_content_catalog(
url="https://pioneervalleygazette.com",
page_size=5,
)
forpageinpages.pages:
print(f"URL: {page.page_url} Last Modified: {page.last_mod}")
data=client.crawl_content(url=page.page_url)
print(data.content.main)

For more examples please see examples/crawl_content.py

Asynchronous

fromtollbitimportcrawl_contentfromtollbitimportcontent_formatsclient=crawl_content.create_async_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
pages=awaitclient.list_content_catalog(
url="https://pioneervalleygazette.com",
page_size=5,
)

For more examples please see examples/crawl_content_async.py

Checking Rates

You can use either the use_client or the crawl_client to check rates.

Synchronous

fromtollbitimportuse_contentfromtollbitimportcrawl_contentuse=use_content.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
rate_info=use.get_rate(url="https://pioneervalleygazette.com/daydream")
crawl=crawl_content.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
rate_info=crawl.get_rate(url="https://pioneervalleygazette.com/daydream")

For more examples please see examples/get_rates.py.

Asynchronous

fromtollbitimportuse_contentfromtollbitimportcrawl_contentuse=use_content.create_async_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
rate_info=awaituse.get_rate(url="https://pioneervalleygazette.com/daydream")
crawl=crawl_content.create_async_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
rate_info=awaitcrawl.get_rate(url="https://pioneervalleygazette.com/daydream")

For more examples please see examples/get_rates_async.py

Accessing sanctioned content

Synchronous

fromtollbitimportuse_contentfromtollbitimportlicensesfromtollbitimportcurrenciesclient=use_content.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
data=client.get_sanctioned_content(
url="https://pioneervalleygazette.com/daydream",
max_price_micros=11000000,
currency=currencies.USD,
license_type=licenses.types.ON_DEMAND_LICENSE
)
print(data.content.main)

For more examples please see examples/get_content.py.

Asynchronous

fromtollbitimportuse_contentfromtollbitimportlicensesfromtollbitimportcurrenciesclient=use_content.create_async_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
data=awaitclient.get_sanctioned_content(
url="https://pioneervalleygazette.com/daydream",
max_price_micros=11000000,
currency=currencies.USD,
license_type=licenses.types.ON_DEMAND_LICENSE
)
print(data.content.main)

For more examples please see examples/get_content_async.py.

Self reporting usage

Synchronous

fromtollbitimportself_reportingfromtollbitimportlicensesfromtollbitimportuse_contentreporting_client=self_reporting.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
# Create an array of your usagesusages= [self_reporting.usage(
url="https://pioneervalleygazette.com/daydream",
times_used=1,
license_permissions=[licenses.permissions.LICENSE_PERMISSION_PARTIAL_USE],
license_id="licenses-id-123",
license_type=licenses.types.ON_DEMAND_LICENSE,
)]
# Create an idempotent transaction blocktransaction_block=reporting_client.create_transaction_block(usages)
# Report usagesresult=reporting_client.report(transaction_block)

For more examples please see examples/self_reporting.py

Asynchronous

fromtollbitimportself_reportingfromtollbitimportlicensesfromtollbitimportuse_contentreporting_client=self_reporting.create_async_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
# Create an array of your usagesusages= [self_reporting.usage(
url="https://pioneervalleygazette.com/daydream",
times_used=1,
license_permissions=[licenses.permissions.LICENSE_PERMISSION_PARTIAL_USE],
license_id="licenses-id-123",
license_type=licenses.types.ON_DEMAND_LICENSE,
)]
# Create an idempotent transaction blocktransaction_block=reporting_client.create_transaction_block(usages)
# Report usagesresult=awaitreporting_client.report(transaction_block)

For more examples please see examples/self_reporting_async.py

Search

Synchronous

fromtollbitimportsearchsearch_client=search.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
results=client.search(q="DIY home projects for millenials")

For more examples please see examples/search.py

Asynchronous

fromtollbitimportsearchsearch_client=search.create_async_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
results=awaitclient.search(q="DIY home projects for millenials")

For more examples please see examples/search_async.py

Configuration

request_timeout

All create client function can take the optional parameters request_timeout (float; defaults to 5.0) which sets a timeout for all network requests. Please be aware that some operations use multiple network calls, and the timeout is set for each individual network request not for the client function call overall.

Issues

We have disabled issues for the time being. Please reach out directly to TollBit.

Contributions

We are not currently accepting contributions at this time. Thank you for your interest.

Local setup

For internal development teams only

Requirements

  • pyenv

  • poetry

    pipx install poetry

Setup

make install

Tests

Run standard tests

make tests

Run on all pythons

make matrix-tests

Examples

Example code is available in examples

About

Tollbit's Official Python SDK for interacting with Tollbit's services

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

TollBit

TollBit: Front Door Access for AI Agents

Web automation, API access, and content access all through a standard entry point.


GitHub starsDocumentationTwitter Follow

TollBit

A managed entry point to any web app, specifically meant for AI agents. Direct, authorized, and reliable agent <-> service interactions for any web service on the internet. Built for web automation, API access, and content access.

Why TollBit Exists

It's no secret that AI agents are going to run the web in the near future. However, for that to become a reality, the way agents interact with the internet needs to change. Currently, agent builders' options are limited to typical developer APIs and/or web automation. While great for demos, these patterns seem like the initial "hack" waiting for a more long term solution.

Developer APIs work well, but there is a very short list beyond the overused Google Drive, Slack, etc. Web automation is extremely slow, unreliable and insecure. Not only that, but most websites don't want bots on them, leading to doing all the grunt work of solving captchas and avoiding getting blocked.

The main reason for all this trouble? The web was not built for agents to be first class citzens.

TollBit aims to build critical infrastructure that opens up new pathways for agents to act on the web, at native speed, and to actually bring real value to their users.

We are building on one ethical principle: agents shouldn't (need to) pretend to be humans on the internet.

This approach solves problems for both sides: website owners gain a reliable way to identify legitimate AI agents, manage their access privileges, and monetize their usage, while AI developers get stable, authorized access to first-party APIs, content, or web UI.

How TollBit Works

TollBit creates a gateway for AI agents through a simple convention:

Any service with a tollbit subdomain (tollbit.example.com) explicitly welcomes agent access with standardized authorization, permissions, and monetization.

We call this subdomain the "front door" - a dedicated entry point built specifically for AI agents, separate from human traffic.

flowchart LR
%% Define the AI agent client
A[AI Agent with<br>Tollbit Client]
%% Define the Tollbit front doors
B1[tollbit.service-a.com]
B2[tollbit.service-b.com]
B3[tollbit.service-c.com]
%% Define the actual services
C1[service-a.com]
C2[service-b.com]
C3[service-c.com]
%% Define the human user (simple)
H[Human User]
%% Connect AI agent to Tollbit front doors
A -->|"HTTP"| B1
A -->|"HTTP"| B2
A -->|"HTTP"| B3
%% Connect human to just service-a
H -->|"Browser"| C1
%% Connect Tollbit front doors to actual services - no labels
B1 --- C1
B2 --- C2
B3 --- C3
Loading

For Service Providers

TollBit lets you monetize AI agent access to your service without building custom infrastructure:

  • Implement once, work with any agent
  • Set different pricing tiers and usage limits
  • Separate human and bot traffic transparently
  • Prevent abuse through standardized authentication

For AI Developers

TollBit gives your agents reliable access to services:

  • One consistent pattern for authentication and access
  • No more brittle web automation that breaks with UI changes
  • Clear permissions model designed for non-human users
  • Focus on building intelligence, not maintaining integration code

tollbit-python-sdk

TollBit's python SDK for interacting with TollBit's services. Pull this directly into your code to make requests; no need to write your own clients. The SDK supports both synchronous and asynchronous calls.

The SDK currently supports the following operations:

Installing

pip install tollbit-python-sdk

Indexing Content

Synchronous

fromtollbitimportcrawl_contentfromtollbitimportcontent_formatsclient=crawl_content.create_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
pages=client.list_content_catalog(
url="https://pioneervalleygazette.com",
page_size=5,
)
forpageinpages.pages:
print(f"URL: {page.page_url} Last Modified: {page.last_mod}")
data=client.crawl_content(url=page.page_url)
print(data.content.main)

For more examples please see examples/crawl_content.py

Asynchronous

fromtollbitimportcrawl_contentfromtollbitimportcontent_formatsclient=crawl_content.create_async_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
pages=awaitclient.list_content_catalog(
url="https://pioneervalleygazette.com",
page_size=5,
)

For more examples please see examples/crawl_content_async.py

Checking Rates

You can use either the use_client or the crawl_client to check rates.

Synchronous

fromtollbitimportuse_contentfromtollbitimportcrawl_contentuse=use_content.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
rate_info=use.get_rate(url="https://pioneervalleygazette.com/daydream")
crawl=crawl_content.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
rate_info=crawl.get_rate(url="https://pioneervalleygazette.com/daydream")

For more examples please see examples/get_rates.py.

Asynchronous

fromtollbitimportuse_contentfromtollbitimportcrawl_contentuse=use_content.create_async_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
rate_info=awaituse.get_rate(url="https://pioneervalleygazette.com/daydream")
crawl=crawl_content.create_async_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
rate_info=awaitcrawl.get_rate(url="https://pioneervalleygazette.com/daydream")

For more examples please see examples/get_rates_async.py

Accessing sanctioned content

Synchronous

fromtollbitimportuse_contentfromtollbitimportlicensesfromtollbitimportcurrenciesclient=use_content.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
data=client.get_sanctioned_content(
url="https://pioneervalleygazette.com/daydream",
max_price_micros=11000000,
currency=currencies.USD,
license_type=licenses.types.ON_DEMAND_LICENSE
)
print(data.content.main)

For more examples please see examples/get_content.py.

Asynchronous

fromtollbitimportuse_contentfromtollbitimportlicensesfromtollbitimportcurrenciesclient=use_content.create_async_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
data=awaitclient.get_sanctioned_content(
url="https://pioneervalleygazette.com/daydream",
max_price_micros=11000000,
currency=currencies.USD,
license_type=licenses.types.ON_DEMAND_LICENSE
)
print(data.content.main)

For more examples please see examples/get_content_async.py.

Self reporting usage

Synchronous

fromtollbitimportself_reportingfromtollbitimportlicensesfromtollbitimportuse_contentreporting_client=self_reporting.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
# Create an array of your usagesusages= [self_reporting.usage(
url="https://pioneervalleygazette.com/daydream",
times_used=1,
license_permissions=[licenses.permissions.LICENSE_PERMISSION_PARTIAL_USE],
license_id="licenses-id-123",
license_type=licenses.types.ON_DEMAND_LICENSE,
)]
# Create an idempotent transaction blocktransaction_block=reporting_client.create_transaction_block(usages)
# Report usagesresult=reporting_client.report(transaction_block)

For more examples please see examples/self_reporting.py

Asynchronous

fromtollbitimportself_reportingfromtollbitimportlicensesfromtollbitimportuse_contentreporting_client=self_reporting.create_async_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
# Create an array of your usagesusages= [self_reporting.usage(
url="https://pioneervalleygazette.com/daydream",
times_used=1,
license_permissions=[licenses.permissions.LICENSE_PERMISSION_PARTIAL_USE],
license_id="licenses-id-123",
license_type=licenses.types.ON_DEMAND_LICENSE,
)]
# Create an idempotent transaction blocktransaction_block=reporting_client.create_transaction_block(usages)
# Report usagesresult=awaitreporting_client.report(transaction_block)

For more examples please see examples/self_reporting_async.py

Search

Synchronous

fromtollbitimportsearchsearch_client=search.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
results=client.search(q="DIY home projects for millenials")

For more examples please see examples/search.py

Asynchronous

fromtollbitimportsearchsearch_client=search.create_async_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
results=awaitclient.search(q="DIY home projects for millenials")

For more examples please see examples/search_async.py

Configuration

request_timeout

All create client function can take the optional parameters request_timeout (float; defaults to 5.0) which sets a timeout for all network requests. Please be aware that some operations use multiple network calls, and the timeout is set for each individual network request not for the client function call overall.

Issues

We have disabled issues for the time being. Please reach out directly to TollBit.

Contributions

We are not currently accepting contributions at this time. Thank you for your interest.

Local setup

For internal development teams only

Requirements

  • pyenv

  • poetry

    pipx install poetry

Setup

make install

Tests

Run standard tests

make tests

Run on all pythons

make matrix-tests

Examples

Example code is available in examples

About

Tollbit's Official Python SDK for interacting with Tollbit's services

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

TollBit

TollBit: Front Door Access for AI Agents

Web automation, API access, and content access all through a standard entry point.


GitHub starsDocumentationTwitter Follow

TollBit

A managed entry point to any web app, specifically meant for AI agents. Direct, authorized, and reliable agent <-> service interactions for any web service on the internet. Built for web automation, API access, and content access.

Why TollBit Exists

It's no secret that AI agents are going to run the web in the near future. However, for that to become a reality, the way agents interact with the internet needs to change. Currently, agent builders' options are limited to typical developer APIs and/or web automation. While great for demos, these patterns seem like the initial "hack" waiting for a more long term solution.

Developer APIs work well, but there is a very short list beyond the overused Google Drive, Slack, etc. Web automation is extremely slow, unreliable and insecure. Not only that, but most websites don't want bots on them, leading to doing all the grunt work of solving captchas and avoiding getting blocked.

The main reason for all this trouble? The web was not built for agents to be first class citzens.

TollBit aims to build critical infrastructure that opens up new pathways for agents to act on the web, at native speed, and to actually bring real value to their users.

We are building on one ethical principle: agents shouldn't (need to) pretend to be humans on the internet.

This approach solves problems for both sides: website owners gain a reliable way to identify legitimate AI agents, manage their access privileges, and monetize their usage, while AI developers get stable, authorized access to first-party APIs, content, or web UI.

How TollBit Works

TollBit creates a gateway for AI agents through a simple convention:

Any service with a tollbit subdomain (tollbit.example.com) explicitly welcomes agent access with standardized authorization, permissions, and monetization.

We call this subdomain the "front door" - a dedicated entry point built specifically for AI agents, separate from human traffic.

flowchart LR
%% Define the AI agent client
A[AI Agent with<br>Tollbit Client]
%% Define the Tollbit front doors
B1[tollbit.service-a.com]
B2[tollbit.service-b.com]
B3[tollbit.service-c.com]
%% Define the actual services
C1[service-a.com]
C2[service-b.com]
C3[service-c.com]
%% Define the human user (simple)
H[Human User]
%% Connect AI agent to Tollbit front doors
A -->|"HTTP"| B1
A -->|"HTTP"| B2
A -->|"HTTP"| B3
%% Connect human to just service-a
H -->|"Browser"| C1
%% Connect Tollbit front doors to actual services - no labels
B1 --- C1
B2 --- C2
B3 --- C3
Loading

For Service Providers

TollBit lets you monetize AI agent access to your service without building custom infrastructure:

  • Implement once, work with any agent
  • Set different pricing tiers and usage limits
  • Separate human and bot traffic transparently
  • Prevent abuse through standardized authentication

For AI Developers

TollBit gives your agents reliable access to services:

  • One consistent pattern for authentication and access
  • No more brittle web automation that breaks with UI changes
  • Clear permissions model designed for non-human users
  • Focus on building intelligence, not maintaining integration code

tollbit-python-sdk

TollBit's python SDK for interacting with TollBit's services. Pull this directly into your code to make requests; no need to write your own clients. The SDK supports both synchronous and asynchronous calls.

The SDK currently supports the following operations:

Installing

pip install tollbit-python-sdk

Indexing Content

Synchronous

fromtollbitimportcrawl_contentfromtollbitimportcontent_formatsclient=crawl_content.create_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
pages=client.list_content_catalog(
url="https://pioneervalleygazette.com",
page_size=5,
)
forpageinpages.pages:
print(f"URL: {page.page_url} Last Modified: {page.last_mod}")
data=client.crawl_content(url=page.page_url)
print(data.content.main)

For more examples please see examples/crawl_content.py

Asynchronous

fromtollbitimportcrawl_contentfromtollbitimportcontent_formatsclient=crawl_content.create_async_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
pages=awaitclient.list_content_catalog(
url="https://pioneervalleygazette.com",
page_size=5,
)

For more examples please see examples/crawl_content_async.py

Checking Rates

You can use either the use_client or the crawl_client to check rates.

Synchronous

fromtollbitimportuse_contentfromtollbitimportcrawl_contentuse=use_content.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
rate_info=use.get_rate(url="https://pioneervalleygazette.com/daydream")
crawl=crawl_content.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
rate_info=crawl.get_rate(url="https://pioneervalleygazette.com/daydream")

For more examples please see examples/get_rates.py.

Asynchronous

fromtollbitimportuse_contentfromtollbitimportcrawl_contentuse=use_content.create_async_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
rate_info=awaituse.get_rate(url="https://pioneervalleygazette.com/daydream")
crawl=crawl_content.create_async_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
rate_info=awaitcrawl.get_rate(url="https://pioneervalleygazette.com/daydream")

For more examples please see examples/get_rates_async.py

Accessing sanctioned content

Synchronous

fromtollbitimportuse_contentfromtollbitimportlicensesfromtollbitimportcurrenciesclient=use_content.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
data=client.get_sanctioned_content(
url="https://pioneervalleygazette.com/daydream",
max_price_micros=11000000,
currency=currencies.USD,
license_type=licenses.types.ON_DEMAND_LICENSE
)
print(data.content.main)

For more examples please see examples/get_content.py.

Asynchronous

fromtollbitimportuse_contentfromtollbitimportlicensesfromtollbitimportcurrenciesclient=use_content.create_async_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
data=awaitclient.get_sanctioned_content(
url="https://pioneervalleygazette.com/daydream",
max_price_micros=11000000,
currency=currencies.USD,
license_type=licenses.types.ON_DEMAND_LICENSE
)
print(data.content.main)

For more examples please see examples/get_content_async.py.

Self reporting usage

Synchronous

fromtollbitimportself_reportingfromtollbitimportlicensesfromtollbitimportuse_contentreporting_client=self_reporting.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
# Create an array of your usagesusages= [self_reporting.usage(
url="https://pioneervalleygazette.com/daydream",
times_used=1,
license_permissions=[licenses.permissions.LICENSE_PERMISSION_PARTIAL_USE],
license_id="licenses-id-123",
license_type=licenses.types.ON_DEMAND_LICENSE,
)]
# Create an idempotent transaction blocktransaction_block=reporting_client.create_transaction_block(usages)
# Report usagesresult=reporting_client.report(transaction_block)

For more examples please see examples/self_reporting.py

Asynchronous

fromtollbitimportself_reportingfromtollbitimportlicensesfromtollbitimportuse_contentreporting_client=self_reporting.create_async_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
# Create an array of your usagesusages= [self_reporting.usage(
url="https://pioneervalleygazette.com/daydream",
times_used=1,
license_permissions=[licenses.permissions.LICENSE_PERMISSION_PARTIAL_USE],
license_id="licenses-id-123",
license_type=licenses.types.ON_DEMAND_LICENSE,
)]
# Create an idempotent transaction blocktransaction_block=reporting_client.create_transaction_block(usages)
# Report usagesresult=awaitreporting_client.report(transaction_block)

For more examples please see examples/self_reporting_async.py

Search

Synchronous

fromtollbitimportsearchsearch_client=search.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
results=client.search(q="DIY home projects for millenials")

For more examples please see examples/search.py

Asynchronous

fromtollbitimportsearchsearch_client=search.create_async_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
results=awaitclient.search(q="DIY home projects for millenials")

For more examples please see examples/search_async.py

Configuration

request_timeout

All create client function can take the optional parameters request_timeout (float; defaults to 5.0) which sets a timeout for all network requests. Please be aware that some operations use multiple network calls, and the timeout is set for each individual network request not for the client function call overall.

Issues

We have disabled issues for the time being. Please reach out directly to TollBit.

Contributions

We are not currently accepting contributions at this time. Thank you for your interest.

Local setup

For internal development teams only

Requirements

  • pyenv

  • poetry

    pipx install poetry

Setup

make install

Tests

Run standard tests

make tests

Run on all pythons

make matrix-tests

Examples

Example code is available in examples

About

Tollbit's Official Python SDK for interacting with Tollbit's services

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

TollBit

TollBit: Front Door Access for AI Agents

Web automation, API access, and content access all through a standard entry point.


GitHub starsDocumentationTwitter Follow

TollBit

A managed entry point to any web app, specifically meant for AI agents. Direct, authorized, and reliable agent <-> service interactions for any web service on the internet. Built for web automation, API access, and content access.

Why TollBit Exists

It's no secret that AI agents are going to run the web in the near future. However, for that to become a reality, the way agents interact with the internet needs to change. Currently, agent builders' options are limited to typical developer APIs and/or web automation. While great for demos, these patterns seem like the initial "hack" waiting for a more long term solution.

Developer APIs work well, but there is a very short list beyond the overused Google Drive, Slack, etc. Web automation is extremely slow, unreliable and insecure. Not only that, but most websites don't want bots on them, leading to doing all the grunt work of solving captchas and avoiding getting blocked.

The main reason for all this trouble? The web was not built for agents to be first class citzens.

TollBit aims to build critical infrastructure that opens up new pathways for agents to act on the web, at native speed, and to actually bring real value to their users.

We are building on one ethical principle: agents shouldn't (need to) pretend to be humans on the internet.

This approach solves problems for both sides: website owners gain a reliable way to identify legitimate AI agents, manage their access privileges, and monetize their usage, while AI developers get stable, authorized access to first-party APIs, content, or web UI.

How TollBit Works

TollBit creates a gateway for AI agents through a simple convention:

Any service with a tollbit subdomain (tollbit.example.com) explicitly welcomes agent access with standardized authorization, permissions, and monetization.

We call this subdomain the "front door" - a dedicated entry point built specifically for AI agents, separate from human traffic.

flowchart LR
%% Define the AI agent client
A[AI Agent with<br>Tollbit Client]
%% Define the Tollbit front doors
B1[tollbit.service-a.com]
B2[tollbit.service-b.com]
B3[tollbit.service-c.com]
%% Define the actual services
C1[service-a.com]
C2[service-b.com]
C3[service-c.com]
%% Define the human user (simple)
H[Human User]
%% Connect AI agent to Tollbit front doors
A -->|"HTTP"| B1
A -->|"HTTP"| B2
A -->|"HTTP"| B3
%% Connect human to just service-a
H -->|"Browser"| C1
%% Connect Tollbit front doors to actual services - no labels
B1 --- C1
B2 --- C2
B3 --- C3
Loading

For Service Providers

TollBit lets you monetize AI agent access to your service without building custom infrastructure:

  • Implement once, work with any agent
  • Set different pricing tiers and usage limits
  • Separate human and bot traffic transparently
  • Prevent abuse through standardized authentication

For AI Developers

TollBit gives your agents reliable access to services:

  • One consistent pattern for authentication and access
  • No more brittle web automation that breaks with UI changes
  • Clear permissions model designed for non-human users
  • Focus on building intelligence, not maintaining integration code

tollbit-python-sdk

TollBit's python SDK for interacting with TollBit's services. Pull this directly into your code to make requests; no need to write your own clients. The SDK supports both synchronous and asynchronous calls.

The SDK currently supports the following operations:

Installing

pip install tollbit-python-sdk

Indexing Content

Synchronous

fromtollbitimportcrawl_contentfromtollbitimportcontent_formatsclient=crawl_content.create_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
pages=client.list_content_catalog(
url="https://pioneervalleygazette.com",
page_size=5,
)
forpageinpages.pages:
print(f"URL: {page.page_url} Last Modified: {page.last_mod}")
data=client.crawl_content(url=page.page_url)
print(data.content.main)

For more examples please see examples/crawl_content.py

Asynchronous

fromtollbitimportcrawl_contentfromtollbitimportcontent_formatsclient=crawl_content.create_async_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
pages=awaitclient.list_content_catalog(
url="https://pioneervalleygazette.com",
page_size=5,
)

For more examples please see examples/crawl_content_async.py

Checking Rates

You can use either the use_client or the crawl_client to check rates.

Synchronous

fromtollbitimportuse_contentfromtollbitimportcrawl_contentuse=use_content.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
rate_info=use.get_rate(url="https://pioneervalleygazette.com/daydream")
crawl=crawl_content.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
rate_info=crawl.get_rate(url="https://pioneervalleygazette.com/daydream")

For more examples please see examples/get_rates.py.

Asynchronous

fromtollbitimportuse_contentfromtollbitimportcrawl_contentuse=use_content.create_async_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
rate_info=awaituse.get_rate(url="https://pioneervalleygazette.com/daydream")
crawl=crawl_content.create_async_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
rate_info=awaitcrawl.get_rate(url="https://pioneervalleygazette.com/daydream")

For more examples please see examples/get_rates_async.py

Accessing sanctioned content

Synchronous

fromtollbitimportuse_contentfromtollbitimportlicensesfromtollbitimportcurrenciesclient=use_content.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
data=client.get_sanctioned_content(
url="https://pioneervalleygazette.com/daydream",
max_price_micros=11000000,
currency=currencies.USD,
license_type=licenses.types.ON_DEMAND_LICENSE
)
print(data.content.main)

For more examples please see examples/get_content.py.

Asynchronous

fromtollbitimportuse_contentfromtollbitimportlicensesfromtollbitimportcurrenciesclient=use_content.create_async_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
data=awaitclient.get_sanctioned_content(
url="https://pioneervalleygazette.com/daydream",
max_price_micros=11000000,
currency=currencies.USD,
license_type=licenses.types.ON_DEMAND_LICENSE
)
print(data.content.main)

For more examples please see examples/get_content_async.py.

Self reporting usage

Synchronous

fromtollbitimportself_reportingfromtollbitimportlicensesfromtollbitimportuse_contentreporting_client=self_reporting.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
# Create an array of your usagesusages= [self_reporting.usage(
url="https://pioneervalleygazette.com/daydream",
times_used=1,
license_permissions=[licenses.permissions.LICENSE_PERMISSION_PARTIAL_USE],
license_id="licenses-id-123",
license_type=licenses.types.ON_DEMAND_LICENSE,
)]
# Create an idempotent transaction blocktransaction_block=reporting_client.create_transaction_block(usages)
# Report usagesresult=reporting_client.report(transaction_block)

For more examples please see examples/self_reporting.py

Asynchronous

fromtollbitimportself_reportingfromtollbitimportlicensesfromtollbitimportuse_contentreporting_client=self_reporting.create_async_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
# Create an array of your usagesusages= [self_reporting.usage(
url="https://pioneervalleygazette.com/daydream",
times_used=1,
license_permissions=[licenses.permissions.LICENSE_PERMISSION_PARTIAL_USE],
license_id="licenses-id-123",
license_type=licenses.types.ON_DEMAND_LICENSE,
)]
# Create an idempotent transaction blocktransaction_block=reporting_client.create_transaction_block(usages)
# Report usagesresult=awaitreporting_client.report(transaction_block)

For more examples please see examples/self_reporting_async.py

Search

Synchronous

fromtollbitimportsearchsearch_client=search.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
results=client.search(q="DIY home projects for millenials")

For more examples please see examples/search.py

Asynchronous

fromtollbitimportsearchsearch_client=search.create_async_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
results=awaitclient.search(q="DIY home projects for millenials")

For more examples please see examples/search_async.py

Configuration

request_timeout

All create client function can take the optional parameters request_timeout (float; defaults to 5.0) which sets a timeout for all network requests. Please be aware that some operations use multiple network calls, and the timeout is set for each individual network request not for the client function call overall.

Issues

We have disabled issues for the time being. Please reach out directly to TollBit.

Contributions

We are not currently accepting contributions at this time. Thank you for your interest.

Local setup

For internal development teams only

Requirements

  • pyenv

  • poetry

    pipx install poetry

Setup

make install

Tests

Run standard tests

make tests

Run on all pythons

make matrix-tests

Examples

Example code is available in examples

About

Tollbit's Official Python SDK for interacting with Tollbit's services

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

TollBit

TollBit: Front Door Access for AI Agents

Web automation, API access, and content access all through a standard entry point.


GitHub starsDocumentationTwitter Follow

TollBit

A managed entry point to any web app, specifically meant for AI agents. Direct, authorized, and reliable agent <-> service interactions for any web service on the internet. Built for web automation, API access, and content access.

Why TollBit Exists

It's no secret that AI agents are going to run the web in the near future. However, for that to become a reality, the way agents interact with the internet needs to change. Currently, agent builders' options are limited to typical developer APIs and/or web automation. While great for demos, these patterns seem like the initial "hack" waiting for a more long term solution.

Developer APIs work well, but there is a very short list beyond the overused Google Drive, Slack, etc. Web automation is extremely slow, unreliable and insecure. Not only that, but most websites don't want bots on them, leading to doing all the grunt work of solving captchas and avoiding getting blocked.

The main reason for all this trouble? The web was not built for agents to be first class citzens.

TollBit aims to build critical infrastructure that opens up new pathways for agents to act on the web, at native speed, and to actually bring real value to their users.

We are building on one ethical principle: agents shouldn't (need to) pretend to be humans on the internet.

This approach solves problems for both sides: website owners gain a reliable way to identify legitimate AI agents, manage their access privileges, and monetize their usage, while AI developers get stable, authorized access to first-party APIs, content, or web UI.

How TollBit Works

TollBit creates a gateway for AI agents through a simple convention:

Any service with a tollbit subdomain (tollbit.example.com) explicitly welcomes agent access with standardized authorization, permissions, and monetization.

We call this subdomain the "front door" - a dedicated entry point built specifically for AI agents, separate from human traffic.

flowchart LR
%% Define the AI agent client
A[AI Agent with<br>Tollbit Client]
%% Define the Tollbit front doors
B1[tollbit.service-a.com]
B2[tollbit.service-b.com]
B3[tollbit.service-c.com]
%% Define the actual services
C1[service-a.com]
C2[service-b.com]
C3[service-c.com]
%% Define the human user (simple)
H[Human User]
%% Connect AI agent to Tollbit front doors
A -->|"HTTP"| B1
A -->|"HTTP"| B2
A -->|"HTTP"| B3
%% Connect human to just service-a
H -->|"Browser"| C1
%% Connect Tollbit front doors to actual services - no labels
B1 --- C1
B2 --- C2
B3 --- C3
Loading

For Service Providers

TollBit lets you monetize AI agent access to your service without building custom infrastructure:

  • Implement once, work with any agent
  • Set different pricing tiers and usage limits
  • Separate human and bot traffic transparently
  • Prevent abuse through standardized authentication

For AI Developers

TollBit gives your agents reliable access to services:

  • One consistent pattern for authentication and access
  • No more brittle web automation that breaks with UI changes
  • Clear permissions model designed for non-human users
  • Focus on building intelligence, not maintaining integration code

tollbit-python-sdk

TollBit's python SDK for interacting with TollBit's services. Pull this directly into your code to make requests; no need to write your own clients. The SDK supports both synchronous and asynchronous calls.

The SDK currently supports the following operations:

Installing

pip install tollbit-python-sdk

Indexing Content

Synchronous

fromtollbitimportcrawl_contentfromtollbitimportcontent_formatsclient=crawl_content.create_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
pages=client.list_content_catalog(
url="https://pioneervalleygazette.com",
page_size=5,
)
forpageinpages.pages:
print(f"URL: {page.page_url} Last Modified: {page.last_mod}")
data=client.crawl_content(url=page.page_url)
print(data.content.main)

For more examples please see examples/crawl_content.py

Asynchronous

fromtollbitimportcrawl_contentfromtollbitimportcontent_formatsclient=crawl_content.create_async_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
pages=awaitclient.list_content_catalog(
url="https://pioneervalleygazette.com",
page_size=5,
)

For more examples please see examples/crawl_content_async.py

Checking Rates

You can use either the use_client or the crawl_client to check rates.

Synchronous

fromtollbitimportuse_contentfromtollbitimportcrawl_contentuse=use_content.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
rate_info=use.get_rate(url="https://pioneervalleygazette.com/daydream")
crawl=crawl_content.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
rate_info=crawl.get_rate(url="https://pioneervalleygazette.com/daydream")

For more examples please see examples/get_rates.py.

Asynchronous

fromtollbitimportuse_contentfromtollbitimportcrawl_contentuse=use_content.create_async_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
rate_info=awaituse.get_rate(url="https://pioneervalleygazette.com/daydream")
crawl=crawl_content.create_async_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
rate_info=awaitcrawl.get_rate(url="https://pioneervalleygazette.com/daydream")

For more examples please see examples/get_rates_async.py

Accessing sanctioned content

Synchronous

fromtollbitimportuse_contentfromtollbitimportlicensesfromtollbitimportcurrenciesclient=use_content.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
data=client.get_sanctioned_content(
url="https://pioneervalleygazette.com/daydream",
max_price_micros=11000000,
currency=currencies.USD,
license_type=licenses.types.ON_DEMAND_LICENSE
)
print(data.content.main)

For more examples please see examples/get_content.py.

Asynchronous

fromtollbitimportuse_contentfromtollbitimportlicensesfromtollbitimportcurrenciesclient=use_content.create_async_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
data=awaitclient.get_sanctioned_content(
url="https://pioneervalleygazette.com/daydream",
max_price_micros=11000000,
currency=currencies.USD,
license_type=licenses.types.ON_DEMAND_LICENSE
)
print(data.content.main)

For more examples please see examples/get_content_async.py.

Self reporting usage

Synchronous

fromtollbitimportself_reportingfromtollbitimportlicensesfromtollbitimportuse_contentreporting_client=self_reporting.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
# Create an array of your usagesusages= [self_reporting.usage(
url="https://pioneervalleygazette.com/daydream",
times_used=1,
license_permissions=[licenses.permissions.LICENSE_PERMISSION_PARTIAL_USE],
license_id="licenses-id-123",
license_type=licenses.types.ON_DEMAND_LICENSE,
)]
# Create an idempotent transaction blocktransaction_block=reporting_client.create_transaction_block(usages)
# Report usagesresult=reporting_client.report(transaction_block)

For more examples please see examples/self_reporting.py

Asynchronous

fromtollbitimportself_reportingfromtollbitimportlicensesfromtollbitimportuse_contentreporting_client=self_reporting.create_async_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
# Create an array of your usagesusages= [self_reporting.usage(
url="https://pioneervalleygazette.com/daydream",
times_used=1,
license_permissions=[licenses.permissions.LICENSE_PERMISSION_PARTIAL_USE],
license_id="licenses-id-123",
license_type=licenses.types.ON_DEMAND_LICENSE,
)]
# Create an idempotent transaction blocktransaction_block=reporting_client.create_transaction_block(usages)
# Report usagesresult=awaitreporting_client.report(transaction_block)

For more examples please see examples/self_reporting_async.py

Search

Synchronous

fromtollbitimportsearchsearch_client=search.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
results=client.search(q="DIY home projects for millenials")

For more examples please see examples/search.py

Asynchronous

fromtollbitimportsearchsearch_client=search.create_async_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
results=awaitclient.search(q="DIY home projects for millenials")

For more examples please see examples/search_async.py

Configuration

request_timeout

All create client function can take the optional parameters request_timeout (float; defaults to 5.0) which sets a timeout for all network requests. Please be aware that some operations use multiple network calls, and the timeout is set for each individual network request not for the client function call overall.

Issues

We have disabled issues for the time being. Please reach out directly to TollBit.

Contributions

We are not currently accepting contributions at this time. Thank you for your interest.

Local setup

For internal development teams only

Requirements

  • pyenv

  • poetry

    pipx install poetry

Setup

make install

Tests

Run standard tests

make tests

Run on all pythons

make matrix-tests

Examples

Example code is available in examples

About

Tollbit's Official Python SDK for interacting with Tollbit's services

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

TollBit

TollBit: Front Door Access for AI Agents

Web automation, API access, and content access all through a standard entry point.


GitHub starsDocumentationTwitter Follow

TollBit

A managed entry point to any web app, specifically meant for AI agents. Direct, authorized, and reliable agent <-> service interactions for any web service on the internet. Built for web automation, API access, and content access.

Why TollBit Exists

It's no secret that AI agents are going to run the web in the near future. However, for that to become a reality, the way agents interact with the internet needs to change. Currently, agent builders' options are limited to typical developer APIs and/or web automation. While great for demos, these patterns seem like the initial "hack" waiting for a more long term solution.

Developer APIs work well, but there is a very short list beyond the overused Google Drive, Slack, etc. Web automation is extremely slow, unreliable and insecure. Not only that, but most websites don't want bots on them, leading to doing all the grunt work of solving captchas and avoiding getting blocked.

The main reason for all this trouble? The web was not built for agents to be first class citzens.

TollBit aims to build critical infrastructure that opens up new pathways for agents to act on the web, at native speed, and to actually bring real value to their users.

We are building on one ethical principle: agents shouldn't (need to) pretend to be humans on the internet.

This approach solves problems for both sides: website owners gain a reliable way to identify legitimate AI agents, manage their access privileges, and monetize their usage, while AI developers get stable, authorized access to first-party APIs, content, or web UI.

How TollBit Works

TollBit creates a gateway for AI agents through a simple convention:

Any service with a tollbit subdomain (tollbit.example.com) explicitly welcomes agent access with standardized authorization, permissions, and monetization.

We call this subdomain the "front door" - a dedicated entry point built specifically for AI agents, separate from human traffic.

flowchart LR
%% Define the AI agent client
A[AI Agent with<br>Tollbit Client]
%% Define the Tollbit front doors
B1[tollbit.service-a.com]
B2[tollbit.service-b.com]
B3[tollbit.service-c.com]
%% Define the actual services
C1[service-a.com]
C2[service-b.com]
C3[service-c.com]
%% Define the human user (simple)
H[Human User]
%% Connect AI agent to Tollbit front doors
A -->|"HTTP"| B1
A -->|"HTTP"| B2
A -->|"HTTP"| B3
%% Connect human to just service-a
H -->|"Browser"| C1
%% Connect Tollbit front doors to actual services - no labels
B1 --- C1
B2 --- C2
B3 --- C3
Loading

For Service Providers

TollBit lets you monetize AI agent access to your service without building custom infrastructure:

  • Implement once, work with any agent
  • Set different pricing tiers and usage limits
  • Separate human and bot traffic transparently
  • Prevent abuse through standardized authentication

For AI Developers

TollBit gives your agents reliable access to services:

  • One consistent pattern for authentication and access
  • No more brittle web automation that breaks with UI changes
  • Clear permissions model designed for non-human users
  • Focus on building intelligence, not maintaining integration code

tollbit-python-sdk

TollBit's python SDK for interacting with TollBit's services. Pull this directly into your code to make requests; no need to write your own clients. The SDK supports both synchronous and asynchronous calls.

The SDK currently supports the following operations:

Installing

pip install tollbit-python-sdk

Indexing Content

Synchronous

fromtollbitimportcrawl_contentfromtollbitimportcontent_formatsclient=crawl_content.create_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
pages=client.list_content_catalog(
url="https://pioneervalleygazette.com",
page_size=5,
)
forpageinpages.pages:
print(f"URL: {page.page_url} Last Modified: {page.last_mod}")
data=client.crawl_content(url=page.page_url)
print(data.content.main)

For more examples please see examples/crawl_content.py

Asynchronous

fromtollbitimportcrawl_contentfromtollbitimportcontent_formatsclient=crawl_content.create_async_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
pages=awaitclient.list_content_catalog(
url="https://pioneervalleygazette.com",
page_size=5,
)

For more examples please see examples/crawl_content_async.py

Checking Rates

You can use either the use_client or the crawl_client to check rates.

Synchronous

fromtollbitimportuse_contentfromtollbitimportcrawl_contentuse=use_content.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
rate_info=use.get_rate(url="https://pioneervalleygazette.com/daydream")
crawl=crawl_content.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
rate_info=crawl.get_rate(url="https://pioneervalleygazette.com/daydream")

For more examples please see examples/get_rates.py.

Asynchronous

fromtollbitimportuse_contentfromtollbitimportcrawl_contentuse=use_content.create_async_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
rate_info=awaituse.get_rate(url="https://pioneervalleygazette.com/daydream")
crawl=crawl_content.create_async_client(
secret_key="YOUR API KEY",
user_agent="YOUR USER AGENT"
)
rate_info=awaitcrawl.get_rate(url="https://pioneervalleygazette.com/daydream")

For more examples please see examples/get_rates_async.py

Accessing sanctioned content

Synchronous

fromtollbitimportuse_contentfromtollbitimportlicensesfromtollbitimportcurrenciesclient=use_content.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
data=client.get_sanctioned_content(
url="https://pioneervalleygazette.com/daydream",
max_price_micros=11000000,
currency=currencies.USD,
license_type=licenses.types.ON_DEMAND_LICENSE
)
print(data.content.main)

For more examples please see examples/get_content.py.

Asynchronous

fromtollbitimportuse_contentfromtollbitimportlicensesfromtollbitimportcurrenciesclient=use_content.create_async_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
data=awaitclient.get_sanctioned_content(
url="https://pioneervalleygazette.com/daydream",
max_price_micros=11000000,
currency=currencies.USD,
license_type=licenses.types.ON_DEMAND_LICENSE
)
print(data.content.main)

For more examples please see examples/get_content_async.py.

Self reporting usage

Synchronous

fromtollbitimportself_reportingfromtollbitimportlicensesfromtollbitimportuse_contentreporting_client=self_reporting.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
# Create an array of your usagesusages= [self_reporting.usage(
url="https://pioneervalleygazette.com/daydream",
times_used=1,
license_permissions=[licenses.permissions.LICENSE_PERMISSION_PARTIAL_USE],
license_id="licenses-id-123",
license_type=licenses.types.ON_DEMAND_LICENSE,
)]
# Create an idempotent transaction blocktransaction_block=reporting_client.create_transaction_block(usages)
# Report usagesresult=reporting_client.report(transaction_block)

For more examples please see examples/self_reporting.py

Asynchronous

fromtollbitimportself_reportingfromtollbitimportlicensesfromtollbitimportuse_contentreporting_client=self_reporting.create_async_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
# Create an array of your usagesusages= [self_reporting.usage(
url="https://pioneervalleygazette.com/daydream",
times_used=1,
license_permissions=[licenses.permissions.LICENSE_PERMISSION_PARTIAL_USE],
license_id="licenses-id-123",
license_type=licenses.types.ON_DEMAND_LICENSE,
)]
# Create an idempotent transaction blocktransaction_block=reporting_client.create_transaction_block(usages)
# Report usagesresult=awaitreporting_client.report(transaction_block)

For more examples please see examples/self_reporting_async.py

Search

Synchronous

fromtollbitimportsearchsearch_client=search.create_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
results=client.search(q="DIY home projects for millenials")

For more examples please see examples/search.py

Asynchronous

fromtollbitimportsearchsearch_client=search.create_async_client(
secret_key="YOUR API KEY", user_agent="YOUR USER AGENT"
)
results=awaitclient.search(q="DIY home projects for millenials")

For more examples please see examples/search_async.py

Configuration

request_timeout

All create client function can take the optional parameters request_timeout (float; defaults to 5.0) which sets a timeout for all network requests. Please be aware that some operations use multiple network calls, and the timeout is set for each individual network request not for the client function call overall.

Issues

We have disabled issues for the time being. Please reach out directly to TollBit.

Contributions

We are not currently accepting contributions at this time. Thank you for your interest.

Local setup

For internal development teams only

Requirements

  • pyenv

  • poetry

    pipx install poetry

Setup

make install

Tests

Run standard tests

make tests

Run on all pythons

make matrix-tests

Examples

Example code is available in examples

About

Tollbit's Official Python SDK for interacting with Tollbit's services

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages