Zero Bounce Python SDK
This SDK contains methods for interacting easily with ZeroBounce API. More information about ZeroBounce you can find in the official documentation.
INSTALLATION
pip install zerobouncesdk
USAGE
Import the sdk in your file:
from zerobouncesdk import ZeroBounce
Initialize the SDK with your API key. You can optionally specify a base URL to use a different API region or a custom endpoint:
Default: Uses the default ZeroBounce API endpoint
from zerobouncesdk import ZeroBounce
zero_bounce = ZeroBounce("<YOUR_API_KEY>")
Using predefined API regions: Use one of the available API regions
from zerobouncesdk import ZeroBounce, ZBApiUrl
# Use USA region
zero_bounce = ZeroBounce("<YOUR_API_KEY>", base_url=ZBApiUrl.API_USA_URL)
# Use EU region
zero_bounce = ZeroBounce("<YOUR_API_KEY>", base_url=ZBApiUrl.API_EU_URL)
# Use default region (explicit)
zero_bounce = ZeroBounce("<YOUR_API_KEY>", base_url=ZBApiUrl.API_DEFAULT_URL)
Using a custom URL string: Provide your own base URL
zero_bounce = ZeroBounce("<YOUR_API_KEY>", base_url="https://custom-api.example.com/v2")
Available API regions:
ZBApiUrl.API_DEFAULT_URL- Default ZeroBounce API (https://api.zerobounce.net/v2/)ZBApiUrl.API_USA_URL- USA region API (https://api-us.zerobounce.net/v2/)ZBApiUrl.API_EU_URL- EU region API (https://api-eu.zerobounce.net/v2/)
Examples
Then you can use any of the SDK methods, for example:
from zerobouncesdk import ZeroBounce
zero_bounce = ZeroBounce("<YOUR_API_KEY>")
response = zero_bounce.get_credits()
print("ZeroBounce get_credits response: " + str(response))
from datetime import datetime
from zerobouncesdk import ZeroBounce, ZBException
zero_bounce = ZeroBounce("<YOUR_API_KEY>")
start_date = datetime(2019, 8, 1); # The start date of when you want to view API usage
end_date = datetime(2019, 9, 1); # The end date of when you want to view API usage
try:
response = zero_bounce.get_api_usage(start_date, end_date)
print("ZeroBounce get_api_usage response: " + str(response))
except ZBException as e:
print("ZeroBounce get_api_usage error: " + str(e))
from zerobouncesdk import ZeroBounce, ZBException
zero_bounce = ZeroBounce("<YOUR_API_KEY>")
email = "valid@example.com"; # Subscriber email address
try:
response = zero_bounce.get_activity(email)
print("ZeroBounce get_activity response: " + str(response))
except ZBException as e:
print("ZeroBounce get_activity error: " + str(e))
from zerobouncesdk import ZeroBounce, ZBException
zero_bounce = ZeroBounce("<YOUR_API_KEY>")
# Option 1: Use find_email_format with domain
domain = "example.com" # The email domain for which to find the email format
first_name = "John" # The first name of the person whose email format is being searched
middle_name = "Quill" # Optional: The middle name of the person
last_name = "Doe" # Optional: The last name of the person
try:
response = zero_bounce.find_email_format(
first_name=first_name,
domain=domain,
middle_name=middle_name,
last_name=last_name
)
print("Email: " + str(response.email))
print("Email Confidence: " + str(response.email_confidence))
except ZBException as e:
print("ZeroBounce find_email_format error: " + str(e))
# Option 2: Use find_email_format with company_name
from zerobouncesdk import ZeroBounce, ZBException
zero_bounce = ZeroBounce("<YOUR_API_KEY>")
company_name = "Acme Corp" # The company name for which to find the email format
first_name = "Jane" # The first name of the person
try:
response = zero_bounce.find_email_format(
first_name=first_name,
company_name=company_name
)
print("Email: " + str(response.email))
print("Domain: " + str(response.domain))
print("Company: " + str(response.company_name))
except ZBException as e:
print("ZeroBounce find_email_format error: " + str(e))
# Option 3: Use find_domain to discover email formats for a domain
from zerobouncesdk import ZeroBounce, ZBException
zero_bounce = ZeroBounce("<YOUR_API_KEY>")
domain = "example.com" # The email domain to analyze
try:
response = zero_bounce.find_domain(domain=domain)
print("Domain: " + str(response.domain))
print("Format: " + str(response.format))
print("Confidence: " + str(response.confidence))
print("Other formats: " + str(len(response.other_domain_formats)))
except ZBException as e:
print("ZeroBounce find_domain error: " + str(e))
# Option 4: Use find_domain with company_name
from zerobouncesdk import ZeroBounce, ZBException
zero_bounce = ZeroBounce("<YOUR_API_KEY>")
company_name = "Acme Corp" # The company name to analyze
try:
response = zero_bounce.find_domain(company_name=company_name)
print("Domain: " + str(response.domain))
print("Company: " + str(response.company_name))
print("Format: " + str(response.format))
print("Confidence: " + str(response.confidence))
for fmt in response.other_domain_formats:
print(f" Alternative: {fmt.format} (confidence: {fmt.confidence})")
except ZBException as e:
print("ZeroBounce find_domain error: " + str(e))
from zerobouncesdk import ZeroBounce, ZBException
zero_bounce = ZeroBounce("<YOUR_API_KEY>")
email = "<EMAIL_ADDRESS>" # The email address you want to validate
ip_address = "127.0.0.1" # The IP Address the email signed up from (Optional)
try:
response = zero_bounce.validate(email, ip_address)
print("ZeroBounce validate response: " + str(response))
except ZBException as e:
print("ZeroBounce validate error: " + str(e))
from zerobouncesdk import ZeroBounce, ZBException, ZBValidateBatchElement
zero_bounce = ZeroBounce("<YOUR_API_KEY>")
email_batch = [
ZBValidateBatchElement("valid@example.com", "127.0.0.1"),
ZBValidateBatchElement("invalid@example.com"),
] # The batch of emails you want to validate
try:
response = zero_bounce.validate_batch(email_batch)
print("ZeroBounce validate_batch response: " + str(response))
except ZBException as e:
print("ZeroBounce validate_batch error: " + str(e))
from zerobouncesdk import ZeroBounce, ZBException
zero_bounce = ZeroBounce("<YOUR_API_KEY>")
file_path = './email_file.csv' # The csv or txt file
email_address_column = 1 # The index of "email" column in the file. Index starts at 1
return_url = "https://domain.com/called/after/processing/request"
first_name_column = None # The index of "first name" column in the file
last_name_column = None # The index of "last name" column in the file
gender_column = None # The index of "gender" column in the file
ip_address_column = None # The index of "IP address" column in the file
has_header_row = False # If the first row from the submitted file is a header row
remove_duplicate = True # If you want the system to remove duplicate emails
allow_phase_2 = True # Optional: sends allow_phase_2 (validation bulk only); omit or use None to skip
try:
response = zero_bounce.send_file(
file_path,
email_address_column,
return_url,
first_name_column,
last_name_column,
gender_column,
ip_address_column,
has_header_row,
remove_duplicate,
allow_phase_2,
)
print("ZeroBounce send_file response: " + str(response))
except ZBException as e:
print("ZeroBounce send_file error: " + str(e))
Bulk validation uses https://bulkapi.zerobounce.net/v2. See v2 send file, v2 file status, and v2 get file.
from zerobouncesdk import ZeroBounce, ZBException
zero_bounce = ZeroBounce("<YOUR_API_KEY>")
file_id = "<FILE_ID>" # The returned file ID when calling sendFile API
try:
response = zero_bounce.file_status(file_id)
# response.file_status, response.file_phase_2_status, response.error_reason (when present)
print("ZeroBounce file_status response: " + str(response))
except ZBException as e:
print("ZeroBounce file_status error: " + str(e))
-
The getfile API allows users to get the validation results file for the file been submitted using sendFile API
from zerobouncesdk import ZeroBounce, ZBException
zero_bounce = ZeroBounce("<YOUR_API_KEY>")
file_id="<FILE_ID>" # The returned file ID when calling sendFile API
local_download_path = "./dwnld_file.csv" # The path where the file will be downloaded
try:
response = zero_bounce.get_file(file_id, local_download_path)
print("ZeroBounce get_file response: " + str(response))
except ZBException as e:
print("ZeroBounce get_file error: " + str(e))
Optional v2 get file query parameters use ZBGetFileOptions and ZBDownloadType (PHASE_1, PHASE_2, COMBINED). Set activity_data on the options object for validation get_file only; it is not sent for scoring_get_file.
from zerobouncesdk import ZeroBounce, ZBException, ZBGetFileOptions, ZBDownloadType
zero_bounce = ZeroBounce("<YOUR_API_KEY>")
opts = ZBGetFileOptions(download_type=ZBDownloadType.COMBINED, activity_data=True)
response = zero_bounce.get_file(file_id, local_download_path, opts)
If the API returns a non-success HTTP status or a JSON error body (including some HTTP 200 responses with success: false), the client raises ZBApiException. To inspect a raw body string yourself, use ZeroBounce.get_file_json_indicates_error(body).
-
Delete the file that was submitted using sendFile API. File can be deleted only when its status is
Complete
from zerobouncesdk import ZeroBounce, ZBException
zero_bounce = ZeroBounce("<YOUR_API_KEY>")
file_id="<FILE_ID>" # The returned file ID when calling sendFile API
try:
response = zero_bounce.delete_file(file_id)
print("ZeroBounce delete_file response: " + str(response))
except ZBException as e:
print("ZeroBounce delete_file error: " + str(e))
AI Scoring API
from zerobouncesdk import ZeroBounce, ZBException
zero_bounce = ZeroBounce("<YOUR_API_KEY>")
file_path = './email_file.csv' # The csv or txt file
email_address_column = 1 # The index of "email" column in the file. Index starts at 1
return_url = "https://domain.com/called/after/processing/request"
has_header_row = False # If the first row from the submitted file is a header row
remove_duplicate = True # If you want the system to remove duplicate emails
try:
response = zero_bounce.scoring_send_file(
file_path,
email_address_column,
return_url,
has_header_row,
remove_duplicate,
)
print("ZeroBounce send_file response: " + str(response))
except ZBException as e:
print("ZeroBounce send_file error: " + str(e))
from zerobouncesdk import ZeroBounce, ZBException
zero_bounce = ZeroBounce("<YOUR_API_KEY>")
file_id = "<FILE_ID>" # The returned file ID when calling scoringSendFile API
try:
response = zero_bounce.scoring_file_status(file_id)
print("ZeroBounce file_status response: " + str(response))
except ZBException as e:
print("ZeroBounce file_status error: " + str(e))
-
The scoring scoringGetFile API allows users to get the validation results file for the file been submitted using scoring scoringSendFile API
from zerobouncesdk import ZeroBounce, ZBException
zero_bounce = ZeroBounce("<YOUR_API_KEY>")
file_id="<FILE_ID>" # The returned file ID when calling scoringSendFile API
local_download_path = "./dwnld_file.csv" # The path where the file will be downloaded
try:
response = zero_bounce.scoring_get_file(file_id, local_download_path)
print("ZeroBounce get_file response: " + str(response))
# Optional third argument: ZBGetFileOptions with download_type only (activity_data is not used for scoring getfile)
# response = zero_bounce.scoring_get_file(file_id, local_download_path, opts)
except ZBException as e:
print("ZeroBounce get_file error: " + str(e))
-
Delete the file that was submitted using scoringSendFile API. File can be deleted only when its status is
Complete
from zerobouncesdk import ZeroBounce, ZBException
zero_bounce = ZeroBounce("<YOUR_API_KEY>")
file_id="<FILE_ID>" # The returned file ID when calling scoringSendFile API
try:
response = zero_bounce.scoring_delete_file(file_id)
print("ZeroBounce delete_file response: " + str(response))
except ZBException as e:
print("ZeroBounce delete_file error: " + str(e))
⚠️ Deprecated: The
guess_formatmethod is deprecated and will be removed in future versions. Usefind_email_formatorfind_domaininstead (see examples above).
from zerobouncesdk import ZeroBounce, ZBException
zero_bounce = ZeroBounce("<YOUR_API_KEY>")
domain = "example.com" # The email domain for which to find the email format
first_name = "John" # The first name of the person whose email format is being searched
middle_name = "Quill" # The middle name of the person whose email format is being searched
last_name = "Doe" # The last name of the person whose email format is being searched
try:
response = zero_bounce.guess_format(domain, first_name, middle_name, last_name)
print("ZeroBounce guess format response: " + response)
except ZBException as e:
print("ZeroBounce guess format error: " + str(e))
DEVELOPMENT
Local setup
python -m venv venv # python 3.12+
source venv/bin/activate
pip install -e .
Run tests with Docker
From the sdk-docs/ folder in the SDKs monorepo:
cd sdk-docs
docker compose build python
docker compose run --rm python
Or build and run this SDK’s image from this directory:
docker build -t zb-python-sdk .
docker run --rm zb-python-sdk
Run tests (local)
python -m tests -v
# output:
python -m tests -v
test_api_regions (tests.zero_bounce_integration_test.ZeroBounceIntegrationTestCase.test_api_regions)
Test that different API regions work. ... skipped 'ZEROBOUNCE_API_KEY environment variable not set'
test_error_handling_invalid_key (tests.zero_bounce_integration_test.ZeroBounceIntegrationTestCase.test_error_handling_invalid_key)
Test error handling with invalid API key. ... skipped 'ZEROBOUNCE_API_KEY environment variable not set'
test_find_domain_with_domain (tests.zero_bounce_integration_test.ZeroBounceIntegrationTestCase.test_find_domain_with_domain)
Test find_domain with domain parameter. ... skipped 'ZEROBOUNCE_API_KEY environment variable not set'
----------------------------------------------------------------------
Ran 4 tests in 0.015s
OK (skipped=10) # integration tests are skipped if no api key is present
# to run integration tests export api key into the environment (valid api key required)
export ZEROBOUNCE_API_KEY=<apikey> && python -m tests -v
# output:
test_api_regions (tests.zero_bounce_integration_test.ZeroBounceIntegrationTestCase.test_api_regions)
Test that different API regions work. ... ok
test_error_handling_invalid_key (tests.zero_bounce_integration_test.ZeroBounceIntegrationTestCase.test_error_handling_invalid_key)
Test error handling with invalid API key. ... ok
----------------------------------------------------------------------
Ran 4 tests in 1.1s
OK
Publish
- Bump
versioninpyproject.toml, commit, tag (vX.Y.Z), push tag. - Actions → Publish → Run workflow with that tag.
Registry: zerobouncesdk on PyPI
Release files for zerobouncesdk 2.2.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| zerobouncesdk-2.2.4.tar.gz | 19.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| zerobouncesdk-2.2.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size:42.0 kB
Release files / zerobouncesdk-2.2.4.tar.gz
| Download URL | zerobouncesdk-2.2.4.tar.gz |
|---|---|
| Size | 19.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
745ab69dbcae7e8f87afd119140328e3da3c74034d59a835c1575d6d8e90b6fe
|
|
BLAKE2b-256 checksum How to use checksums |
a4f866634adb3d6469eba350a89afce59f8d8c70db824c74f54e4a187721164b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.
Transparency logRelease files / zerobouncesdk-2.2.4-py3-none-any.whl
| Download URL | zerobouncesdk-2.2.4-py3-none-any.whl |
|---|---|
| Size | 22.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
683609b6f178256bde140fd39712fa1fe8b30faba6b33503d35c2ebcde9484bf
|
|
BLAKE2b-256 checksum How to use checksums |
efb267f264705d6ed5ecd2f31513decc5dd549bfa6842b85ef5ac7f044de3480
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.
Transparency log