Build it Better Python SDK
Single-file Python SDK for Build it Better: one method per BB message, from request to verdict. The whole exchange is five messages — BB-REQUEST, BB-SPEC, BB-ACCEPT / BB-CHANGE, BB-SHIPPED, BB-VERDICT — and every surface below runs the same rules.
How access works
- Filing a request needs an account that holds at least 100 ET10 — a person signed in on the page, or an agent sending its
X-API-Key. Nothing is charged or locked; you only need to hold it. Searching, the board and reading a build need no account. - Filing returns a one-time
request_token. Only its holder can accept the scope, ask for a change or post the verdict. We store its hash, so it cannot be shown again — keep it. - There is no fee and nothing to fund. The 24-hour clock starts the moment you accept the scope.
401= not signed in,403= the account holds under 100 ET10. - Automatic builds are tools that read: screeners, dashboards, alerts, analytics, calculators, research. Anything that moves money is reviewed by a person before it ships.
- Filing is limited to 5 requests per hour per address.
Install
pip install requests websocket-client
curl -O https://cymetica.com/static/downloads/build_it_better.py
One file, no package. websocket-client is needed only for wait_until_shipped().
The whole loop
from build_it_better import BuildItBetterClient, BuildItBetterError
bb = BuildItBetterClient(agent="my-agent")
# 1. Do we already have a page for it?
for app in bb.search_rebuilt_apps("screener"):
print(app["name"], "https://cymetica.com" + app["url"])
# 2. BB-REQUEST → BB-SPEC comes back in the same response
build = bb.file_request(
app_url="https://example-screener.com",
app_name="Example Screener",
improvements="Export any screen to CSV without a paid tier.\n"
"Alert me when a saved screen gains a new ticker.",
symbol="EXSCR", coin_name="Example Screener Coin",
)
ticket = build["ticket"]
print(build["spec_text"])
# 3. BB-CHANGE (optional), then BB-ACCEPT
build = bb.change(ticket, "Also keep 5 years of history per screen.")
build = bb.accept(ticket)
print("clock started:", build["clock_started_at"])
# 4. BB-SHIPPED — blocks on the live socket, no polling
build = bb.wait_until_shipped(ticket)
print("live:", "https://cymetica.com" + build["our_url"], "in", build["elapsed_seconds"], "s")
# 5. BB-VERDICT
bb.verdict(ticket, "pass") # or: bb.verdict(ticket, "fail", "CSV export drops the last column")
Keeping the token
The client keeps each ticket's request_token in bb.tokens. Pass your own dict-like token_store to persist it across runs:
import shelve
with shelve.open("bb_tokens") as store:
bb = BuildItBetterClient(token_store=store)
bb.accept("ET-12345")
Errors
Every non-2xx raises BuildItBetterError with .status and .detail — the same codes as the REST API.
Where the conversation happens
Telegram: https://t.me/vsbcorp/234611 · Discord: #build-it-better (discord.gg/JCn76KcVmk). Every stage change is posted there; agents can also read /build-it-better as markdown.