Official Eveses SDK — activations, wallet, catalog, proxies, web-unblocker, emails, trial, captcha, fingerprints, webhooks.
Project description
eveses (Python SDK)
Official Python SDK for the Eveses developer API. Activations, wallet, catalog (countries / services / pricing), proxies, web-unblocker, temporary emails, free trials, captcha-solving, browser fingerprints, and webhook signature verification.
Install
pip install eveses
Requires Python 3.9+ and requests.
Quickstart
import os
from eveses import Eveses
client = Eveses(api_key=os.environ["EVESES_API_KEY"])
order = client.activations.create(
country="ua",
service="telegram",
idempotency_key="my-uuid",
)
print(order.order_id, order.phone)
wallet = client.wallet.balance()
print(f"{wallet.available_balance / 100} {wallet.currency}")
Authentication
Every request sends Authorization: Bearer <api_key>. Generate an API key from
your dashboard (Settings → API keys). The token is a Sanctum personal-access
token with kind=api_key.
Activations
order = client.activations.create(
country="ua",
service="telegram",
mode="activation", # or "rent"
duration_minutes=60, # rent only
max_price_cents=100, # optional ceiling
idempotency_key="my-uuid", # also sent as Idempotency-Key header
)
fresh = client.activations.get(order.order_id)
sms = client.activations.sms(order.order_id)
# sms.stored — delivered to us via upstream webhook
# sms.fresh — pulled from upstream provider on demand
client.activations.cancel(order.order_id) # refund-where-supported
client.activations.finish(order.order_id) # mark consumed
Catalog (countries / services / pricing)
Read-only metadata for driving order-creation UX. All three calls hit the
API-key-authenticated /api/v1/numbers/* routes, so the same Bearer token
that creates orders can populate selectors and price tables.
countries = client.catalog.countries(mode="activation").countries
services = client.catalog.services(mode="activation", country="ua").services
pricing = client.catalog.pricing(mode="activation", country="ua", service="telegram")
# pricing.services[0].durations[0].price_cents → 50
mode accepts "activation" or "rent". For rentals, pass
duration_minutes=... to pricing(...) to filter to a single duration.
Proxies
Buy and manage residential (metered, per-GB) and static (per-IP: ISP /
datacenter / IPv6 / sneaker / mobile) proxies. The upstream provider stays
invisible — connection details come back on the white-label host. Hits
/api/account/proxies/*.
# Browse
client.proxy.packages() # residential GB ladder
client.proxy.endpoints() # white-label subdomains + ports
client.proxy.catalog() # static per-IP products/plans
client.proxy.locations(type="residential") # available targeting
client.proxy.quote(type="residential", gb=5) # estimate before buying
# Buy
order = client.proxy.purchase(
type="residential",
gb=5,
subscription=False, # start a monthly residential subscription
idempotency_key="my-uuid",
)
# static per-IP:
# client.proxy.purchase(type="isp", product_id=1, plan_id=2, location_id=3, quantity=2)
# Manage
listing = client.proxy.list() # residential + subscription + orders
client.proxy.usage(from_="2026-06-01", to="2026-06-24")
client.proxy.extend(order.uuid, days=30) # static per-IP order
client.proxy.auto_renew(order.uuid, enabled=True)
client.proxy.reset_sessions() # rotate residential sticky sessions
client.proxy.trial() # one-time proxy free trial
# Residential subscription
client.proxy.subscription_pause()
client.proxy.subscription_resume()
client.proxy.subscription_cancel()
Web Unblocker
Buy and manage a web-unblocker subscription (metered by request count). Hits
/api/account/web-unblocker/*.
client.web_unblocker.packages()
client.web_unblocker.quote(10_000, subscription=False)
client.web_unblocker.access() # credentials + endpoints
client.web_unblocker.purchase(10_000, subscription=False, idempotency_key="my-uuid")
client.web_unblocker.trial() # one-time free trial
client.web_unblocker.subscription_pause()
client.web_unblocker.subscription_resume()
client.web_unblocker.subscription_cancel()
Emails
Buy and manage temporary email addresses and browse received messages. Hits
/api/account/emails/*.
client.emails.domains(site="example.com")
client.emails.quote("mail.example", provider="…")
box = client.emails.purchase("mail.example", idempotency_key="my-uuid")
uuid = box["uuid"]
client.emails.list(include_released=False)
client.emails.get(uuid)
client.emails.messages(uuid, page=1, per_page=20)
client.emails.mark_read(uuid, message_id=123)
client.emails.release(uuid) # delete the address
Trial
Query and activate free-trial access for individual services. Hits
/api/account/trial/*.
client.trial.status() # eligibility / used / expires_at
client.trial.subscribe(["telegram", "whatsapp"])
Captcha
Resells 2captcha, billed pay-per-use from the wallet (count-on-success). The
solve call is blocking: it submits the task then polls the result endpoint —
honouring the API's retry_after — until the task is ready. Hits
/api/account/captcha/*.
solution = client.captcha.solve(
"recaptcha_v2",
{"sitekey": "…", "pageurl": "https://example.com"},
idempotency_key="my-uuid",
timeout_sec=180,
)
print(solution.solution, solution.price_micro_usd)
# raises EvesesError on failure or timeout
Fingerprints
Resells 2captcha's Fingerprint API, billed pay-per-use (count-on-success).
Unlike captcha-solving this is synchronous — one request returns a complete
fingerprint. Hits /api/account/fingerprints/*.
fp = client.fingerprints.generate({"os": "windows", "browser": "chrome"})
print(fp.fingerprint, fp.price_micro_usd)
rand = client.fingerprints.random()
Webhook verification
Eveses signs every outbound webhook delivery with HMAC-SHA256 over
f"{timestamp}.{raw_body}". Two headers carry the proof:
X-Eveses-Signature— e.g.sha256=abc123…X-Eveses-Timestamp— unix seconds
Pass the raw request body (bytes or str) — not the parsed JSON. Re-serialising
through json.loads / json.dumps reorders keys and breaks the signature.
# Flask example
from flask import Flask, request
from eveses import Webhooks
app = Flask(__name__)
SECRET = os.environ["EVESES_WEBHOOK_SECRET"]
@app.post("/eveses-webhook")
def eveses_webhook():
raw = request.get_data() # bytes
if not Webhooks.verify(
raw,
request.headers.get("X-Eveses-Signature"),
SECRET,
timestamp=request.headers.get("X-Eveses-Timestamp"),
):
return "bad signature", 401
payload = request.get_json()
# handle payload["event"] / payload["data"] …
return "", 204
A functional alias is also exported:
from eveses import verify_webhook
ok = verify_webhook(raw, sig_header, SECRET, timestamp=ts_header)
Errors
All non-2xx responses raise a typed subclass of EvesesError:
| Status | Class |
|---|---|
| 400 / 422 | EvesesValidationError (with .errors) |
| 401 | EvesesAuthError |
| 403 | EvesesForbiddenError |
| 404 | EvesesNotFoundError |
| 429 | EvesesRateLimitError (only after the 1 auto-retry is exhausted) |
| 5xx | EvesesServerError |
| other | EvesesError |
from eveses import EvesesValidationError
try:
client.activations.create(country="", service="")
except EvesesValidationError as e:
print(e.errors)
API surface vs OpenAPI
The Eveses public OpenAPI spec exposes the customer-facing endpoints under
/api/account/* (legacy account scope) and /api/v1/numbers/* (new versioned
public API). For API-key consumers (kind=api_key Sanctum tokens), the v1
surface is currently a thin wrapper around the same controllers — orders
and wallet are still served from /api/account/*. This SDK targets the
account-scoped routes, which is where v1 reads & writes terminate today. When
v1 ships its own activations / wallet routes, you can override the base URL
without changing call sites; the response shapes are identical.
Configuration
client = Eveses(
api_key="…",
base_url="https://api.eveses.com", # override per environment
timeout=30.0,
session=requests.Session(), # inject for tests / connection pooling
default_headers={"X-Trace-Id": "t1"},
user_agent="my-app/1.2.3",
)
Development
pip install -e '.[dev]'
python -m unittest discover -s tests
Changelog
0.3.0
- New
proxynamespace: residential (per-GB) and static per-IP proxies —packages,endpoints,catalog,locations,quote,usage,list,purchase,extend,auto_renew,reset_sessions,trial, and residential subscriptionpause/resume/cancel. ExposesProxy,ProxyOrder,ProxySubscription,ProxyList. - New
web_unblockernamespace:packages,quote,access,purchase,trial, and subscriptionpause/resume/cancel. - New
emailsnamespace: temporary email addresses —domains,quote,list,get,messages,purchase,mark_read,release. - New
trialnamespace:statusandsubscribefor per-service free trials. - New
captchanamespace: blockingsolve(submit + poll) reselling 2captcha, billed pay-per-use. ExposesCaptcha,CaptchaSolution. - New
fingerprintsnamespace: synchronousgenerate/randombrowser fingerprints. ExposesFingerprints,Fingerprint. - Module reorg: the old
proxiesmodule was replaced byproxy.
0.2.0
- Activations, wallet, catalog (countries / services / pricing), and webhook signature verification.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file eveses-0.3.0.tar.gz.
File metadata
- Download URL: eveses-0.3.0.tar.gz
- Upload date:
- Size: 20.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d9d7d253899ed04089c6b2512dadd994d98d1bcf1204184f77631789f81547bd
|
|
| MD5 |
9137b4d2ed50de34df74f49ddf1b4b39
|
|
| BLAKE2b-256 |
44ab9c970860ff48eb5a5447809fb898dd6ed50e2f7dfc15b7a46398762fe21d
|
File details
Details for the file eveses-0.3.0-py3-none-any.whl.
File metadata
- Download URL: eveses-0.3.0-py3-none-any.whl
- Upload date:
- Size: 22.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
92cab9f23cc7410abb9a63eebc216dd538c883258cc7bf53fdeeccc354ec97f7
|
|
| MD5 |
806c6abf03299ca1323c3707d4870dd0
|
|
| BLAKE2b-256 |
15ab0f3eb163351e60e2d3cb7805b821820e87e48d079acee465469f1bbc0891
|