Skip to main content

cracked-ai (Python)

Zero-dependency Python client for Cracked, the tool router for agents: one API key, one balance, 50,000+ tools (scrapers, search, data, AI models). Discover a tool in natural language, inspect its schema, run it, poll if it is asynchronous.

Publishing to PyPI soon. Until then install from the repo path:

pip install ./sdk/python            # from the repo root
# or, once published:
pip install cracked-ai

Python 3.9+. Uses only the standard library (urllib).

Quick start

import os
from cracked_ai import Cracked, CrackedError

c = Cracked()  # reads CRACKED_API_KEY; base URL from CRACKED_BASE_URL (default https://cracked.ai/v1)

hits = c.discover("weather forecast for a lat/long", limit=5)["results"]
best = hits[0]
schema = c.inspect(best["provider"], best["endpoint"])["input"]["body"]   # JSON Schema, never guess fields

rec = c.run("open-meteo", "/forecast", {"latitude": 30.27, "longitude": -97.74})
print(rec["status"], rec["billing"]["totalUsd"])
print(rec["output"])

No key yet? Register an agent workspace with no human in the loop (trial credit included):

reg = Cracked.register_agent(name="my-agent")
reg.client.run(...)            # ready to use
print(reg.api_key)             # shown once: store it as CRACKED_API_KEY
print(reg.claim_url)           # give this to your human: adds credit, unlocks top-ups

Methods

Method Endpoint Notes
discover(query, limit=8, live_only=None, min_score=None, category=None, provider=None, include_apify=None, include_unavailable=None) POST /discover Returns {query, count, results}
inspect(provider, endpoint) POST /inspect Schema in ["input"]["body"], price, health
run(provider, endpoint, input=None, wait=True, poll=None, webhook_url=None, timeout=300, poll_wait=30) POST /run Returns a RunRecord; polls on 202 when poll (defaults to wait)
run_capability(capability, input=None, ...) POST /run {capability} Smart run: Cracked picks the provider and falls back. Adds routedTo, attempts
capabilities(id=None) GET /capabilities?id= List capabilities (input schema + ranked candidates), or one by id. No auth
get_run(run_id, wait=None) GET /runs/{id}?wait= wait long-polls up to 100 s
wait_for(run_id, timeout=300, poll_wait=30) polls GET /runs/{id} Raises CrackedTimeout (with .record) if still RUNNING
stop(run_id) POST /runs/{id}/stop 409 if already finished
runs(limit=25) GET /runs Recent runs, no output bodies
feedback(run_id, ok, note=None) POST /runs/{id}/feedback Thumbs up/down; small bounty on claimed workspaces
balance() GET /wallet/balance balance, lifetimeTopUp, lifetimeSpend
whoami() GET /auth/whoami
referrals() / referral_link() GET /referrals Share the link: both sides get credit
bounty_program() GET /bounties/program Public, no auth
bounties() GET /bounties Your bounty ledger
claim_bounty(url) POST /bounties Backlink/listing bounty for a page carrying your referral link
Cracked.register_agent(name=None, ref=None, base_url=None) POST /agents/register Classmethod, no auth. Returns AgentRegistration(client, api_key, claim_url, referral_url, ...)

All responses are plain dicts typed as TypedDicts (RunRecord, SmartRunRecord, DiscoverResult, InspectResult, Balance, ...). Import them from cracked_ai.

Async runs

Scrapers marked async: true in discover results can take minutes. Either let the client poll:

rec = c.run("apify", "/apify/instagram-profile-scraper", {"usernames": ["nike"]}, wait=False, poll=True, timeout=600)

or drive it yourself:

rec = c.run("apify", "/apify/instagram-profile-scraper", {"usernames": ["nike"]}, wait=False)   # HTTP 202, status RUNNING
rec = c.wait_for(rec["runId"], timeout=600)                                                     # or c.get_run(id, wait=30) in a loop
c.stop(rec["runId"])                                                                            # abort if needed

Terminal statuses: COMPLETED, FAILED, BLOCKED, STOPPED, TIMED_OUT. COMPLETED with providerResponse.httpStatus == 404 means the provider found nothing; that is not an error. BLOCKED (HTTP 503, not billed) means the provider needs your own key: add it at /app/connections or pick another result.

Errors

Every non-2xx response raises CrackedError with .status, .code, .message (and .run_id when relevant):

try:
    c.run("some-provider", "/endpoint", {...})
except CrackedError as e:
    if e.insufficient_funds:   # 402: top up at https://cracked.ai/app/billing or earn credit via bounties
        ...
    elif e.unauthorized:       # 401: bad or missing key
        ...
    elif e.rate_limited:       # 429
        ...

Transport failures raise CrackedError with status == 0 and code NETWORK_ERROR / NETWORK_TIMEOUT.

CLI

python -m cracked_ai discover "instagram profile followers" -l 5
python -m cracked_ai inspect open-meteo /forecast
python -m cracked_ai run open-meteo /forecast '{"latitude":30.27,"longitude":-97.74}'
python -m cracked_ai capability instagram-profile '{"username":"nike"}'
python -m cracked_ai get <runId> -w 30
python -m cracked_ai balance
python -m cracked_ai register my-agent

(cracked-ai ... works too once installed via pip.)

Tests

tests/test_smoke.py hits the live API and is skipped unless CRACKED_API_KEY is set. It spends well under $0.05 (two keyless weather calls).

CRACKED_API_KEY=ck_live_... CRACKED_BASE_URL=https://cracked.ai/v1 python -m pytest sdk/python/tests -q

Publishing

cd sdk/python && python -m pip install build twine && python -m build && twine upload dist/*

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cracked_ai-0.1.0.tar.gz (17.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cracked_ai-0.1.0-py3-none-any.whl (16.4 kB view details)

Uploaded Python 3

File details

Details for the file cracked_ai-0.1.0.tar.gz.

File metadata

  • Download URL: cracked_ai-0.1.0.tar.gz
  • Upload date:
  • Size: 17.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.3

File hashes

Hashes for cracked_ai-0.1.0.tar.gz
Algorithm Hash digest
SHA256 e5af48675f952167de66c70160deb9048a09b1f55467833547280da15fb1d779
MD5 9b4b9121f6af4c08c77e6f4c3a4d6390
BLAKE2b-256 1490387230fd393b594c3fdf8782b3f12c9e612acdc097f3bbb8146cf7103ea4

See more details on using hashes here.

File details

Details for the file cracked_ai-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: cracked_ai-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 16.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.3

File hashes

Hashes for cracked_ai-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e3472a13ed17ae94f195cf1ef2fab12aedecdbb258be1a6c82780232861a637f
MD5 fe0e6518af8d5965211dfa4bdf606005
BLAKE2b-256 e0f090d662e11ed4e30b51a998b7115becb3ec9a39eb3240986c57f5b84dfd6b

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page