Gakido
High-performance CPython HTTP client focused on browser impersonation, anti-bot evasion, and speed.
Features
- Browser profiles (Chrome/Firefox/Safari/Edge/Tor aliases)
- JA3/Akamai-style TLS overrides (
tls_configuration_options,ExtraFingerprints) - HTTP/1.1, HTTP/2, and HTTP/3 (QUIC) support
- HTTP/3 optimized for Cloudflare and CDN targets
- Automatic compression (gzip, deflate, brotli) with profile-based Accept-Encoding
- Sync + async clients, connection pooling
- Multipart uploads
- Minimal WebSocket client
- Optional native HTTP fast-path (
gakido_core, HTTP only) - 96 browser profiles (24 base + 72 aliases) for Chrome, Firefox, Safari, Edge, Opera, Brave, Vivaldi, Tor
- Antibot benchmark for testing impersonation against detection systems
Install
pip:
pip install gakido
pip install gakido[h3] # with HTTP/3 support
pip install gakido[dev] # development dependencies
uv:
uv add gakido
uv add gakido[h3] # with HTTP/3 support
uv add gakido[dev] # development dependencies
Quick start (sync)
from gakido import Client
c = Client(impersonate="chrome_120") # force_http1 defaults to True
r = c.get("https://example.com")
print(r.status_code, r.text[:200])
Async
import asyncio
from gakido.aio import AsyncClient
async def main():
async with AsyncClient(impersonate="chrome_120") as c:
r = await c.get("https://httpbin.org/get")
print(r.status_code)
asyncio.run(main())
Multipart upload
files = {"file": ("test.txt", b"hello", "text/plain")}
data = {"foo": "bar"}
with Client() as c:
r = c.post("https://httpbin.org/post", data=data, files=files)
print(r.json())
TLS overrides (JA3-like)
from gakido import Client, ExtraFingerprints
ja3_str = "771,4866-4867-4865-49196,0-11-10,29,0"
extra_fp = ExtraFingerprints(alpn=["http/1.1"])
c = Client(
impersonate="chrome_120",
tls_configuration_options={"ja3_str": ja3_str, "extra_fp": extra_fp},
)
r = c.get("https://tls.browserleaks.com/json")
print(r.json().get("ja3_hash"))
WebSocket
from gakido.websocket import WebSocket
ws = WebSocket.connect("echo.websocket.events", 443, "/", headers=[], tls=True)
ws.send_text("hello")
op, payload = ws.recv()
print(payload.decode(errors="ignore"))
ws.close()
Proxies
gakido supports HTTP, SOCKS5, and SOCKS5H proxies for both sync and async clients.
from gakido import Client, AsyncClient
# Sync client with HTTP or SOCKS5 proxy
c = Client()
r = c.get("http://httpbin.org/ip", proxy="http://127.0.0.1:8080")
r = c.get("http://httpbin.org/ip", proxy="socks5://127.0.0.1:1080")
r = c.get("http://httpbin.org/ip", proxy="socks5h://user:pass@127.0.0.1:1080") # proxy resolves hostname
print(r.text)
# Async client with proxy pool
async_client = AsyncClient(proxy_pool=[
"http://proxy1:8080",
"socks5://proxy2:1080",
"socks5h://user:pass@proxy3:1080",
])
r = await async_client.get("http://httpbin.org/ip")
print(r.text)
Retry with Exponential Backoff
gakido supports configurable retry with exponential backoff for both sync and async clients.
from gakido import Client, AsyncClient
import time
# Sync client with retry
client = Client(
max_retries=3, # Up to 3 retry attempts (4 total attempts)
retry_base_delay=0.5, # Start with 0.5s delay
retry_max_delay=30.0, # Cap delay at 30s
retry_jitter=True, # Add random jitter to avoid thundering herd
)
try:
resp = client.get("http://flaky.example.com")
except Exception as e:
print(f"Failed after retries: {e}")
# Async client with retry
async_client = AsyncClient(
max_retries=2,
retry_base_delay=1.0,
retry_jitter=False, # Predictable delays for testing
)
resp = await async_client.get("http://api.example.com")
# Retryable status codes (by default): 408, 429, 500, 502, 503, 504, 507, 511
# Retryable exceptions (by default): ConnectionError, TimeoutError, OSError
See [Retry Documentation](docs/retry.md) for detailed information about retry options and best practices.
HTTP/3 (QUIC) for Cloudflare/CDN
import asyncio
from gakido import AsyncClient, is_http3_available
async def main():
print(f"HTTP/3 available: {is_http3_available()}")
async with AsyncClient(
impersonate="chrome_120",
http3=True, # Enable HTTP/3
http3_fallback=True, # Fall back to H1/H2 if H3 fails
) as c:
r = await c.get("https://cloudflare.com/cdn-cgi/trace")
print(f"HTTP/{r.http_version}: {r.status_code}")
asyncio.run(main())
Notes
force_http1=Trueby default for compatibility; setforce_http1=Falseto allow ALPN h2.http3=Trueenables HTTP/3 (QUIC) for compatible targets (requirespip install gakido[h3]).auto_decompress=Trueby default: uses profile's Accept-Encoding (gzip, deflate, br) and auto-decompresses responses.- Set
auto_decompress=Falseto disable compression and receive raw responses. - Native core (
gakido_core) is HTTP-only; HTTPS still uses the Python path.
Release files for gakido 0.1.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| gakido-0.1.5.tar.gz | 85.2 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| gakido-0.1.5-py3-none-any.whl | Python 3 | none | any | Details |
| gakido-0.1.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl | CPython 3.13 | CPython 3.13 | Linux glibc 2.28+ x86-64, Linux glibc 2.5+ x86-64 | Details |
| gakido-0.1.5-cp313-cp313-macosx_11_0_arm64.whl | CPython 3.13 | CPython 3.13 | macOS 11.0+ ARM64 | Details |
| gakido-0.1.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl | CPython 3.12 | CPython 3.12 | Linux glibc 2.5+ x86-64, Linux glibc 2.28+ x86-64 | Details |
| gakido-0.1.5-cp312-cp312-macosx_11_0_arm64.whl | CPython 3.12 | CPython 3.12 | macOS 11.0+ ARM64 | Details |
| gakido-0.1.5-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl | CPython 3.11 | CPython 3.11 | Linux glibc 2.28+ x86-64, Linux glibc 2.5+ x86-64 | Details |
| gakido-0.1.5-cp311-cp311-macosx_11_0_arm64.whl | CPython 3.11 | CPython 3.11 | macOS 11.0+ ARM64 | Details |
Total release size: 557.3 kB
Release files / gakido-0.1.5.tar.gz
| Download URL | gakido-0.1.5.tar.gz |
|---|---|
| Size | 85.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c9490f2624ed97b3573e3dfc981f77dcf324426b1e42571b6a0c1559c58bec36
|
|
BLAKE2b-256 checksum How to use checksums |
50f87199d32cb91c3efc00a32358c1e4c84e4348843806e3a0acb6bfacead782
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Release files / gakido-0.1.5-py3-none-any.whl
| Download URL | gakido-0.1.5-py3-none-any.whl |
|---|---|
| Size | 53.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9576b1f264aa261f1b21fb3921134d0c1c5c97afdedb9e7362b677b819382b4f
|
|
BLAKE2b-256 checksum How to use checksums |
962b697a048186d5c26ecca8bf6215e5c014dfe97009b5502ecf21fd8c846309
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.10
|
Release files / gakido-0.1.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
| Download URL | gakido-0.1.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl |
|---|---|
| Size | 79.3 kB |
| Tags | CPython 3.13 Linux glibc 2.28+ x86-64 Linux glibc 2.5+ x86-64 |
|
SHA-256 checksum How to use checksums |
e5faadf9ee72ee62f27752a00306a337837454958c3d61fda0762c472823d55c
|
|
BLAKE2b-256 checksum How to use checksums |
d8d67dfb74e6479180643b01b8ddfef14fe9aad2b9a3ec59885bcedb33b13772
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Release files / gakido-0.1.5-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | gakido-0.1.5-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 61.0 kB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
8f87a8a2c9155f51b646cd0379037ab91de1ed4c891eb5939325a56e6479e53d
|
|
BLAKE2b-256 checksum How to use checksums |
a7025b26d1d8116343b087b6f75ada159efda7ba22286d0c01af7d6240141d29
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.4
|
Release files / gakido-0.1.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
| Download URL | gakido-0.1.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl |
|---|---|
| Size | 79.3 kB |
| Tags | CPython 3.12 Linux glibc 2.28+ x86-64 Linux glibc 2.5+ x86-64 |
|
SHA-256 checksum How to use checksums |
8c434e7335f250574fd4d1212acd10c03634abb8c29587ddb3b926dfd12d7ded
|
|
BLAKE2b-256 checksum How to use checksums |
d3a88930aa29b4f3f834fde352bb672eb068bd1b23b5ad96c228db175d2b54ce
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Release files / gakido-0.1.5-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | gakido-0.1.5-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 61.0 kB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
0a0b2d4dcb75c4e68695dc8b545f010d48628d7fdb79db89ad37582ad8c58e96
|
|
BLAKE2b-256 checksum How to use checksums |
354e2e0da548c4fe5f7f54e4189e7a4b78da8e93816e776da845600065bd5479
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.4
|
Release files / gakido-0.1.5-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
| Download URL | gakido-0.1.5-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl |
|---|---|
| Size | 77.1 kB |
| Tags | CPython 3.11 Linux glibc 2.28+ x86-64 Linux glibc 2.5+ x86-64 |
|
SHA-256 checksum How to use checksums |
788859ca506c04fabf9f37d705d8f54d6f176e1d7185fdf7ccd998d5e2ebddac
|
|
BLAKE2b-256 checksum How to use checksums |
94d8282fed80d1762ac675ca3a62317fe1885f92edf422bd85c66fab91473124
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Release files / gakido-0.1.5-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | gakido-0.1.5-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 61.1 kB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
8305f56269b25c4316af535b3e2954a363313fb7fa8bc1dbd4131795abcf5771
|
|
BLAKE2b-256 checksum How to use checksums |
1f7ff1cc2aa281ce0a438f461acd3be633ed253076a3d0cafbed1451b09cf67c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.4
|