Snov.io API
Snov.io features can be used through our simple REST API. Integrate with Snov.io API to sync your leads, find emails, manage prospects and more. The API rate is limited to 60 requests per minute.
If you're on a free plan, you can request test access by booking a personal demo with us. To get started, please tell us about your specific goal so we can better understand your needs.
Use cases for Snov.io’s APIs
- Enrich your prospect lists to expand data for your sales team
Find real email addresses from just a name or company domain—great for expanding prospect lists or enriching existing data. - Auto-enroll new signups into campaigns
Connect your signup and event registration forms with the Snov.io API to instantly add new prospects to your campaigns. - Keep your customer database clean
Plug email verification into your CRM or outreach tools to instantly validate emails for newly added prospects and keep existing customer data relevant. - Use LinkedIn URLs to auto-fill lead details
Turn a basic LinkedIn member’s URL into a rich, CRM-ready profile. Say goodbye to manual data entry—hello to high-quality leads. - Share campaign results in real time
Pull live data from your cold campaigns into polished dashboards or slides. Give your stakeholders the insights they need, without the hassle. - Stay compliant with do-not-email lists
Automatically add prospects to do-not-email lists to avoid accidental outreach. Perfect for keeping your sales team aligned, respecting opt-outs, and staying compliant with data privacy rules.
Integrate these methods—and so many more—into your workflow. With our flexible API, the use cases are practically endless.
Authentication
You need to generate an access token to authenticate future requests. When making a request, please specify this access token in the Authorization field.
| Authorization: Bearer QSlHffXmCAILIOHNGXToq4LsP2yX64VQhEBZ7Ei4 |
Here is an example for token generation.
| POST | https://api.snov.io/v1/oauth/access_token |
grant_type | Will always be client_credentials |
client_id | Your id is available in the account settings https://app.snov.io/account/api |
client_secret | Your secret key is available in the account settings https://app.snov.io/account/api |
<?php function getAccessToken() { $params = [ 'grant_type' => 'client_credentials', 'client_id' => 'c57a0459f6t141659ea75cccb393c5111', 'client_secret' => '77cbf92b71553e85ce3bfd505214f40b' ]; $options = [ CURLOPT_URL => 'https://api.snov.io/v1/oauth/access_token', CURLOPT_POST => true, CURLOPT_POSTFIELDS => $params, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res['access_token']; } ?>
def get_access_token(): params = { 'grant_type':'client_credentials', 'client_id':'c57a0459f6t141659ea75cccb393c111', 'client_secret': '77cbf92b71553e85ce3bfd505214f40b' } res = requests.post('https://api.snov.io/v1/oauth/access_token', data=params) resText = res.text.encode('ascii','ignore') return json.loads(resText)['access_token']
| { | |||
| |||
| } |
access_token | Your new access token |
token_type | Will always be Bearer |
expires_in | Token expiration time (in seconds) |
API methods
POSTDomain search
1 credit per each unique request / 1 credit for every prospect profile with an emailEnter a domain name and Snov.io will return company info, emails and prospect profiles.
1 credit per each POST request. You won’t be charged if you get no results.
| POST | https://api.snov.io/v2/domain-search/start |
domain | The domain name for which you want to receive company information. For example, "snov.io". |
<?php function companyInfoSearch() { $token = getAccessToken(); $params = [ 'domain' => 'snov.io', ]; $headers = [ 'Authorization: Bearer ' . $token, ]; $options = [ CURLOPT_URL => 'https://api.snov.io/v2/domain-search/start', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $params, CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $response = json_decode(curl_exec($ch), true); curl_close($ch); return $response; } ?>
def company_info_search(): token = get_access_token() headers = {'authorization': f'Bearer {token}'} params = { 'domain': 'snov.io', } res = requests.post('https://api.snov.io/v2/domain-search/start', params=params, headers=headers) return json.loads(res.text)
{
"data": [],
"meta": {
"domain": "snov.io",
"task_hash": "6f15de14db954c761f8e7507547b3bd7"
},
"links": {
"result": "https://api.snov.io/v2/domain-search/result/6f15de14db954c761f8e7507547b3bd7"
}
}
domain | Domain for which you’re retrieving company info. |
task_hash | Unique ID for the search task you started. It’s automatically added to your next request URL to receive the results. |
result | Request URL for you to use to receive company info. |
| GET | https://api.snov.io/v2/domain-search/result/{task_hash} |
<?php function companyInfoResult() { $token = getAccessToken(); $task_hash = 'b10e4c47693dbf87cc8de16edcc8ae22'; $headers = [ 'Authorization: Bearer ' . $token, ]; $options = [ CURLOPT_URL => 'https://api.snov.io/v2/domain-search/result/$task_hash', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $response = json_decode(curl_exec($ch), true); curl_close($ch); return $response; } ?>
def company_info_result(): token = get_access_token() task_hash = '86586db9ac64ae5471eb18fc71b0dd5e' headers = {'authorization': f'Bearer {token}'} res = requests.get(f'https://api.snov.io/v2/domain-search/result/{task_hash}', headers=headers) return json.loads(res.text)
{
"data": {
"company_name": "Snov.io",
"city": "New York",
"founded": "2017",
"website": "snov.io",
"hq_phone": "13477050819",
"industry": "Computer Software",
"size": "51-200",
"related_domains": [
"snov.me",
"snov.com",
"snov.nl",
"snov.com.ua",
"snov.cl"
]
},
"meta": {
"domain": "snov.io",
"task_hash": "6f15de14db954c761f8e7507547b3bd7",
"prospects_count": 196,
"emails_count": 108,
"generic_contacts_count": 9
},
"links": {
"prospects": "https://api.snov.io/v2/domain-search/prospects/start?domain=snov.io",
"domain_emails": "https://api.snov.io/v2/domain-search/domain-emails/start?domain=snov.io",
"generic_contacts": "https://api.snov.io/v2/domain-search/generic-contacts/start?domain=snov.io"
},
"status": "completed"
}
company_name | The company name associated with the domain. |
city | The city in which the company's headquarters are located. |
founded | The year when the company was founded. |
website | Company's website address. |
hq_phone | The phone number of the company's headquarters. |
industry | Company's industry. |
size | The number of employees the company has. |
related_domains | Domains with the same SLD (second level domain) as the domain you’re requesting data for. |
domain | The domain name for which the API has provided the company information. |
task_hash | Unique ID for the search task you started. |
prospects_count | The number of prospect profiles retrieved from your request. |
emails_count | The number of domain emails retrieved from your request. |
generic_contacts_count | The number of generic emails retrieved from your request. |
prospects | URL to request a list with full prospect profiles. |
domain_emails | URL to request a list with domain emails. |
generic_contacts | URL to request a list with generic company emails. |
status | Request’s status. Can be completed or in progress. |
| POST | https://api.snov.io/v2/domain-search/prospects/start |
domain | The domain name you want to find prospect profiles for. For example, "snov.io". |
positions[] | Use this parameter to filter prospects by job position, for example, "Software Developer". To filter by multiple positions, input an array of necessary positions, separated by a comma. You can filter by up to 10 positions per request. |
page | Page number that contains prospect profiles. Each page shows up to 20 profiles. If the page is not indicated, the first page will be returned by default. |
<?php function prospectsSearch() { $token = getAccessToken(); $params = [ 'domain' => 'snov.io', 'page' => 1, 'positions' => ['Web developer','QA Engineer'] ]; $headers = [ 'Authorization: Bearer ' . $token, ]; $options = [ CURLOPT_URL => 'https://api.snov.io/v2/domain-search/start', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query($params), CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $response = json_decode(curl_exec($ch), true); curl_close($ch); return $response; } ?>
def prospects_search(): token = get_access_token() headers = {'authorization': f'Bearer {token}'} params = { 'domain': 'snov.io', 'page': 1, 'positions[]': ['Web developer', 'QA Engineer'] } res = requests.post('https://api.snov.io/v2/domain-search/prospects/start', params=params, headers=headers) return json.loads(res.text)
{
"data": [],
"meta": {
"domain": "snov.io",
"tab": "prospects",
"task_hash": "3384369c16aad810f58609a40ad65089",
"page": 1,
"positions": [
"Web developer",
"QA Engineer"
]
},
"links": {
"result": "https://api.snov.io/v2/domain-search/prospects/result/3384369c16aad810f58609a40ad65089"
}
}
domain | Domain for which you’re retrieving prospect profiles. |
tab | Displays the type of results you’re requesting. prospects indicates that you’re looking for prospect profiles. emails displays domain emails. service shows that you’re getting generic emails. |
task_hash | Unique ID for the search task you started. It’s automatically added to your next request URL to receive the results. |
page | Page number that contains prospect profiles. Each page shows up to 20 profiles. |
positions | Job positions used to filter the results. |
result | Request URL for you to use to receive prospect profiles. |
| GET | https://api.snov.io/v2/domain-search/prospects/result/{task_hash} |
<?php function prospectsResult() { $token = getAccessToken(); $task_hash = '3384369c16aad810f58609a40ad65089'; $headers = [ 'Authorization: Bearer ' . $token, ]; $options = [ CURLOPT_URL => 'https://api.snov.io/v2/domain-search/prospects/result/$task_hash', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $response = json_decode(curl_exec($ch), true); curl_close($ch); return $response; } ?>
def prospects_result(): token = get_access_token() task_hash = '3384369c16aad810f58609a40ad65089' headers = {'authorization': f'Bearer {token}'} res = requests.get(f'https://api.snov.io/v2/domain-search/prospects/result/{task_hash}', headers=headers) return json.loads(res.text)
{
"data": [
{
"first_name": "John",
"last_name": "Doe",
"position": "Web developer",
"source_page": "https://www.linkedin.com/in/john-doe/",
"search_emails_start": "https://api.snov.io/v2/domain-search/prospects/search-emails/start/41627edbfff8ba9c0819a1aa51d232baf3fa1763e5813dc86e027ccbbefd7a16b0522391086776b8764c94d02bab1257df392"
}
],
"meta": {
"domain": "snov.io",
"tab": "prospects",
"task_hash": "3384369c16aad810f58609a40ad65089",
"page": 1,
"positions": [
"Web developer",
"QA Engineer"
],
"total_count": 18
},
"links": {
"next": ""
},
"status": "completed"
}
first_name | Prospect’s first name. |
last_name | Prospect’s last name. |
position | Prospect’s job position. |
source_page | The source page of retrieved personal data. |
search_emails_start | URL for your next request to search for the prospect’s email. |
domain | Domain for which you’re retrieving prospect profiles. |
tab | Displays the type of results you’re getting. prospects indicates that you’re looking for prospect profiles. emails displays domain emails. service shows that you’re getting generic emails. |
task_hash | Unique ID for the search task you started. |
page | Page number that contains prospect profiles. Each page shows up to 20 profiles. |
positions | Job positions used to filter the results. |
total_count | Total number of prospect profiles found. |
next | URL for your next request to retrieve results from the following page. Each page has up to 20 prospects. |
status | Request’s status. Can be completed or in progress. |
| POST | https://api.snov.io/v2/domain-search/prospects/search-emails/start/{prospect_hash} |
<?php function searchProspectEmailsStart() { $token = getAccessToken(); $headers = [ 'Authorization: Bearer ' . $token, ]; $task = '41627edbfff8ba9c0819a1aa51d232baf3fa1763e5813dc86e027ccbbefd7a16b0522391086776b8764c94d02bab1257df392'; $options = [ CURLOPT_URL => 'https://api.snov.io/v2/domain-search/prospects/search-emails/start/$task', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $response = json_decode(curl_exec($ch), true); curl_close($ch); return $response; } ?>
def search_prospect_emails_start(): token = get_access_token() headers = {'authorization': f'Bearer {token}'} res = requests.post(f'https://api.snov.io/v2/domain-search/prospects/search-emails/start/' f'a811d72df2e52bd447621c4a1326e540102f3b70ba39a81bd597020ed0b9f812ee8de7e0f4ecad312716d03576fdf0af6d8277e1', headers=headers) return json.loads(res.text)
{
"data": [],
"meta": {
"task_hash": "5e846a1d80d95f66cfb30250a7c1881f"
},
"links": {
"result": "https://api.snov.io/v2/domain-search/prospects/search-emails/result/5e846a1d80d95f66cfb30250a7c1881f"
}
}
task_hash | Unique ID for the search task you started. |
result | URL for your next request to retrieve the prospect’s email. |
| GET | https://api.snov.io/v2/domain-search/prospects/search-emails/result/{task_hash} |
<?php function searchProspectEmailsResult() { $token = getAccessToken(); $task_hash = '5e846a1d80d95f66cfb30250a7c1881f'; $headers = [ 'Authorization: Bearer ' . $token, ]; $options = [ CURLOPT_URL => 'https://api.snov.io/v2/domain-search/prospects/search-emails/result/$task_hash', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $response = json_decode(curl_exec($ch), true); curl_close($ch); return $response; } ?>
def search_prospect_emails_result(): token = get_access_token() task_hash = '7f1df5bd8bca6f66e38dad0ffb30ba4c' headers = {'authorization': f'Bearer {token}'} res = requests.get(f'https://api.snov.io/v2/domain-search/prospects/search-emails/result/{task_hash}', headers=headers) return json.loads(res.text)
{
"data": {
"searching_date": "2025-01-01 11:11:11",
"emails": [
{
"email": "example@snov.io",
"smtp_status": "valid"
}
]
},
"meta": {
"task_hash": "5e846a1d80d95f66cfb30250a7c1881f"
},
"links": [],
"status": "completed"
}
searching_date | Date when the email was searched. |
emails | Prospect emails. |
smtp_status | Can return valid, or unknown (aka Unverifiable). You can learn more about email statuses here. |
task_hash | Unique ID for the search task you started. |
status | Request’s status. Can be completed or in progress. |
| POST | https://api.snov.io/v2/domain-search/domain-emails/start |
domain | Company’s domain name for which you want to find domain emails. For example, "snov.io". |
<?php function domainEmailsSearch() { $token = getAccessToken(); $params = [ 'domain' => 'snov.io', ]; $headers = [ 'Authorization: Bearer ' . $token, ]; $options = [ CURLOPT_URL => 'https://api.snov.io/v2/domain-search/domain-emails/start', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $params, CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $response = json_decode(curl_exec($ch), true); curl_close($ch); return $response; } ?>
def domain_emails_search(): token = get_access_token() headers = {'authorization': f'Bearer {token}'} params = { 'domain': 'snov.io' } res = requests.post('https://api.snov.io/v2/domain-search/domain-emails/start', params=params, headers=headers) return json.loads(res.text)
{
"data": [],
"meta": {
"domain": "snov.io",
"tab": "emails",
"task_hash": "36fce9ac2667a827f6c5ab954e288bed",
"next": ""
},
"links": {
"result": "https://api.snov.io/v2/domain-search/domain-emails/result/36fce9ac2667a827f6c5ab954e288bed"
}
}
domain | Domain for which you’re retrieving emails. |
tab | Displays the type of results you’re requesting. prospects indicates that you’re looking for prospect profiles. emails displays domain emails. service shows that you’re getting generic emails. |
task_hash | Unique ID for the search task you started. It’s automatically added to your next request to receive the results. |
next | ID for the next page request, if there is one. If no more pages are available, it will be empty. |
result | Request URL for you to use to receive domain emails. |
| GET | https://api.snov.io/v2/domain-search/domain-emails/result/{task_hash} |
<?php function domainEmailsResult() { $token = getAccessToken(); $task_hash = '36fce9ac2667a827f6c5ab954e288bed'; $headers = [ 'Authorization: Bearer ' . $token, ]; $options = [ CURLOPT_URL => 'https://api.snov.io/v2/domain-search/domain-emails/result/$task_hash', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $response = json_decode(curl_exec($ch), true); curl_close($ch); return $response; } ?>
def domain_emails_result(): token = get_access_token() task_hash = '36fce9ac2667a827f6c5ab954e288bed' headers = {'authorization': f'Bearer {token}'} res = requests.get(f'https://api.snov.io/v2/domain-search/domain-emails/result/{task_hash}', headers=headers) return json.loads(res.text)
{
"data": [
{
"email": "admin@snov.io"
},
{
"email": "help@snov.io"
}
],
"meta": {
"domain": "snov.io",
"tab": "emails",
"task_hash": "36fce9ac2667a827f6c5ab954e288bed",
"next": "4ae6ca51c056c584db03c618dfe80dedb82ec37ab4667fa189386c82288a7422e8f4ab1010d84a13f2728d8f1b12b2ff139e3cb81108dc48",
"total_count": 108
},
"links": {
"next": "https://api.snov.io/v2/domain-search/domain-emails/start?domain=snov.io&next=4ae6ca51c056c584db03c618dfe80dedb82ec37ab4667fa189386c82288a7422e8f4ab1010d84a13f2728d8f1b12b2ff139e3cb81108dc48"
},
"status": "completed"
}
email | Domain’s email address. Keep in mind, these emails are unverified. To verify them, use the Email Verifier method. |
domain | Domain for which you’re retrieving emails. |
tab | Displays the type of results you’re getting. prospects indicates that you’re looking for prospect profiles. emails displays domain emails. service shows that you’re getting generic emails. |
task_hash | Unique ID for the search task you started. |
next | ID added to the request URL to access the next page of emails in case it exists. |
total_count | Total number of domain emails found. |
next | Request’s URL to retrieve results from the following page in case it exists. Each page has up to 50 emails. |
status | Request’s status. Can be completed or in progress. |
| POST | https://api.snov.io/v2/domain-search/generic-contacts/start |
domain | Company’s domain name for which you want to find generic emails. For example, "snov.io". |
<?php function genericContactsSearch() { $token = getAccessToken(); $params = [ 'domain' => 'snov.io', ]; $headers = [ 'Authorization: Bearer ' . $token, ]; $options = [ CURLOPT_URL => 'https://api.snov.io/v2/domain-search/generic-contacts/start', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $params, CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $response = json_decode(curl_exec($ch), true); curl_close($ch); return $response; } ?>
def generic_contacts_search(): token = get_access_token() headers = {'authorization': f'Bearer {token}'} params = { 'domain': 'snov.io' } res = requests.post('https://api.snov.io/v2/domain-search/generic-contacts/start', params=params, headers=headers) return json.loads(res.text)
{
"data": [],
"meta": {
"domain": "snov.io",
"tab": "service",
"task_hash": "0e36e43b9b91a9b20d14b82c1ee141f2",
"next": ""
},
"links": {
"result": "https://api.snov.io/v2/domain-search/generic-contacts/result/0e36e43b9b91a9b20d14b82c1ee141f2"
}
}
domain | Domain for which you’re retrieving generic emails. |
tab | Displays the type of results you’re requesting. prospects indicates that you’re looking for prospect profiles. emails displays domain emails. service shows that you’re getting generic emails. |
task_hash | Unique ID for the search task you started. It’s automatically added to your next request to receive the results. |
next | ID for the next page request, if there is one. If no more pages are available, it will be empty. |
result | Request URL for you to use to receive generic emails. |
| GET | https://api.snov.io/v2/domain-search/generic-contacts/result/{task_hash} |
<?php function genericContactsResult() { $token = getAccessToken(); $task_hash = '0e36e43b9b91a9b20d14b82c1ee141f2'; $headers = [ 'Authorization: Bearer ' . $token, ]; $options = [ CURLOPT_URL => 'https://api.snov.io/v2/domain-search/generic-contacts/result/$task_hash', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $response = json_decode(curl_exec($ch), true); curl_close($ch); return $response; } ?>
def generic_contacts_result(): token = get_access_token() task_hash = '0e36e43b9b91a9b20d14b82c1ee141f2' headers = {'authorization': f'Bearer {token}'} res = requests.get(f'https://api.snov.io/v2/domain-search/generic-contacts/result/{task_hash}', headers=headers) return json.loads(res.text)
{
"data": [
{
"email": "orders@snov.io"
},
{
"email": "sales@snov.io"
}
],
"meta": {
"domain": "snov.io",
"tab": "service",
"task_hash": "0e36e43b9b91a9b20d14b82c1ee141f2",
"next": "",
"total_count": 9
},
"links": {
"next": ""
},
"status": "completed"
}
email | Generic contact’s email address. Keep in mind, these emails are unverified. To verify them, use the Email Verifier method. |
domain | Domain for which you’re retrieving generic emails. |
tab | Displays the type of results you’re getting. prospects indicates that you’re looking for prospect profiles. emails displays domain emails. service shows that you’re getting generic emails. |
task_hash | Unique ID for the search task you started. |
next | ID added to the request URL to access the next page of emails in case it exists. |
total_count | Total number of generic emails found for the domain. |
next | Request’s URL to retrieve results from the following page in case it exists. Each page has up to 50 emails. |
status | Request’s status. Can be completed or in progress. |
POSTCheck number of available emails
FreeWith this API method, you can find out the number of email addresses from a certain domain in our database. It`s completely free, so you don`t need credits to use it!
| POST | https://api.snov.io/v1/get-domain-emails-count |
domain | The name of the domain for which you`d like to know the number of emails in our database. |
<?php function getEmailCount() { $token = getAccessToken(); $params = [ 'access_token' => $token, 'domain' => 'octagon.com', ]; $options = [ CURLOPT_URL => 'https://api.snov.io/v1/get-domain-emails-count', CURLOPT_POST => true, CURLOPT_POSTFIELDS => $params, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def get_email_count(): token = get_access_token() params = {'access_token':token, 'domain':'octagon.com' } res = requests.post('https://api.snov.io/v1/get-domain-emails-count', data=params) return json.loads(res.text)
| { | ||||
| ||||
| } |
domain | The name of the domain for which you`d like to know the number of emails in our database. |
webmail | Is true if the domain you`re searching is webmail. |
result | A total number of email addresses we have found for this domain. We can`t provide results for webmail domains, so the result for webmail will always be 0
. |
POSTFind emails from name and domain
1 credit for each email with a valid or unknown statusEnter the prospect's name and company domain, and Snov.io will return their verified email address.
| POST | https://api.snov.io/v2/emails-by-domain-by-name/start |
The easiest way to send this request is through a raw JSON body. That said, here's an example if you prefer using Params
rows | An array of objects that contain prospect details (first name, last name and domain). Each request can have up to 10 objects. |
first_name | Prospect’s first name. |
last_name | Prospect’s last name. |
domain | The domain of the company for which the prospect works. |
webhook_url | Enter your webhook URL to receive results instantly rather than using a hash task. |
<?php function emailsByDomainByNameSearch() { $token = getAccessToken(); $headers = [ 'Authorization: Bearer ' . $token, ]; $params = [ 'rows' => [ [ 'first_name' => 'John', 'last_name' => 'Doe', 'domain' => 'yourdomain.com', ], [ 'first_name' => 'John', 'last_name' => 'Doe', 'domain' => 'yourdomain.com', ] ], 'webhook_url' => 'https://hooks.yourdomain.com', ]; $options = [ CURLOPT_URL => 'https://api.snov.io/v2/emails-by-domain-by-name/start', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query($params), CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $response = json_decode(curl_exec($ch), true); curl_close($ch); return $response; } ?>
def emails_by_domain_by_name_search(): token = get_access_token() headers = { 'authorization': f'Bearer {token}', 'Content-Type': 'application/json' } payload = json.dumps({ 'rows': [ { 'first_name': 'John', 'last_name': 'Doe', 'domain': 'yourdomain.com' }, { 'first_name': 'Jane', 'last_name': 'Doe', 'domain': 'yourdomain.com' }, ], 'webhook_url': 'https://hooks.yourdomain.com' }) res = requests.post('https://api.snov.io/v2/emails-by-domain-by-name/start', data=payload, headers=headers) return json.loads(res.text)
{
"data": {
"task_hash": "005ffad65aad581943cf65a45112ca7a"
},
"meta": {
"rows": [
{
"first_name": "John",
"last_name": "Doe",
"domain": "yourdomain.com"
},
{
"first_name": "Jane",
"last_name": "Doe",
"domain": "yourdomain.com"
}
]
}
}
task_hash | Unique ID for the search task you started. |
first_name | Prospect’s first name. |
last_name | Prospect’s last name. |
domain | The domain of the company for which the prospect works. |
| GET | https://api.snov.io/v2/emails-by-domain-by-name/result |
task_hash | Unique request ID you received from the previous request. |
<?php function emailsByDomainByNameResult() { $token = getAccessToken(); $task_hash = '475d03ac6f98c124349b0f2efb506702'; $headers = [ 'Authorization: Bearer ' . $token, ]; $options = [ CURLOPT_URL => 'https://api.snov.io/v2/emails-by-domain-by-name/result?task_hash=$task_hash', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $response = json_decode(curl_exec($ch), true); curl_close($ch); return $response; } ?>
def emails_by_domain_by_name_result(): token = get_access_token() task_hash = '0d0c862099b22bdf300b8c8e67754e49' headers = {'authorization': f'Bearer {token}'} params = {'task_hash': task_hash} res = requests.get(f'https://api.snov.io/v2/emails-by-domain-by-name/result', params=params, headers=headers) return json.loads(res.text)
{
"status": "completed",
"data": [
{
"people": "John Doe",
"result": [
{
"email": "john.doe@yourdomain.com",
"smtp_status": "valid",
"is_valid_format": true,
"is_disposable": false,
"is_webmail": false,
"is_gibberish": false
}
]
},
{
"people": "Jane Doe",
"result": [
{
"email": "jane.doe@yourdomain.com",
"smtp_status": "unknown",
"is_valid_format": true,
"is_disposable": false,
"is_webmail": false,
"is_gibberish": false,
"unknown_status_reason": "catchall"
}
]
}
],
"meta": {
"rows": [
{
"domain": "yourdomain.com",
"last_name": "Doe",
"first_name": "John"
},
{
"domain": "yourdomain.com",
"last_name": "Doe",
"first_name": "Jane"
}
],
"task_hash": "af50fb238757ad092ad6e57e130b0dea"
}
}
status | Request’s status. Could either be completed or in_progress. You may receive the not_enough_credits status if the account you're using for the search doesn’t have enough credits. |
people | Prospect’s full name. |
email | Prospect’s email. |
smtp_status | Can return valid, or unknown (aka Unverifiable). To view the reason for the unknown status, check the unknown_status_reason parameter. |
is_valid_format | Shows if the email format is valid. Can either be false or true. |
is_disposable | Indicates whether an email is temporary or disposable, returning either false or true. |
is_webmail | Is true if the email you’re searching is webmail. |
is_gibberish | Shows if the provided email address has random or meaningless characters. Will either be false or true. |
unknown_status_reason | If a verified email has an unknown smtp_status, you can find a more detailed reason here. Banned: High deliverability risk – this email couldn't be verified with 100% certainty. Catchall: Sender reputation risk – this email is a catch-all. Connection_error: Potential bounce risk – technical issues on the recipient’s side. Greylist: Deliverability risk – this email server uses graylisting filters. |
domain | Domain of the company for which the prospect is working. |
first_name | Prospect’s first name. |
last_name | Prospect’s last name. |
task_hash | Unique ID for this search task. |
POSTFind domain from company’s name
1 credit for each domain address foundEnter company names, and Snov.io will return their domain addresses
| POST | https://api.snov.io/v2/company-domain-by-name/start |
names[] | An array of company names for which you want to receive the domains. To retrieve domains for multiple companies, add each one as a separate parameter. For example: names[] | Snov.io names[] | Sendpulse You can provide up to 10 company names at the same time. |
webhook_url | Enter your webhook URL to receive results instantly rather than using a hash task. |
<?php function companyDomainByNameStart() { $token = getAccessToken(); $params = [ 'names' => ['Snov.io','SendPulse'], 'webhook_url' => 'https://hooks.yourdomain.com', ]; $headers = [ 'Authorization: Bearer ' . $token, ]; $options = [ CURLOPT_URL => 'https://api.snov.io/v2/company-domain-by-name/start', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query($params), CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $response = json_decode(curl_exec($ch), true); curl_close($ch); return $response; } ?>
def company_domain_by_name_start(): token = get_access_token() headers = {'authorization': f'Bearer {token}'} params = { 'webhook_url': 'https://hooks.yourdomain.com', 'names[]': ['Snov.io', 'Sendpulse'] } res = requests.post('https://api.snov.io/v2/company-domain-by-name/start', params=params, headers=headers) return json.loads(res.text)
{
"data": {
"task_hash": "959c0f60facb8629bba746e091a26f7b"
},
"meta": {
"names": [
"Snov.io",
"Sendpulse"
]
}
}
task_hash | Unique ID for the search task you started. |
names | An array of company names you provided. |
| GET | https://api.snov.io/v2/company-domain-by-name/result?task_hash={hash_from_1} |
task_hash | Unique request ID you received from the previous request. |
<?php function companyDomainByNameResult() { $token = getAccessToken(); $task_hash = '48c156a785cfc1f3b0edab2cc28b3774'; $headers = [ 'Authorization: Bearer ' . $token, ]; $options = [ CURLOPT_URL => 'https://api.snov.io/v2/company-domain-by-name/result?task_hash=$task_hash', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $response = json_decode(curl_exec($ch), true); curl_close($ch); return $response; } ?>
def company_domain_by_name_result(): token = get_access_token() task_hash = '959c0f60facb8629bba746e091a26f7b' headers = {'authorization': f'Bearer {token}'} params = { 'task_hash': task_hash } res = requests.get(f'https://api.snov.io/v2/company-domain-by-name/result', params=params, headers=headers) return json.loads(res.text)
{
"status": "completed",
"data": [
{
"name": "Snov.io",
"result": {
"domain": "snov.io"
}
},
{
"name": "Sendpulse",
"result": {
"domain": "sendpulse.com"
}
}
],
"meta": {
"names": [
"Snov.io",
"Sendpulse"
],
"task_hash": "959c0f60facb8629bba746e091a26f7b"
}
}
status | Request’s status. Could either be completed or in_progress. |
name | Company name for which you requested a domain address. |
domain | Company's domain. |
names | An array of company names you provided. |
task_hash | Unique ID for this search task. |
POSTGet LinkedIn profile info from URLs
1 credit for each prospect profile info providedEnter LinkedIn members’ URLs, and Snov.io will retrieve their complete profile information.
| POST | https://api.snov.io/v2/li-profiles-by-urls/start |
urls[] | An array of LinkedIn profile URLs for which you want to receive the full profile info. To retrieve profile info for multiple LinkedIn members at the same time, add each URL in a separate parameter. You can provide up to 10 LinkedIn URLs at the same time. |
webhook_url | Enter your webhook URL to receive results instantly rather than using a hash task. |
<?php function linkedInProfilesByUrlsStart() { $token = getAccessToken(); $params = [ 'urls' => ['https://www.linkedin.com/in/oleksii-kratko-6a0544187/','https://www.linkedin.com/in/atahualpamaia/'], 'webhook_url' => 'https://hooks.yourdomain.com', ]; $headers = [ 'Authorization: Bearer ' . $token, ]; $options = [ CURLOPT_URL => 'https://api.snov.io/v2/li-profiles-by-urls/start', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query($params), CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $response = json_decode(curl_exec($ch), true); curl_close($ch); return $response; } ?>
def linkedin_profiles_by_urls_start(): token = get_access_token() headers = {'authorization': f'Bearer {token}'} params = { 'urls[]': ['https://www.linkedin.com/in/atahualpamaia/', 'https://www.linkedin.com/in/oleksii-kratko-6a0544187/'], 'webhook_url': 'https://hooks.yourdomain.com', } res = requests.post('https://api.snov.io/v2/li-profiles-by-urls/start', params=params, headers=headers) return json.loads(res.text)
{
"data": {
"task_hash": "ef005a4f6d82e7e88384de7c72ee198d"
},
"meta": {
"urls": [
"https://www.linkedin.com/in/john-doe-32a416248/",
"https://www.linkedin.com/in/john-doe-04bb56b1/",
"https://www.linkedin.com/in/john-jungwoo-do/"
]
}
}
task_hash | Unique ID for the search task you started. |
urls | Profile URLs for which you’re requesting the info. |
| GET | https://api.snov.io/v2/li-profiles-by-urls/result |
task_hash | Unique request ID you received from the previous request. |
<?php function linkedInProfilesByUrlsResult() { $token = getAccessToken(); $task_hash = 'ef005a4f6d82e7e88384de7c72ee198d'; $headers = [ 'Authorization: Bearer ' . $token, ]; $options = [ CURLOPT_URL => 'https://api.snov.io/v2/li-profiles-by-urls/result?task_hash=$task_hash', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $response = json_decode(curl_exec($ch), true); curl_close($ch); return $response; } ?>
def linkedin_profiles_by_urls_result(): token = get_access_token() task_hash = '879788bd889b0b9aa447278ce184e2ad' headers = {'authorization': f'Bearer {token}'} params = { 'task_hash': task_hash } res = requests.get(f'https://api.snov.io/v2/li-profiles-by-urls/result', params=params, headers=headers) return json.loads(res.text)
{
"status": "completed",
"data": [
{
"url": "https://www.linkedin.com/in/john-doe-32a416248/",
"result": {
"name": "John Doe",
"first_name": "John",
"last_name": "Doe",
"industry": "Internet",
"location": "Chicago, Illinois, United States",
"country": "United States",
"positions": [
{
"name": "Stealth Startup",
"title": "CEO",
"linkedin_url": "https://www.linkedin.com/company/18583501",
"url": "https://www.linkedin.com/in/ruhbirsingh/",
"industry": "Computer Software",
"country": "India",
"location": "Gurugram, Haryana, India"
},
{
"name": "TikTok",
"title": "Influencer",
"linkedin_url": "https://www.linkedin.com/company/33246798",
"url": "https://www.tiktok.com/about?lang=en",
"industry": "Entertainment",
"country": "United States",
"location": "Los Angeles, California, United States"
}
]
}
},
{
"url": "https://www.linkedin.com/in/john-doe-04bb56b1/",
"result": []
},
{
"url": "https://www.linkedin.com/in/john-jungwoo-do/",
"result": {
"name": "John Do",
"first_name": "John",
"last_name": "Do",
"location": "Vancouver, British Columbia, Canada",
"country": "Canada",
"skills": [
"communication",
"java"
],
"positions": [
{
"name": "UBC Electrical and Computer Engineering",
"title": "Undergraduate Research Assistant",
"linkedin_url": "https://www.linkedin.com/company/15134449",
"url": "http://www.ece.ubc.ca",
"industry": "Higher Education",
"country": "Canada",
"location": "Vancouver, British Columbia, Canada"
},
{
"name": "The University of British Columbia",
"title": "Undergraduate Teaching Assistant",
"linkedin_url": "https://www.linkedin.com/company/4373",
"url": "http://www.ubc.ca",
"industry": "Higher Education",
"country": "Canada",
"location": "Vancouver, British Columbia, Canada",
"specializations": [
"Aboriginal Engagement",
"Alumni Engagement",
"Community Engagement",
"Intercultural Understanding",
"International Engagement",
"Outstanding Work Environment",
"Research Excellence",
"Student Learning",
"sustainability"
]
}
]
}
},
{
"url": "https://www.linkedin.com/in/john-doe-474006162/",
"result": []
}
],
"meta": {
"urls": [
"https://www.linkedin.com/in/john-doe-32a416248/",
"https://www.linkedin.com/in/john-doe-04bb56b1/",
"https://www.linkedin.com/in/john-jungwoo-do/",
"https://www.linkedin.com/in/john-doe-474006162/"
],
"task_hash": "8a60c72133d0ea94767e4a978355c630"
}
}
status | Request’s status. Could either be completed or in_progress. |
url | LinkedIn profile’s URL. |
name | Prospect’s full name. |
first_name | Prospect’s first name. |
last_name | Prospect’s last name. |
industry | Prospect's field of work. |
location | Prospect’s location. |
country | Country where the prospect is based, according to their LinkedIn profile. |
skills | Prospect’s skills. |
positions | Array of job roles currently held by the prospect. |
name | The name of the company the prospect is working for. |
title | Prospect’s job title. |
linkedin_url | Link to the company’s LinkedIn page. |
url | Company’s website address. |
industry | Company's industry. |
country | Country where the company’s headquarters are located. |
location | Company’s location. |
specializations | Company's areas of expertise or focus. |
urls | An array of LinkedIn profile URLs you’ve provided. |
task_hash | Unique ID for this search task. |
POSTEnrich person profile from email
1 credit per requestProvide an email address and Snov.io will return all the profile information connected to the provided email address owner from the database.
If we find no information about the email owner in our database, you will not be charged for the request.
| POST | https://api.snov.io/v1/get-profile-by-email |
email | The email address of the person you want to find additional information on. |
<?php function getProfileByEmail() { $token = getAccessToken(); $params = [ 'access_token' => $token, 'email' => 'gavin.vanrooyen@octagon.com' ]; $options = [ CURLOPT_URL => 'https://api.snov.io/v1/get-profile-by-email', CURLOPT_POST => true, CURLOPT_POSTFIELDS => $params, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def get_profile_by_email(): token = get_access_token() params = {'access_token':token, 'email':'gavin.vanrooyen@octagon.com' } res = requests.post('https://api.snov.io/v1/get-profile-by-email', data=params) return json.loads(res.text)
{
"success": true,
"id": 301592,
"source": "linkedIn",
"name": "Lizi Hamer",
"firstName": "Lizi",
"lastName": "Hamer",
"logo": "https://app.snov.io/img/peoples/010fcf23c70dfa68d880545ec89a9215.jpg",
"industry": null,
"country": "Singapore",
"locality": "Singapore",
"social": [
{
"link": "https://www.linkedin.com/in/lizihamer/",
"type": "linkedIn"
},
{
"link": "https://twitter.com/LiziHamer",
"type": "twitter"
}
],
"currentJobs": [
{
"companyName": "Octagon",
"position": "Regional Creative Director",
"socialLink": "https://www.linkedin.com/company/165282",
"site": "www.octagon.com",
"locality": "Greater New York City Area",
"state": "Connecticut",
"city": "Stamford",
"street": "290 Harbor Dr",
"street2": "2nd Floor",
"postal": "06902",
"founded": "1983",
"startDate": "2016-01-31",
"endDate": null,
"size": "1-10",
"industry": "Marketing and Advertising",
"companyType": "Public Company",
"country": "United States"
},
{
"companyName": "SisuGirls",
"position": "Co Founder",
"socialLink": "https://www.linkedin.com/company/3841118",
"site": "http://www.sisugirls.org",
"locality": null,
"state": "SG",
"city": "Singapore",
"street": "33-03 Hong Leong Building",
"street2": null,
"postal": null,
"founded": "2014",
"startDate": "2015-07-31",
"endDate": null,
"size": "1-10",
"industry": "Health, Wellness and Fitness",
"companyType": null,
"country": "Singapore"
}
],
"previousJobs": [
{
"companyName": "Fusion Co-innovation Labs",
"position": "Creative Entrepreneur",
"socialLink": null,
"site": null,
"locality": null,
"state": null,
"city": null,
"street": null,
"street2": null,
"postal": null,
"founded": null,
"startDate": "2013-05-31",
"endDate": "2013-10-31",
"size": null,
"industry": null,
"companyType": null,
"country": null
},
{
"companyName": "Russell Commission",
"position": "Youth Advisory Board Member",
"socialLink": null,
"site": null,
"locality": null,
"state": null,
"city": null,
"street": null,
"street2": null,
"postal": null,
"founded": null,
"startDate": "2004-06-30",
"endDate": "2006-06-30",
"size": null,
"industry": null,
"companyType": null,
"country": null
}
],
"lastUpdateDate": "2018-02-07 10:12:28"
}id | A unique profile identifier. |
source | The source of retrieved personal data. |
name | The email address owner`s full name. |
firstName | The person`s first name. |
lastName | The person`s last name. |
logo | The person`s profile photo. |
industry | The person`s industry as indicated in the source. |
country | The person`s country as indicated in the source. |
locality | The person`s locality as indicated in the source. |
social | Links to the person`s social profiles. |
currentJobs | An array containing information about the person`s current job position(s). |
previousJobs | An array containing information about the person`s previous job position(s). |
lastUpdateDate | The date of the last profile update in the database. |
POSTEmail Verifier
Enter email addresses, and Snov.io will run a complete verification check. You can check up to 10 emails at the same time.Providing emails
| POST | https://api.snov.io/v2/email-verification/start |
emails[] | Emails you want to verify. To verify multiple emails at the same time, add each email as a separate parameter. For example: emails[] | help@snov.io emails[] | partnerships@snov.io You can check up to 10 emails at the same time. |
webhook_url | Enter your webhook URL to receive results instantly rather than using a hash task. |
<?php function emailVerificationStart() { $token = getAccessToken(); $params = [ 'emails' => ['gavin.vanrooyen@octagon.com','lizi.hamer@octagon.com','admin@snov.io','test@snov.io','ivalid_format_snov.io'], 'webhook_url' => 'https://hooks.yourdomain.com', ]; $headers = [ 'Authorization: Bearer ' . $token, ]; $options = [ CURLOPT_URL => 'https://api.snov.io/v2/email-verification/start', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query($params), CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $response = json_decode(curl_exec($ch), true); curl_close($ch); return $response; } ?>
def email_verification_start(): token = get_access_token() headers = {'authorization': f'Bearer {token}'} params = { 'emails[]': ['gavin.vanrooyen@octagon.com', 'lizi.hamer@octagon.com', 'admin@snov.io', 'test@snov.io', 'ivalid_format_snov.io'], 'webhook_url': 'https://hooks.yourdomain.com', } res = requests.post('https://api.snov.io/v2/email-verification/start', params=params, headers=headers) return json.loads(res.text)
{
"data": {
"task_hash": "0110437df6811068197577a538849a4b"
},
"meta": {
"emails": [
"gavin.vanrooyen@octagon.com",
"lizi.hamer@octagon.com",
"admin@snov.io",
"test@snov.io",
"ivalid_format_snov.io"
]
}
}
task_hash | Unique ID for the search task you started. |
emails | An array of emails you provided for verification. |
| GET | https://api.snov.io/v2/email-verification/result |
task_hash | Unique request ID you received from the previous request. |
<?php function emailVerificationResult() { $token = getAccessToken(); $task_hash = '0110437df6811068197577a538849a4b'; $headers = [ 'Authorization: Bearer ' . $token, ]; $options = [ CURLOPT_URL => 'https://api.snov.io/v2/email-verification/result?task_hash=$task_hash', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $response = json_decode(curl_exec($ch), true); curl_close($ch); return $response; } ?>
def email_verification_result(): token = get_access_token() task_hash = 'b55b28d5419a1c3ec310f21916e4e271' headers = {'authorization': f'Bearer {token}'} params = { 'task_hash': task_hash } res = requests.get(f'https://api.snov.io/v2/email-verification/result', params=params, headers=headers) return json.loads(res.text)
{
"status": "completed",
"data": [
{
"email": "gavin.vanrooyen@octagon.com",
"result": {
"is_webmail": false,
"smtp_status": "unknown",
"is_gibberish": false,
"is_disposable": false,
"is_valid_format": true,
"unknown_status_reason": "catchall"
}
},
{
"email": "admin@snov.io",
"result": {
"is_webmail": false,
"smtp_status": "valid",
"is_gibberish": false,
"is_disposable": false,
"is_valid_format": true
}
},
{
"email": "ivalid_format_snov.io",
"result": {
"is_webmail": false,
"smtp_status": "not_valid",
"is_gibberish": false,
"is_disposable": false,
"is_valid_format": false
}
},
{
"email": "lizi.hamer@octagon.com",
"result": {
"is_webmail": false,
"smtp_status": "unknown",
"is_gibberish": false,
"is_disposable": false,
"is_valid_format": true,
"unknown_status_reason": "catchall"
}
},
{
"email": "test@snov.io",
"result": {
"smtp_status": "unknown",
"is_valid_format": true,
"is_disposable": false,
"is_webmail": false,
"is_gibberish": true,
"unknown_status_reason": "banned"
}
}
],
"meta": {
"emails": [
"gavin.vanrooyen@octagon.com",
"lizi.hamer@octagon.com",
"admin@snov.io",
"test@snov.io",
"ivalid_format_snov.io"
],
"task_hash": "0110437df6811068197577a538849a4b"
}
}
status | Request’s status. Could either be completed or in_progress. |
email | Email address you’re verifying. |
smtp_status | Can return valid, not_valid, or unknown (aka Unverifiable). To view the reason for the unknown status, check the unknown_status_reason parameter. |
is_valid_format | Shows if the email format is valid. Can either be false or true. |
is_disposable | Indicates whether an email is temporary or disposable, returning either false or true. |
is_webmail | Is true if the email you’re searching is webmail. |
is_gibberish | Shows if the provided email address has random or meaningless characters. Will either be false or true. |
unknown_status_reason | If a verified email has an unknown smtp_status, you can find a more detailed reason here. Banned: High deliverability risk – this email couldn't be verified with 100% certainty. Catchall: Sender reputation risk – this email is a catch-all. Connection_error: Potential bounce risk – technical issues on the recipient’s side. Greylist: Deliverability risk – this email server uses graylisting filters. Hidden_by_owner: The email owner or the company that owns the domain requested its removal from Snov.io results. |
emails | An array of emails you’re verifying. |
task_hash | Unique request ID for this verification task. |
POSTAdd new email account
This method connects a new SMTP/IMAP email account to your snov.io workspace so it can be used as a sender in campaigns. The account is created even if the SMTP/IMAP connection check has not yet finished — the connection status is returned asynchronously in the smtp.status / imap.status fields and can be polled afterwards. Only SMTP/IMAP accounts (other provider type) are supported; Gmail and Microsoft OAuth flows are out of scope.
| POST | https://api.snov.io/v2/sender-accounts/emails |
sender_name *Required | Sender display name, max 100 characters. |
email_from *Required | Sender email address. |
password *Required | Password or app-password for the SMTP/IMAP account. Stored encrypted. |
smtp *Required | Object with SMTP settings. |
smtp.host *Required | SMTP host, e.g. smtp.gmail.com. |
smtp.port *Required | SMTP port. Allowed values: 25, 465, 587. |
smtp.encryption *Required | Encryption type. Allowed values: ssl, tls, none. Must match the port: 465 → ssl, 587 → tls, 25 → none. |
imap | Object with IMAP settings. Optional, but if provided all sub-fields are required. |
imap.host | IMAP host, e.g. imap.gmail.com. Required when imap is present. |
imap.port | IMAP port. Allowed values: 143, 993. Required when imap is present. |
imap.encryption | Encryption type. Allowed values: ssl, tls, none. Must match the port: 993 → ssl or tls, 143 → none. Required when imap is present. |
reply_to | Reply-to email address. |
limitation | Daily sending limit. Integer, min 1, max 1200. Default: 50. Cannot exceed the maximum amount of emails the account could send within 24 hours given the configured delay. |
delay_type | Delay type between emails. Allowed values: fixed, random. Default: random. |
delay_fixed | Fixed delay in seconds (used when delay_type=fixed). Integer, min 5, max 3600. Default: 600. |
delay_from | Minimum delay in seconds (used when delay_type=random). Integer, min 5, max 3600. Default: 600. |
delay_to | Maximum delay in seconds (used when delay_type=random). Integer, min 5, max 3600, must be greater than delay_from. Default: 900. |
signature | HTML signature appended to outgoing emails. |
bcc_email | BCC email address. |
tags | Array of strings. Existing tags are matched by name, new ones are created and attached to the account. |
timezoneId | Integer ID of the account timezone. Min 1, max 458. |
<?php function createEmailAccount() { $token = getAccessToken(); $params = json_encode([ 'sender_name' => 'John Smith', 'email_from' => 'john@example.com', 'password' => 'app_password_here', 'smtp' => [ 'host' => 'smtp.gmail.com', 'port' => 465, 'encryption' => 'ssl' ], 'imap' => [ 'host' => 'imap.gmail.com', 'port' => 993, 'encryption' => 'ssl' ], 'limitation' => 50, 'delay_type' => 'random', 'delay_from' => 600, 'delay_to' => 900, 'reply_to' => 'replies@example.com', 'bcc_email' => 'bcc@example.com', 'tags' => ['Canada campaign 2025'] ]); $options = [ CURLOPT_URL => 'https://api.snov.io/v2/sender-accounts/emails', CURLOPT_POST => true, CURLOPT_POSTFIELDS => $params, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $token, 'Content-Type: application/json' ] ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def create_email_account(): token = get_access_token() headers = { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' } params = { 'sender_name': 'John Smith', 'email_from': 'john@example.com', 'password': 'app_password_here', 'smtp': { 'host': 'smtp.gmail.com', 'port': 465, 'encryption': 'ssl' }, 'imap': { 'host': 'imap.gmail.com', 'port': 993, 'encryption': 'ssl' }, 'limitation': 50, 'delay_type': 'random', 'delay_from': 600, 'delay_to': 900, 'reply_to': 'replies@example.com', 'bcc_email': 'bcc@example.com', 'tags': ['Canada campaign 2025'] } res = requests.post( 'https://api.snov.io/v2/sender-accounts/emails', headers=headers, json=params ) return json.loads(res.text)
{
"data": {
"id": 869852,
"sender_name": "John Smith",
"email_from": "john@example.com",
"smtp": {
"host": "smtp.gmail.com",
"port": 465,
"encryption": "ssl",
"status": "pending"
},
"imap": {
"host": "imap.gmail.com",
"port": 993,
"encryption": "ssl",
"status": "pending"
},
"limitation": 50,
"delay_type": "random",
"delay_from": 600,
"delay_to": 900,
"reply_to": "replies@example.com",
"bcc_email": "bcc@example.com",
"tags": ["Canada campaign 2025"],
"created_at": "2026-03-20T10:00:00+00:00"
}
}
data.id | ID of the created sender account. |
data.sender_name | Sender display name. |
data.email_from | Sender email address. |
data.smtp | SMTP settings: host, port, encryption, plus a status field with the connection check result (pending, connected, error). |
data.imap | IMAP settings (only present if IMAP was configured): host, port, encryption, status. |
data.limitation | Daily sending limit. |
data.delay_type | Delay type: fixed or random. |
data.delay_from | Minimum delay in seconds (for delay_type=random). |
data.delay_to | Maximum delay in seconds (for delay_type=random). |
data.delay_fixed | Fixed delay in seconds (for delay_type=fixed). |
data.reply_to | Reply-to email address. |
data.signature | HTML signature (only present if provided). |
data.bcc_email | BCC email address. |
data.tags | Array of tags attached to the account. |
data.timezoneId | Timezone ID (only present if set in the request). |
data.created_at | Account creation timestamp. |
PATCHUpdate email account
This method updates an existing SMTP/IMAP sender account. All fields are optional, but at least one valid field must be provided — only the supplied fields are changed, the rest stay untouched. When any SMTP or IMAP field is included, a fresh asynchronous connection check is triggered and the resulting status is returned in smtp.status / imap.status. If tags is provided, the new array fully replaces the account's current tag list (replace, not merge).
| PATCH | https://api.snov.io/v2/sender-accounts/emails/{id} |
id *Required (path) | ID of the sender account to update. |
sender_name | New sender display name, max 100 characters. |
email_from | New sender email address. |
password | New password or app-password for the SMTP/IMAP account. Stored encrypted. |
smtp | Object with new SMTP settings (host, port, encryption). When smtp is present, all three sub-fields are required and must satisfy the port/encryption pairing rules (465 → ssl, 587 → tls, 25 → none). |
smtp.host | SMTP host. Max 100 characters; format: ^[a-zA-Z0-9][a-zA-Z0-9-.]*. Required when smtp is present. |
smtp.port | Allowed values: 25, 465, 587. Required when smtp is present. |
smtp.encryption | Must match the port: 465 → ssl, 587 → tls, 25 → none. Required when smtp is present. |
imap | Object with new IMAP settings (host, port, encryption). When imap is present, all three sub-fields are required (993 → ssl or tls, 143 → none) |
imap.host | IMAP host. Max 100 characters. Required when imap is present. |
imap.port | Allowed values: 143, 993. Required when imap is present. |
imap.encryption | Must match the port: 993 → ssl or tls; 143 → none. Required when imap is present. |
reply_to | New reply-to email address. Pass null to clear. |
limitation | New daily sending limit. Integer, min 1, max 1200. Cannot exceed the maximum amount of emails the account could send within 24 hours given the configured delay. |
delay_type | New delay type. Allowed values: fixed, random. |
delay_fixed | Fixed delay in seconds (used when delay_type=fixed). Integer, min 5, max 3600. |
delay_from | Minimum delay in seconds (used when delay_type=random). Integer, min 5, max 3600. |
delay_to | Maximum delay in seconds (used when delay_type=random). Integer, min 5, max 3600, must be greater than delay_from. |
signature | New HTML signature. Pass null to clear. |
bcc_email | New BCC email address. Pass null to clear. |
tags | New array of tags. Fully replaces the current tag list. Pass null to clear all tags. |
timezoneId | Integer ID of the account timezone. Min 1, max 458. |
<?php function updateEmailAccount($accountId) { $token = getAccessToken(); $params = json_encode([ 'sender_name' => 'John Smith Updated', 'limitation' => 100, 'delay_type' => 'fixed', 'delay_fixed' => 600, 'tags' => ['Canada campaign 2025', 'Q2'] ]); $options = [ CURLOPT_URL => 'https://api.snov.io/v2/sender-accounts/emails/' . $accountId, CURLOPT_CUSTOMREQUEST => 'PATCH', CURLOPT_POSTFIELDS => $params, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $token, 'Content-Type: application/json' ] ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def update_email_account(account_id): token = get_access_token() headers = { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' } params = { 'sender_name': 'John Smith Updated', 'limitation': 100, 'delay_type': 'fixed', 'delay_fixed': 600, 'tags': ['Canada campaign 2025', 'Q2'] } res = requests.patch( f'https://api.snov.io/v2/sender-accounts/emails/{account_id}', headers=headers, json=params ) return json.loads(res.text)
{
"data": {
"id": 869852,
"sender_name": "John Smith Updated",
"email_from": "john@example.com",
"smtp": {
"host": "smtp.gmail.com",
"port": 465,
"encryption": "ssl",
"status": "pending"
},
"imap": {
"host": "imap.gmail.com",
"port": 993,
"encryption": "ssl",
"status": "pending"
},
"limitation": 100,
"delay_type": "fixed",
"delay_fixed": 600,
"reply_to": "replies@example.com",
"bcc_email": "bcc@example.com",
"tags": ["Canada campaign 2025", "Q2"],
"updated_at": "2026-04-22T11:04:37+00:00"
}
}
data.id | ID of the sender account. |
data.sender_name | Sender display name. |
data.email_from | Sender email address. |
data.smtp | SMTP settings: host, port, encryption, plus a status field with the connection check result (pending, valid, invalid). |
data.imap | IMAP settings (only present if IMAP is configured): host, port, encryption, status. |
data.limitation | Daily sending limit. |
data.delay_type | Delay type: fixed or random. |
data.delay_from | Minimum delay in seconds (for delay_type=random). |
data.delay_to | Maximum delay in seconds (for delay_type=random). |
data.delay_fixed | Fixed delay in seconds (for delay_type=fixed). |
data.reply_to | Reply-to email address. |
data.signature | HTML signature (only present if provided). |
data.bcc_email | BCC email address. |
data.tags | Array of tags attached to the account. |
data.timezoneId | Timezone ID (only present if set). |
data.updated_at | Timestamp of the last update. |
GETCheck sender SMTP/IMAP status
This method checks the SMTP and (optionally) IMAP connection status of a connected email sender account. Use it to verify whether a sender account is currently valid and operational, and to retrieve any connection errors.
| GET | https://api.snov.io/v2/sender-accounts/check-sender-status |
sender_account_id *Required | ID of the sender email account to check. Integer, minimum value: 1. |
<?php function checkSenderStatus($senderAccountId) { $token = getAccessToken(); $query = http_build_query([ 'sender_account_id' => $senderAccountId ]); $options = [ CURLOPT_URL => 'https://api.snov.io/v2/sender-accounts/check-sender-status?' . $query, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $token, 'Content-Type: application/json' ] ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def check_sender_status(sender_account_id): token = get_access_token() headers = { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' } params = { 'sender_account_id': sender_account_id } res = requests.get( 'https://api.snov.io/v2/sender-accounts/check-sender-status', headers=headers, params=params ) return json.loads(res.text)
{
"data": {
"smtp": {
"status": "valid"
},
"imap": {
"status": "valid"
}
}
}
{
"data": {
"smtp": {
"status": "invalid",
"errors": [
"Connection refused"
]
},
"imap": null
}
}
data | An object with connection status details for the sender account. |
smtp | An object describing the SMTP connection status: status (pending, valid, invalid) and errors (array of error messages, present when status is invalid). |
imap | An object describing the IMAP connection status with the same shape as smtp. Returns null when IMAP was not configured during account creation. |
GETGet a list of all email accounts
FreeThis method shows a list of all connected email accounts.
| GET | https://api.snov.io/v2/sender-accounts/emails |
| There's no input parameters for this method |
<?php function getSenderEmails() { $token = getAccessToken(); $options = [ CURLOPT_URL => 'https://api.snov.io/v2/sender-accounts/emails', CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $token, 'Content-Type: application/json', ], ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def get_sender_emails(): token = get_access_token() headers = { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' } res = requests.get('https://api.snov.io/v2/sender-accounts/emails', headers=headers) return json.loads(res.text)
{
"data": [
{
"id": 11980,
"sender_name": "Den Johnson",
"email_from": "den.johnson@snov.io",
"valid": true,
"suspended": false,
"limitation": 50,
"provider": "hostinger",
"tags": [
"Den's account"
],
"imap": {
"username": "den.johnson@snov.io",
"valid": true
}
},
{
"id": 12355,
"sender_name": "Anna",
"email_from": "anna@snov.io",
"valid": false,
"suspended": false,
"limitation": 50,
"provider": "godaddy",
"tags": [
"Work"
],
"imap": {
"username": "anna@snov.io",
"valid": false
}
}
]
}
id | Unique ID of the email account. |
sender_name | The sender name, or "From name". It's the name displayed in a recipient's inbox that shows who the email is from. |
email_from | Full email address. |
valid | Shows true if the sender account is valid. Returns false when it's not valid. |
suspended | Shows true if sending from the account is suspended. Returns false when the account is operational. |
limitation | Account's daily sending limits. |
provider | Email account's provider. |
tags | Tags assigned to the account. |
imap | An array of IMAP details for the account. |
username | Username email selected to receive replies to instead of the default email account. |
valid | Shows true when IMAP is enabled. Returns false when IMAP is disabled. |
POSTCreate warm-up campaign
This method creates and starts a new warm-up campaign for the specified email account. Warm-up gradually improves the account's sending reputation by exchanging short emails with a curated network of recipients. Choose the progressive strategy to ramp up daily volume from a small starting point, or the steady strategy to send a fixed number of warm-up emails per day; provide your own subject and body or let snov.io auto-generate them.
| POST | https://api.snov.io/v2/warm-up |
email_account_id *Required | Integer. ID of the email account to warm up. |
strategy | Sending strategy. Allowed values: progressive, steady. Default: progressive. |
per_day *Required | Integer. Daily sending goal. Range 1–1000 depending on the pricing plan. |
from | Integer. Starting daily volume (progressive strategy only). Range 1–5, must be ≤ per_day. Required when strategy=progressive. |
increase | Integer. Daily volume increase (progressive strategy only). Range 1–5. Required when strategy=progressive. |
email_content | Email content type. Allowed values: autogenerated (AI-generated), specific (custom). Default: autogenerated. |
subject | String. Email subject, 1–200 characters. Required when email_content=specific. |
body | String. Email body, 1–10000 characters. Required when email_content=specific. |
reply_rate | Integer. Percentage of incoming warm-up emails that will be replied to. Range 10–45. Default: 30. |
campaign_deadline | String (YYYY-MM-DD). Date when the warm-up should stop. Omit for no deadline. |
providers | Array of strings. Target recipient providers. Allowed values: gmail, microsoft, aliyun, hostinger, private email, zoho, titan, godaddy, other. |
send_to_paid_domain | Boolean. Whether to send to paid domains. Default: false. |
enable_ctd | Boolean. Enable custom tracking domain. Default: false. |
enable_proxy | Boolean. Enable dynamic proxy. Default: false. |
schedule_id | Integer. ID of a sending schedule to attach to the warm-up. |
template_name | String. Name of a saved email template to use. |
<?php function createWarmUp() { $token = getAccessToken(); $params = json_encode([ 'email_account_id' => 123, 'strategy' => 'progressive', 'per_day' => 50, 'from' => 2, 'increase' => 2, 'reply_rate' => 30, 'campaign_deadline' => '2026-12-31', 'send_to_paid_domain' => false, 'enable_proxy' => false ]); $options = [ CURLOPT_URL => 'https://api.snov.io/v2/warm-up', CURLOPT_POST => true, CURLOPT_POSTFIELDS => $params, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $token, 'Content-Type: application/json' ], ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def create_warm_up(): token = get_access_token() headers = { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' } params = { 'email_account_id': 123, 'strategy': 'progressive', 'per_day': 50, 'from': 2, 'increase': 2, 'reply_rate': 30, 'campaign_deadline': '2026-12-31', 'send_to_paid_domain': False, 'enable_proxy': False } res = requests.post( 'https://api.snov.io/v2/warm-up', headers=headers, json=params ) return json.loads(res.text)
{
"data": {
"id": 123
},
"success": true
}
success | Boolean. true when the warm-up was created. |
data.id | ID of the created warm-up campaign. |
GETGet list of warm-up campaigns
This method returns a paginated list of all warm-up campaigns in the account, optionally filtered by status. Each item has the same shape as the response of Get warm-up campaign info.
| GET | https://api.snov.io/v2/warm-up |
page | Integer. Page number. Default: 1. Minimum: 1. |
per_page | Integer. Number of results per page. Allowed values: 20, 50, 100. Default: 20. |
status | Filter by status. Allowed values: active, paused, completed, error. Omit to return all. |
<?php function getWarmUpList() { $token = getAccessToken(); $params = http_build_query([ 'page' => 1, 'per_page' => 20, 'status' => 'active' ]); $options = [ CURLOPT_URL => 'https://api.snov.io/v2/warm-up?' . $params, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $token, 'Content-Type: application/json' ], ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def get_warm_up_list(): token = get_access_token() headers = { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' } params = { 'page': 1, 'per_page': 20, 'status': 'active' } res = requests.get( 'https://api.snov.io/v2/warm-up', headers=headers, params=params ) return json.loads(res.text)
{
"data": [
{
"id": 1,
"status": "active",
"reply_rate": 30,
"send_to_paid_domain": false,
"start_date": "2026-03-26",
"campaign_deadline": "2026-12-21",
"strategy": "progressive",
"per_day": 2,
"from": 2,
"increase": 2,
"subject": null,
"body": null,
"template_name": null,
"enable_ctd": false,
"schedule": null,
"email_account": {
"id": 732745,
"email_from": "john@example.com",
"type": "microsoft",
"delay": 30,
"limit": 15,
"per_day": 50,
"schedule_required": false,
"provider": "gmail",
"custom_tracking_domain": null
},
"enable_proxy": false,
"sent_today": 2,
"daily_limit": 2,
"total_saved_from_spam": 5,
"deliverability": 88,
"warm_up_error": null
}
],
"success": true,
"meta": {
"total_items": 1,
"page": 1,
"per_page": 20,
"total_pages": 1
}
}
success | Boolean. true when the request succeeded. |
data | Array of warm-up campaign objects. Each item has the same shape as the response of Get warm-up campaign info (see data.* fields there). |
meta.total_items | Total number of items across all pages. |
meta.page | Current page number. |
meta.per_page | Number of items per page. |
meta.total_pages | Total number of pages. |
GETGet warm-up campaign info
This method returns full details of a single warm-up campaign by its ID — including strategy settings, daily limits, current deliverability stats and the connected email account.
| GET | https://api.snov.io/v2/warm-up/{id} |
id *Required(path) | Integer. ID of the warm-up campaign. |
<?php function getWarmUpById($warmUpId) { $token = getAccessToken(); $options = [ CURLOPT_URL => 'https://api.snov.io/v2/warm-up/' . $warmUpId, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $token, 'Content-Type: application/json' ], ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def get_warm_up_by_id(warm_up_id): token = get_access_token() headers = { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' } res = requests.get( f'https://api.snov.io/v2/warm-up/{warm_up_id}', headers=headers ) return json.loads(res.text)
{
"data": {
"id": 123,
"status": "active",
"reply_rate": 30,
"send_to_paid_domain": false,
"start_date": "2026-03-26",
"campaign_deadline": "2026-12-21",
"strategy": "progressive",
"per_day": 2,
"from": 2,
"increase": 2,
"subject": null,
"body": null,
"template_name": null,
"enable_ctd": false,
"schedule": null,
"email_account": {
"id": 732745,
"email_from": "john@example.com",
"type": "google",
"delay": 30,
"limit": 15,
"per_day": 50,
"schedule_required": false,
"provider": "gmail",
"custom_tracking_domain": null
},
"enable_proxy": false,
"sent_today": 2,
"daily_limit": 2,
"total_saved_from_spam": 106,
"deliverability": 88,
"warm_up_error": null
},
"success": true
}
success | Boolean. true when the request succeeded. |
data.id | Warm-up campaign ID. |
data.status | Campaign status: active, pending, paused, completed, error. |
data.reply_rate | Percentage of received emails that will be replied to (10–45). |
data.send_to_paid_domain | Whether the campaign sends to paid domains. |
data.start_date | Campaign start date (YYYY-MM-DD). |
data.campaign_deadline | Campaign end date (YYYY-MM-DD). null when no deadline is set. |
data.strategy | Sending strategy: progressive or steady. |
data.per_day | Daily sending goal. |
data.from | Starting daily volume (progressive strategy only). |
data.increase | Daily volume increase (progressive strategy only). |
data.subject | Email subject (only when email_content=specific). |
data.body | Email body (only when email_content=specific). |
data.template_name | Template name. |
data.enable_ctd | Whether the custom tracking domain is enabled. |
data.schedule | Sending schedule attached to the campaign, or null. |
data.enable_proxy | Whether the dynamic proxy is enabled. |
data.sent_today | Number of warm-up emails sent today. |
data.daily_limit | Daily sending limit currently applied. |
data.total_saved_from_spam | Total number of emails rescued from spam since the campaign started. |
data.deliverability | Inbox delivery rate (%). |
data.warm_up_error | Error description if the warm-up entered the error state, otherwise null. |
data.email_account | Connected email account details. |
data.email_account.id | Email account ID. |
data.email_account.email_from | Email address of the account. |
data.email_account.type | Account type (e.g. google, microsoft). |
data.email_account.delay | Delay between emails (seconds). |
data.email_account.limit | Total email limit for the account. |
data.email_account.per_day | Daily limit for the account. |
data.email_account.schedule_required | Whether a schedule is required for this account. |
data.email_account.provider | Email provider: gmail, microsoft, hostinger, zoho, titan, godaddy, other, etc. |
data.email_account.custom_tracking_domain | Custom tracking domain, or null. |
PATCHUpdate warm-up campaign
This method partially updates an existing warm-up campaign. Only the fields you pass are changed; all other settings stay as they were. Use this method to change campaign settings on the fly, switch the status (active, paused, completed, deleted), or remove the deadline by sending make_endless: true.
| PATCH | https://api.snov.io/v2/warm-up/{id} |
id *Required(path) | Integer. ID of the warm-up campaign to update. |
status | Manually change the campaign status. Allowed values: active, paused, completed, deleted. |
strategy | New sending strategy: progressive or steady. |
per_day | New daily sending goal. Range 1–1000 depending on the pricing plan. |
from | New starting daily volume. Range 1–10. Required when strategy=progressive. |
increase | New daily volume increase. Range 1–5. Required when strategy=progressive. |
email_content | Email content type: autogenerated or specific. |
subject | New email subject, 1–200 characters. Required when email_content=specific. |
body | New email body, 1–10000 characters. Required when email_content=specific. |
reply_rate | New reply-rate percentage. Range 10–45. |
campaign_deadline | New campaign end date (YYYY-MM-DD). |
make_endless | Boolean. Pass true to remove the current campaign_deadline and make the campaign endless. |
providers | New target recipient providers (same allowed values as in Create warm-up campaign). |
send_to_paid_domain | Boolean. |
enable_ctd | Boolean. Enable or disable the custom tracking domain. |
enable_proxy | Boolean. Enable or disable the dynamic proxy. |
schedule_id | New sending schedule ID. |
template_name | New template name. |
<?php function updateWarmUp($warmUpId) { $token = getAccessToken(); $params = json_encode([ 'reply_rate' => 10, 'campaign_deadline' => '2027-06-30', 'enable_proxy' => true ]); $options = [ CURLOPT_URL => 'https://api.snov.io/v2/warm-up/' . $warmUpId, CURLOPT_CUSTOMREQUEST => 'PATCH', CURLOPT_POSTFIELDS => $params, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $token, 'Content-Type: application/json' ], ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def update_warm_up(warm_up_id): token = get_access_token() headers = { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' } params = { 'reply_rate': 10, 'campaign_deadline': '2027-06-30', 'enable_proxy': True } res = requests.patch( f'https://api.snov.io/v2/warm-up/{warm_up_id}', headers=headers, json=params ) return json.loads(res.text)
{
"data": {
"id": 123
},
"success": true
}
success | Boolean. true when the warm-up was updated. |
data.id | ID of the updated warm-up campaign. |
DELETEDelete warm-up campaign
This method deletes a warm-up campaign by its ID. Once deleted, the campaign and its statistics are no longer accessible through other warm-up API methods.
| DELETE | https://api.snov.io/v2/warm-up/{id} |
id *Required(path) | Integer. ID of the warm-up campaign to delete. |
<?php function deleteWarmUp($warmUpId) { $token = getAccessToken(); $options = [ CURLOPT_URL => 'https://api.snov.io/v2/warm-up/' . $warmUpId, CURLOPT_CUSTOMREQUEST => 'DELETE', CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $token, 'Content-Type: application/json' ], ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def delete_warm_up(warm_up_id): token = get_access_token() headers = { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' } res = requests.delete( f'https://api.snov.io/v2/warm-up/{warm_up_id}', headers=headers ) return json.loads(res.text)
{
"data": {
"id": 123
},
"success": true
}
success | Boolean. true when the warm-up was deleted. |
data.id | ID of the deleted warm-up campaign. |
GETGet warm-up statistics
This method returns daily and per-provider deliverability statistics for a warm-up campaign — either over a preset window (two_weeks / month) or a custom date range. Useful for monitoring inbox-rate progress and spotting providers where the warm-up is underperforming.
| GET | https://api.snov.io/v2/warm-up/statistics/{id} |
id *Required(path) | Integer. ID of the warm-up campaign. |
period | Preset period. Allowed values: two_weeks, month. Required when date_from / date_to are not provided. |
date_from | String (YYYY-MM-DD). Start of a custom date range. Required when period is not provided. |
date_to | String (YYYY-MM-DD). End of a custom date range. Must be ≥ date_from and ≥ the campaign start date. Required when period is not provided. |
<?php function getWarmUpStatistics($warmUpId) { $token = getAccessToken(); $params = http_build_query([ 'period' => 'two_weeks' ]); $options = [ CURLOPT_URL => 'https://api.snov.io/v2/warm-up/statistics/' . $warmUpId . '?' . $params, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $token, 'Content-Type: application/json' ], ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def get_warm_up_statistics(warm_up_id): token = get_access_token() headers = { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' } params = { 'period': 'two_weeks' } res = requests.get( f'https://api.snov.io/v2/warm-up/statistics/{warm_up_id}', headers=headers, params=params ) return json.loads(res.text)
{
"data": {
"daily_statistics": {
"2026-05-30": {
"emails_sent": 2,
"replies": 0,
"bounces": 0,
"spam_emails": 0,
"inbox_emails": 2,
"categories_emails": 0,
"scheduled": 0
},
"2026-05-31": {
"emails_sent": 2,
"replies": 0,
"bounces": 0,
"spam_emails": 0,
"inbox_emails": 2,
"categories_emails": 0,
"scheduled": 0
}
},
"provider_statistics": {
"google": {
"id": 1,
"count": 6,
"spam": 2,
"percent": 75,
"categories": 0
},
"outlook": {
"id": 2,
"count": 2,
"spam": 0,
"percent": 100
},
"hostinger": {
"id": 4,
"count": 2,
"spam": 0,
"percent": 100
},
"other": {
"id": 9,
"count": 4,
"spam": 0,
"percent": 100
}
},
"deliverability": {
"inbox": {
"count": 14,
"percent": 88
},
"spam": {
"count": 2,
"percent": 13
},
"categories": {
"count": 0,
"percent": 0
}
},
"is_calculated": false
},
"success": true
}
success | Boolean. true when the request succeeded. |
data.daily_statistics | Object keyed by date (YYYY-MM-DD). Each value contains the daily stats fields below. |
data.daily_statistics.{date}.emails_sent | Number of warm-up emails sent that day. |
data.daily_statistics.{date}.replies | Number of replies received that day. |
data.daily_statistics.{date}.bounces | Number of bounced emails that day. |
data.daily_statistics.{date}.spam_emails | Number of emails that landed in spam that day. |
data.daily_statistics.{date}.inbox_emails | Number of emails that landed in inbox that day. |
data.daily_statistics.{date}.categories_emails | Number of emails that landed in Gmail categories tabs that day. |
data.daily_statistics.{date}.scheduled | Number of emails scheduled for sending that day. |
data.provider_statistics | Object keyed by provider name (google, outlook, hostinger, etc.). Each value contains the per-provider stats fields below. |
data.provider_statistics.{provider}.id | Internal provider ID. |
data.provider_statistics.{provider}.count | Number of emails sent via this provider. |
data.provider_statistics.{provider}.spam | Number of emails that landed in spam at this provider. |
data.provider_statistics.{provider}.percent | Inbox delivery rate (%) for this provider. |
data.provider_statistics.{provider}.categories | Number of emails that landed in Gmail categories tabs. May be omitted for providers without category support. |
data.deliverability.inbox.count | Total number of emails delivered to inbox. |
data.deliverability.inbox.percent | Inbox delivery rate (%). |
data.deliverability.spam.count | Total number of emails delivered to spam. |
data.deliverability.spam.percent | Spam rate (%). |
data.deliverability.categories.count | Total number of emails delivered to Gmail categories tabs. |
data.deliverability.categories.percent | Categories rate (%). |
data.is_calculated | Boolean. false when statistics are still being processed; true when the calculation is complete. |
GETGet campaign analytics
FreeThis method shows campaign statistics based on the applied filters.
| GET | https://api.snov.io/v2/statistics/campaign-analytics |
campaign_id | Campaign ID. You can find it in the URL when you view the campaign info (example).
If you leave this field empty, you’ll get data for all active campaigns within the specified time period. To get data for multiple campaigns, separate IDs with commas. |
sender_email | Email sender account ID. You can find it in the URL when viewing or editing the email account info (example).
To see analytics for multiple email accounts, separate IDs with commas. Alternatively, leave this parameter empty if you don’t want to apply an email account filter. |
sender_linkedin | LinkedIn sender account ID. You can find it in the URL when viewing or editing the LinkedIn account info. To see analytics for multiple accounts, separate IDs with commas. Leave this parameter empty if you don’t want to apply a LinkedIn account filter. |
campaign_owner | To view campaign data for a specific team member, enter their email address. To filter by multiple campaign owners, list the email addresses separated by commas (no spaces). Example: example1@gmail.com,example2@gmail.com Please note that to use this filter, your account must have the ‘View team records’ permission enabled, and you need to be on a Pro plan or higher. |
date_from *Required | The start date of the period for which you want to receive statistics. Format: yyyy-mm-dd. |
date_to *Required | The end date of the period for which you want to receive statistics. Format: yyyy-mm-dd. |
<?php
function getCampaignAnalytics()
{
$token = getAccessToken();
$campaignIds = [1, 2];
$senderEmailIds = [21, 22];
$senderLinkedInIds = [31, 32, 33];
$ownerEmails = ['owner1@email.loc', 'owner2@email.loc'];
$params = [
'access_token' => $token,
'campaign_id' => implode(',', $campaignIds),
'sender_email' => implode(',', $senderEmailIds),
'sender_linkedin' => implode(',', $senderLinkedInIds),
'campaign_owner' => implode(',', $ownerEmails),
'date_from' => '2024-06-15',
'date_to' => '2024-09-15',
];
$params = http_build_query($params);
$options = [
CURLOPT_URL => 'https://api.snov.io/v2/statistics/campaign-analytics?' . $params,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true
];
$ch = curl_init();
curl_setopt_array($ch, $options);
$res = json_decode(curl_exec($ch), true);
curl_close($ch);
return $res;
}
?>
def get_campaign_analytics():
token = get_access_token()
campaign_ids = [1, 2]
sender_email_ids = [21, 22]
sender_linkedin_ids = [31, 32, 33]
owner_emails = ['owner1@email.loc', 'owner2@email.loc']
params = {
'access_token': token,
'campaign_id': ','.join(map(str, campaign_ids)),
'sender_email': ','.join(map(str, sender_email_ids)),
'sender_linkedin': ','.join(map(str, sender_linkedin_ids)),
'campaign_owner': ','.join(owner_emails),
'date_from': '2024-06-15',
'date_to': '2024-09-15',
}
res = requests.get('https://api.snov.io/v2/statistics/campaign-analytics', params=params)
return json.loads(res.text)
{
"total_contacted": 32,
"emails_sent": 31,
"first_emails": 24,
"first_emails_rate": "77%",
"follow_ups": 7,
"follow_ups_rate": "23%",
"delivered": 30,
"delivered_rate": "97%",
"bounced": 1,
"bounced_rate": "3%",
"contacted_by_email": 23,
"email_opens": 16,
"email_opens_rate": "70%",
"link_clicks": 0,
"link_clicks_rate": "0%",
"email_replies": 16,
"email_replies_rate": "70%",
"unsubscribed": 0,
"unsubscribed_rate": "0%",
"auto_replied": 0,
"auto_replied_rate": "0%",
"contacted_by_linkedin": 10,
"linkedin_total_replies": 9,
"linkedin_total_replies_rate": "90%",
"connection_request_replies": 2,
"connection_request_replies_rate": "22%",
"message_replies": 7,
"message_replies_rate": "78%",
"in_mail_replies": 0,
"in_mail_replies_rate": "0%",
"connection_requests": 2,
"accepted_requests": 2,
"accepted_requests_rate": "100%",
"failed_connection_requests": 0,
"messages_sent": 9,
"linkedin_views": 9,
"linkedin_likes": 0,
"linkedin_follows": 0,
"in_mail_sent": 0,
"interested": 8,
"interested_rate": "32%",
"maybe": 8,
"maybe_rate": "32%",
"not_interested": 4,
"not_interested_rate": "16%"
}
total_contacted | Total number of recipients that were contacted by email or LinkedIn (connection request, message or InMail). |
emails_sent | Total number of emails sent via campaigns. Note that this does not include emails sent outside of campaigns. |
first_emails | Number of first emails in a campaign sequence that were sent within the indicated time period. |
first_emails_rate | Percentage of first emails out of the total emails sent. |
follow_ups | Number of follow-up emails in a campaign sequence that were sent within the indicated time period. |
follow_ups_rate | Percentage of follow-up emails out of the total emails sent. |
delivered | Number of sent emails that didn’t bounce. |
delivered_rate | Percentage of emails that didn’t bounce out of total emails sent. |
bounced | Number of emails that bounced. |
bounced_rate | Percentage of emails that bounced out of total emails sent. |
contacted_by_email | Number of recipients that received at least one email that didn’t bounce. |
email_opens | Number of recipients who opened your email at least once. |
email_opens_rate | Percentage of recipients who opened your email at least once out of all recipients contacted. |
link_clicks | Number of recipients who clicked on at least one link in your campaigns. |
link_clicks_rate | Percentage of recipients who clicked on at least one link in campaigns out of all recipients contacted. |
email_replies | Number of recipients who replied at least once. |
email_replies_rate | Percentage of recipients who replied at least once out of all recipients contacted. |
unsubscribed | Number of recipients who clicked the Unsubscribe link in your campaigns, opting out of receiving further emails. |
unsubscribed_rate | Percentage of recipients who clicked the Unsubscribe link in your campaigns out of all recipients contacted. |
auto_replied | Number of recipients who auto-replied to your campaign emails. |
auto_replied_rate | Percentage of recipients who auto-replied out of all recipients contacted. |
contacted_by_linkedin | Number of recipients to whom you sent at least one message or connection request on LinkedIn. |
linkedin_total_replies | Number of recipients who replied at least once to any of the messages sent on LinkedIn (LinkedIn messages, connection request messages and InMail). |
linkedin_total_replies_rate | Percentage of recipients who replied at least once to any of the messages sent on LinkedIn (LinkedIn messages, connection request messages and InMail). |
connection_request_replies | Number of recipients who replied to a connection request message. |
connection_request_replies_rate | Percentage of recipients who replied to a connection request message out of all recipients contacted. |
message_replies | Number of recipients who replied to a regular LinkedIn message. |
message_replies_rate | Percentage of recipients who replied to a regular LinkedIn message out of all recipients contacted. |
in_mail_replies | Number of recipients who replied to a LinkedIn InMail message. |
in_mail_replies_rate | Percentage of recipients who replied to a LinkedIn InMail message. |
connection_requests | Number of connection requests sent to prospects via Snov.io campaigns. |
accepted_requests | Number of connection requests that were accepted by LinkedIn members. |
accepted_requests_rate | Percentage of connection requests that were accepted out of all requests sent. |
failed_connection_requests | Number of LinkedIn connection requests that were not sent because:
|
messages_sent | Number of LinkedIn messages sent. |
linkedin_views | Number of prospect profiles viewed. |
linkedin_likes | Number of prospect posts liked on LinkedIn. |
linkedin_follows | Number of prospect profiles followed. |
in_mail_sent | Total number of inMail messages sent. |
interested | Number of recipients who showed interest in their replies. |
interested_rate | Percentage of recipients who showed interest in their replies. |
maybe | Number of recipients who didn't express direct interest or disinterest in their replies. |
maybe_rate | Percentage of recipients who didn't express direct interest or disinterest in their replies. |
not_interested | Number of recipients who showed no interest in their replies. |
not_interested_rate | Percentage of recipients who showed no interest in their replies. |
GETView campaign progress
FreeThis method returns the campaign progress and status.
| GET | https://api.snov.io/v2/campaigns/[campaign_id]/progress |
campaign_id *Required | Campaign ID. You can find it in the URL when you view the campaign info (example). |
<?php
function getCampaignProgress()
{
$token = getAccessToken();
$campaignId = 1;
$params = [
'access_token' => $token,
];
$params = http_build_query($params);
$options = [
CURLOPT_URL => "https://api.snov.io/v2/campaigns/$campaignId/progress?" . $params,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true
];
$ch = curl_init();
curl_setopt_array($ch, $options);
$res = json_decode(curl_exec($ch), true);
curl_close($ch);
return $res;
}
?>
def get_campaign_progress():
token = get_access_token()
campaign_id = 1
params = {
'access_token': token,
}
res = requests.get(f"https://api.snov.io/v2/campaigns/{campaign_id}/progress", params=params)
return json.loads(res.text)
{
"status":"Active",
"unfinished":1,
"progress":"90%"
}
progress | Percentage of recipients who:
|
unfinished | Number of recipients in the campaign who didn’t reach the end of the sequence or for whom the sequence wasn’t stopped. |
status | Campaign status. Learn more |
GETGet campaign recipients activity report
FreeThis method returns a detailed activity report for all recipients of a campaign — sent, opened, clicked, replied, bounced, unsubscribed events — together with prospect details. It mirrors the recipients activity report available in the campaign UI and is suitable for syncing campaign activity into external dashboards or CRMs.
| GET | https://api.snov.io/v2/campaigns/[campaignId]/recipients-activity |
campaignId *Required | Unique identifier of the campaign. |
dateFrom *Required | Start of the date range in Y-m-d format (UTC). |
dateTo *Required | End of the date range in Y-m-d format (UTC). The maximum range between dateFrom and dateTo is 31 days. |
offset | Pagination offset (default: 0). |
limit | Number of records per page (default: 100, maximum: 1000). |
<?php
function getCampaignRecipientsActivity($campaignId, $dateFrom, $dateTo, $offset = 0, $limit = 100)
{
$token = getAccessToken();
$params = http_build_query([
'access_token' => $token,
'dateFrom' => $dateFrom,
'dateTo' => $dateTo,
'offset' => $offset,
'limit' => $limit,
]);
$options = [
CURLOPT_URL => "https://api.snov.io/v2/campaigns/{$campaignId}/recipients-activity?{$params}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
];
$ch = curl_init();
curl_setopt_array($ch, $options);
$res = json_decode(curl_exec($ch), true);
curl_close($ch);
return $res;
}
?>
def get_campaign_recipients_activity(campaign_id, date_from, date_to, offset=0, limit=100):
token = get_access_token()
params = {
'access_token': token,
'dateFrom': date_from,
'dateTo': date_to,
'offset': offset,
'limit': limit,
}
res = requests.get(
f'https://api.snov.io/v2/campaigns/{campaign_id}/recipients-activity',
params=params,
)
return json.loads(res.text)
{
"data": [
{
"event_time": "2025-12-15 10:58:52",
"event_type": "sent",
"sender_email": "sender@snov.io",
"email_subject": "About our plans",
"recipient_email": "recipient@snov.io",
"recipient_name": "Den Johnson",
"phone": "380631234567",
"industry": "Information Technology & Services",
"country": "Ukraine",
"location": "Kyiv",
"company": "Snov.io",
"job_position": "Quality assurance engineer",
"hq_phone": "380631234567",
"website": "snov.io"
},
{
"event_time": "2025-12-15 10:58:58",
"event_type": "open",
"sender_email": "sender@snov.io",
"email_subject": "About our plans",
"recipient_email": "recipient@snov.io",
"recipient_name": "Den Johnson",
"phone": "380631122333",
"industry": "Information Technology & Services",
"country": "Ukraine",
"location": "Kyiv",
"company": "Snov.io",
"job_position": "Quality assurance engineer",
"hq_phone": "380631234567",
"website": "snov.io"
}
],
"pagination": {
"total": 2,
"offset": 0,
"limit": 100,
"has_more": false
}
}
event_time | Time of the event in ISO 8601 (UTC). |
event_type | Type of event: sent, open, click, reply, bounce, unsubscribe. |
sender_email | Email address of the sender (campaign mailbox). |
email_subject | Subject line of the email in the campaign sequence. |
recipient_email | Email address of the recipient. |
recipient_name | Full name of the recipient. |
phone | Recipient's phone number (from prospect profile). |
country | Recipient's country. |
location | Recipient's location (city, region). |
industry | Industry of the recipient's company. |
company | Recipient's company name. |
job_position | Recipient's job title. |
website | Recipient's company website. |
hq_phone | Phone number of the recipient's company headquarters. |
total | Total number of records matching the request. |
offset | Current pagination offset. |
limit | Page size used for the response. |
has_more | true if there are more records past the current page. |
GETCheck recipient status
FreeThis method checks whether the specified emails are present as recipients in a particular campaign and returns their current status. It is intended for deduplication before adding new recipients to a campaign — e.g. to avoid contacting prospects who are already enrolled, finished or unsubscribed.
| GET | https://api.snov.io/v2/campaigns/[campaign_id]/recipient |
campaign_id *Required | Unique identifier of the campaign. |
emails[] *Required | Array of email addresses to check. Minimum 1, maximum 100 per request. Each email must be unique and no longer than 100 characters. |
<?php
function checkRecipientStatus($campaignId, array $emails)
{
$token = getAccessToken();
$query = http_build_query([
'access_token' => $token,
'emails' => $emails,
]);
$options = [
CURLOPT_URL => "https://api.snov.io/v2/campaigns/{$campaignId}/recipient?{$query}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
];
$ch = curl_init();
curl_setopt_array($ch, $options);
$res = json_decode(curl_exec($ch), true);
curl_close($ch);
return $res;
}
?>
def check_recipient_status(campaign_id, emails):
token = get_access_token()
params = [('access_token', token)] + [('emails[]', email) for email in emails]
res = requests.get(
f'https://api.snov.io/v2/campaigns/{campaign_id}/recipient',
params=params,
)
return json.loads(res.text)
{
"data": [
{
"email": "admin@snov.io",
"exist": true,
"status": "tocheck"
},
{
"email": "jn@snov.io",
"exist": false,
"status": null
},
{
"email": "dennis@snov.io",
"exist": true,
"status": "unsubscribe"
}
]
}
email | Email address from the request (echoed back). |
exist | true if the email is present as a recipient in the campaign, false otherwise. |
status | Current status of the recipient in the campaign (e.g. tocheck, active, finished, unsubscribe, moved). null when exist is false. |
POSTChange recipient’s status
FreeChange the status of a recipient in a specific campaign.
| POST | https://api.snov.io/v1/change-recipient-status |
email *Required | The prospect’s email address. |
campaign_id *Required | The campaign’s id. You can find it in the URL when you view the campaign info (show an example). |
status *Required | Can contain Active, Paused or Unsubscribed. You can not change the recipients' status if their status is Finished or Moved. |
<?php function changeRecipientStatus() { $token = getAccessToken(); $params = [ 'access_token' => $token, 'email' => 'gavin.vanrooyen@octagon.com', 'campaign_id' => '179025', 'status' => 'Paused' ]; $options = [ CURLOPT_URL => 'https://api.snov.io/v1/change-recipient-status', CURLOPT_POST => true, CURLOPT_POSTFIELDS => $params, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def change_recipient_status(): token = get_access_token() params = {'access_token':token, 'email':'gavin.vanrooyen@octagon.com', 'campaign_id': '179025', 'status':'Paused' } res = requests.post('https://api.snov.io/v1/change-recipient-status', data=params) return json.loads(res.text)
{
"success": true
}Method returns success: true if the prospect’s status has been successfully changed. If any error occurs, the method will return success: false with an error description.
GETSee list of completed prospects
FreeThis method returns prospects for whom the campaign has been completed.
| GET | https://api.snov.io/v1/prospect-finished |
campaignId *Required | Сampaign's unique identifier to retrieve the prospects list. |
<?php function finishedProspects() { $token = getAccessToken(); $params = [ 'access_token' => $token, 'campaignId' => 1234567 ]; $params = http_build_query($params); $options = [ CURLOPT_URL => 'https://api.snov.io/v1/prospect-finished?'.$params, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def user_lists(): token = get_access_token() params = {'access_token':token, 'campaignId':1234567 } res = requests.get('https://api.snov.io/v1/prospect-finished', data=params) return json.loads(res.text)
[
{
"id": "88c268d404797d1001b4d72806207625",
"prospectId": "9c2eb5b46bb5873e408684dd577d002354e4f7026f47bf8a592d659bba3d2dd0ff186b90dc7a5",
"userName": "zach Jones",
"userEmail": "zach@entselect.us",
"campaign": "Zipari - Salesforce Developer",
"hash": "f3967971cbab6e769b5f7e3457d00159"
}
]
id | Request's unique identifier. |
prospectId | Prospect's unique identifier. |
userName | Prospect's full name. |
userEmail | Prospect's email address. |
campaign | Campaign name. |
GETSee all campaign replies
FreeThis method shows a list of all replies received within a campaign — both email replies and LinkedIn replies (connection request replies, LinkedIn message replies, and InMail replies). Each record represents a unique pair of (prospect, reply type); replies within a record are sorted chronologically so the thread reads top to bottom.
| GET | https://api.snov.io/v2/campaigns/[campaign_id]/all-replies |
campaign_id *Required | Unique identifier of the campaign. |
offset | Pagination offset (default: 0). |
<?php
function campaignAllReplies($campaignId, $offset = 0)
{
$token = getAccessToken();
$params = http_build_query([
'access_token' => $token,
'offset' => $offset,
]);
$options = [
CURLOPT_URL => "https://api.snov.io/v2/campaigns/{$campaignId}/all-replies?{$params}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
];
$ch = curl_init();
curl_setopt_array($ch, $options);
$res = json_decode(curl_exec($ch), true);
curl_close($ch);
return $res;
}
?>
def get_campaign_all_replies(campaign_id, offset=0):
token = get_access_token()
params = {
'access_token': token,
'offset': offset,
}
res = requests.get(
f'https://api.snov.io/v2/campaigns/{campaign_id}/all-replies',
params=params,
)
return json.loads(res.text)
{
"data": [
{
"campaignId": 38573,
"campaign": "All replies campaign",
"prospectId": "aed674fa6404b38954b4ed68f4fd4901b15c9ca9b9393522a052a420aa2690df99614e277d",
"prospectName": "Snov.io",
"prospectEmail": "office@snov.io",
"linkedInProfile": "https://www.linkedin.com/in/snovio",
"replyType": "email",
"receivedAt": "2026-04-29 10:09:42",
"replies": [
{
"subject": "Re: All replies campaign",
"message": "This is reply to email",
"receivedAt": "2026-04-29 10:09:42"
}
]
},
{
"campaignId": 38573,
"campaign": "All replies campaign",
"prospectId": "504d37faada2989dda5f7621393ed9b07e4dccaba44b7332e48fd425c75a77e3d653d24b60",
"prospectName": "Snov.io",
"prospectEmail": "office@snov.io",
"linkedInProfile": "https://www.linkedin.com/in/snovio",
"replyType": "linkedinMessage",
"receivedAt": "2026-04-29 09:26:07",
"replies": [
{
"subject": "",
"message": "Hello! This is reply to Li message",
"receivedAt": "2026-04-29 09:26:07"
}
]
}
]
}
campaignId | Unique identifier of the campaign. |
campaign | Campaign name. |
prospectId | Unique identifier of the prospect. |
prospectName | Full name of the prospect. |
prospectEmail | Email address of the prospect. |
linkedInProfile | LinkedIn profile URL of the prospect (if available). |
replyType | Type of reply: email, linkedinMessage, linkedinInvite, linkedinInMail. |
receivedAt | Date and time of the earliest reply in this (prospect, reply type) pair. |
replies[].subject | Subject of the reply (empty string for LinkedIn replies without a subject). |
replies[].message | Body of the reply. |
replies[].receivedAt | Date and time when the specific reply was received. |
GETSee campaign email replies
FreeThis method returns the email replies received within a campaign, including the prospect’s name, ID, campaign, etc. To get LinkedIn replies (connection request, direct message, InMail) in addition to email replies, use the See all campaign replies method.
| GET | https://api.snov.io/v1/get-emails-replies |
campaignId *Required | Unique identifier of the campaign you want to view replies from. |
offset | You can collect up to 10,000 replies per each request. If your campaign has more replies, use offset to indicate how many previous replies you want to skip. For example, if your campaign has 20,000 replies and you want to request replies 10,001- 20,000, set the offset as 10,000. If the offset is not specified, you'll get the last 10,000 replies received. |
<?php function campaignReplies() { $token = getAccessToken(); $params = [ 'access_token' => $token, 'campaignId' => 1234567 ]; $params = http_build_query($params); $options = [ CURLOPT_URL => 'https://api.snov.io/v1/get-emails-replies?'.$params, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def user_lists(): token = get_access_token() params = {'access_token':token, 'campaignId':1234567 } res = requests.get('https://api.snov.io/v1/get-emails-replies', data=params) return json.loads(res.text)
[
{
"visitedAt": {
"date": "2020-07-14 13:10:46.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"campaignId": 1234567,
"campaign": "My top campaign",
"prospectId": "7a941739b09f1187532d52a684df545f3a223e432c7f53662264db8d33db80ee5fc19e573416a",
"prospectFirstName": "John",
"prospectLastName": "Doe",
"prospectName": "John Doe",
"sourcePage": null,
"source": "copy",
"locality": null,
"industry": "Airlines/Aviation",
"country": null,
"prospectEmail": "Johndoe@snov.io",
"hash": "6745f8162ecadbe325693345d1a53976",
"emailSubject": "\"Special content for you\"",
"emailBody": "\"<\p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.<\/p>\"",
"skills": "",
"links": null,
"customFields": null,
"id": "f676edc5de58f341dc7bf4e75c0c8580",
"customField_Phone": "",
"customField_Birthday": ""
}
]
campaignId | Campaign's unique identifier. |
campaign | Campaign name. |
prospectName | Prospect's full name. |
emailSubject | Subject line of the email that received a reply. |
emailBody | Contents of the email that received a reply. |
GETGet info about campaign opens
FreeThis method shows the information about the opened emails in the campaign.
| GET | https://api.snov.io/v1/get-emails-opened |
campaignId *Required | Unique identifier of the campaign for which you want to view information about email opens. |
offset | You can collect up to 10,000 opens per each request. If your campaign has more emails opened, use offset to indicate how many previous opens you want to skip. For example, if your campaign has 20,000 opens and you want to request opens 10,001- 20,000, set the offset as 10,000. If the offset is not specified, you'll get the last 10,000 opened emails. |
<?php function emailsOpen() { $token = getAccessToken(); $params = [ 'access_token' => $token, 'campaignId' => 1234567 ]; $params = http_build_query($params); $options = [ CURLOPT_URL => 'https://api.snov.io/v1/get-emails-opened?'.$params, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def user_lists(): token = get_access_token() params = {'access_token':token, 'campaignId':1234567 } res = requests.get('https://api.snov.io/v1/get-emails-opened', data=params) return json.loads(res.text)
[
{
"visitedAt": {
"date": "2020-01-08 21:48:14.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"campaignId": 1234567
"campaign": "My top campaign",
"prospectId": "a9e58c3eecff94e617815a90ca412c4c305045102be1312b41fd0073c9c9f3eee30e090bbc3e3",
"prospectFirstName": "John",
"prospectLastName": "Doe",
"prospectName": "John Doe",
"sourcePage": null,
"source": "copy",
"locality": null,
"industry": null,
"country": null,
"prospectEmail": "Johndoe@snov.io",
"hash": "20b1aeb0e2949fdf7e58363f84b7aff1",
"emailSubject": "\"Special content for you\"",
"emailBody": "\"<\p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.<\/p>\"",
"skills": "",
"links": null,
"customFields": null,
"id": "c2a67a47d59745f548ea7b0213c3a81d",
"customField_Phone": ""
}
]
campaignId | Campaign's unique identifier. |
campaign | Campaign name. |
prospectName | Full name of the prospect that opened an email. |
emailSubject | Subject line of the email that was opened. |
visitedAt | Exact time the prospect opened the email. |
GETCheck link clicks
FreeThis method returns information on all campaign recipients that have clicked a link in one of campaign emails.
| GET | https://api.snov.io/v1/get-emails-clicked |
campaignId *Required | Unique identifier of the campaign you want to view link clicks for. |
offset | You can collect up to 10,000 clicks per each request. If your campaign has more clicks, use offset to indicate how many previous clicks you want to skip. For example, if your campaign has 20,000 clicks and you want to request clicks 10,001- 20,000, set the offset as 10,000. If the offset is not specified, you'll get the last 10,000 emails that clicked a link within the campaign. |
<?php function emailsClicked() { $token = getAccessToken(); $params = [ 'access_token' => $token, 'campaignId' => 1234567 ]; $params = http_build_query($params); $options = [ CURLOPT_URL => 'https://api.snov.io/v1/get-emails-clicked?'.$params, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def user_lists(): token = get_access_token() params = {'access_token':token, 'campaignId':1234567 } res = requests.get('https://api.snov.io/v1/get-emails-clicked', data=params) return json.loads(res.text)
[
{
"visitedAt": {
"date": "2020-01-08 21:48:14.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"campaignId": 1234567
"campaign": "My top campaign",
"prospectId": "a9e58c3eecff94e617815a90ca412c4c305045102be1312b41fd0073c9c9f3eee30e090bbc3e3",
"prospectFirstName": "John",
"prospectLastName": "Doe",
"prospectName": "John Doe",
"sourcePage": null,
"source": "copy",
"locality": null,
"industry": null,
"country": null,
"prospectEmail": "Johndoe@snov.io",
"hash": "20b1aeb0e2949fdf7e58363f84b7aff1",
"emailSubject": "\"Special content for you\"",
"emailBody": "\"<\p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.<\/p>\"",
"skills": "",
"links": null,
"customFields": null,
"id": "c2a67a47d59745f548ea7b0213c3a81d",
"customField_Phone": ""
}
]
campaignId | Campaign's unique identifier. |
campaign | Campaign name. |
prospectName | Full name of the prospect that clicked a link from an email in the campaign. |
prospectEmail | Prospect's email address. |
emailSubject | Subject line of the email that contained a clicked link. |
emailBody | Contents of the email. |
visitedAt | Exact time the prospect clicked a link in the email. |
GETView sent emails
FreeThis method shows the information about sent emails in the campaign.
| GET | https://api.snov.io/v1/emails-sent |
campaignId *Required | Unique identifier of the campaign for which you want to see sent emails. |
offset | You can collect up to 10,000 sent emails per each request. If your campaign sent more emails, use offset to indicate how many previous emails you want to skip. For example, if your campaign has 20,000 sent emails and you want to request emails 10,001- 20,000, set the offset as 10,000. If the offset is not specified, you'll get the last 10,000 emails that were sent within the campaign. |
<?php function emailsSended() { $token = getAccessToken(); $params = [ 'access_token' => $token, 'campaignId' => 1234567 ]; $params = http_build_query($params); $options = [ CURLOPT_URL => 'https://api.snov.io/v1/emails-sent?'.$params, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def user_lists(): token = get_access_token() params = {'access_token':token, 'campaignId':1234567 } res = requests.get('https://api.snov.io/v1/emails-sent', data=params) return json.loads(res.text)
[
{
"sentDate": {
"date": "2020-07-06 06:58:10.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"userName": "John Doe",
"userEmail": "johndoe@snov.io",
"campaign": "Test",
"hash": "be8fd412b793c15ccab9f1a6573d6595",
"id": "010f091d81860753a19867ba1dd805d1"
},
{
"sentDate": {
"date": "2020-07-06 06:56:44.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"userName": "Mister Smith",
"userEmail": "mistersmith@snov.io",
"campaign": "Test",
"hash": "55bb20def471e630c539935cb0efcbf8",
"id": "00e3df8427477a21d64bbe959ff95471"
}
]
sentDate | Exact time that the email was sent. |
userName | Full name of the prospect that the email was sent to. |
userEmail | Prospect's email address. |
campaign | Campaign name. |
GETView all campaigns
FreeThis method shows a list of all user campaigns. If a user is in a team and has permission to view team records, the method will also return all campaigns created within that team.
| GET | https://api.snov.io/v1/get-user-campaigns |
| There’s no input parameters for this method |
<?php function userCampaigns() { $token = getAccessToken(); $params = [ 'access_token' => $token ]; $params = http_build_query($params); $options = [ CURLOPT_URL => 'https://api.snov.io/v1/get-user-campaigns?'.$params, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def user_lists(): token = get_access_token() headers = {'Authorization': token} url = 'https://api.snov.io/v1/get-user-campaigns' response = requests.request('GET', url, headers=headers) return json.loads(res.text)
[
{
"id": 237945,
"campaign": "New Campaign",
"list_id": 8512947,
"status": "Paused",
"created_at": 1639469976,
"updated_at": 1639470026,
"started_at": 1639470021,
"hash": "e272be8f9a6894f5b5894fe2ef77095e"
},
{
"id": 237956,
"campaign": "Test campaign",
"list_id": 7654321,
"status": "Draft",
"created_at": 1638808262,
"updated_at": 1638808262,
"started_at": null,
"hash": "f97fce248b77e9a1ae770b21c7bd783d"
}
]
id | Unique identifier of the user's campaign. |
campaign | Campaign name. |
list_id | Unique identifier of the prospect list used in the campaign. |
status | Campaign status. |
created_at | Campaign creation date and time in the format of Unix Timestamp. |
updated_at | Last campaign update date and time in the format of Unix Timestamp. |
started_at | Campaign launch date and time in the format of Unix Timestamp. |
POSTAdd to Do-not-email List
FreeUsing this method you can add an email or a domain to your Do-not-email List. After this email/domain has been added to the list, you won't be able to send emails to it.
| POST | https://api.snov.io/v1/do-not-email-list |
items | Email or domain you want to add to your Do-not-email List. |
listId *Required | The Do-not-email List identifier that emails and domains belong to. |
<?php function addToBlackList() { $token = getAccessToken(); $params = [ 'access_token' => $token ]; $data = http_build_query([ 'items' => [ 'gavin.vanrooyen@octagon.com', 'octagon.com' ] ]); $options = [ CURLOPT_URL => 'https://api.snov.io/v1/do-not-email-list?'. $data, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $params, CURLOPT_FOLLOWLOCATION => true, ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); } ?>
def do_not_email_list(): token = get_access_token() params = { 'access_token':token, 'items[]':['gavin.vanrooyen@octagon.com','octagon.com'] } res = requests.post('https://api.snov.io/v1/do-not-email-list', data=params) return json.loads(res.text)
[
{
"success": true,
"data": {
"duplicates": []
}
}
]
duplicates | This parameter shows which emails/domains have previously been added to the Do-not-email List. |
GETView all schedules
FreeThis method shows a list of all campaign schedules.
| GET | https://api.snov.io/v2/campaigns/schedules |
| There's no input parameters for this method |
<?php function getCampaignSchedules() { $token = getAccessToken(); $options = [ CURLOPT_URL => 'https://api.snov.io/v2/campaigns/schedules', CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $token, 'Content-Type: application/json', ], ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def get_campaign_schedules(): token = get_access_token() headers = { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' } res = requests.get('https://api.snov.io/v2/campaigns/schedules', headers=headers) return json.loads(res.text)
{
"data": [
{
"id": 1074,
"name": "UA Monday & Saturday",
"timezone": "Europe/Kyiv",
"days": [
{
"day": "sunday",
"enabled": false,
"start_time": "09:00",
"end_time": "18:00"
},
{
"day": "monday",
"enabled": true,
"start_time": "09:00",
"end_time": "17:00"
},
{
"day": "tuesday",
"enabled": false,
"start_time": "09:00",
"end_time": "18:00"
},
{
"day": "wednesday",
"enabled": false,
"start_time": "09:00",
"end_time": "18:00"
},
{
"day": "thursday",
"enabled": false,
"start_time": "09:00",
"end_time": "18:00"
},
{
"day": "friday",
"enabled": false,
"start_time": "09:00",
"end_time": "18:00"
},
{
"day": "saturday",
"enabled": true,
"start_time": "11:00",
"end_time": "16:30"
}
]
}
]
}
id | Unique ID of the schedule. |
name | Name of the schedule. |
timezone | Timezone the schedule follows. |
days | Array of possible sending days and times for the schedule. |
day | Day of the week. |
enabled | Shows true if sending is permitted for the day. Returns false when sending for the day is not allowed. |
start_time | Start time for the schedule on that day. |
end_time | End time for the schedule on that day. |
GETView all Do-not-email lists
FreeThis method returns a list of all do-not-email lists.
| GET | https://api.snov.io/v2/blacklists |
| There's no input parameters for this method |
<?php function getBlacklists() { $token = getAccessToken(); $options = [ CURLOPT_URL => 'https://api.snov.io/v2/blacklists', CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $token, 'Content-Type: application/json', ], ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def get_blacklists(): token = get_access_token() headers = { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' } res = requests.get('https://api.snov.io/v2/blacklists', headers=headers) return json.loads(res.text)
{
"data": [
{
"id": 8,
"name": "Do-not-email List",
"owner": "Rob Patison",
"total": 100
}
]
}
id | Unique ID of the Do-not-email list. |
name | Name of the list. |
owner | Name of the person who created the list. |
total | The total number of records in the list (emails and websites). |
POSTChange campaign state
FreeThis method allows you to manage the campaign state — launch it, pause it, complete it, or archive it.
| POST | https://api.snov.io/v2/campaigns/{campaign_id}/action |
campaign_id *Required (path) | Unique identifier of the campaign whose state you want to change. |
action | The state to which a campaign can be transitioned. Allowed values: start, pause, resume, complete, archived. |
<?php $campaignId = 123; $apiUrl = 'https://api.snov.io/v2/campaigns/' . $campaignId . '/action'; $ch = curl_init($apiUrl); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $accessToken, 'Content-Type: application/json', ], CURLOPT_POSTFIELDS => json_encode(['action' => 'start']), ]); $response = curl_exec($ch); curl_close($ch); $result = json_decode($response, true); print_r($result);
import requests campaign_id = 123 api_url = f'https://api.snov.io/v2/campaigns/{campaign_id}/action' response = requests.post( api_url, headers={'Authorization': f'Bearer {access_token}'}, json={'action': 'start'}, ) print(response.json())
{
"success": true
}
success | Can return true or false depending on the execution result. |
errors | A list of errors that occurred when changing the campaign state. |
POSTAdd prospect to list
FreeAdd prospect to a specific list. This method will be useful for those who want to automate adding prospects to lists with active email drip campaigns. This way after a prospect is automatically added to a chosen list, an email drip campaign will be started for them automatically.
| POST | https://api.snov.io/v1/add-prospect-to-list |
email | The prospect’s email address. |
fullName | The prospect’s full name. |
firstName | The prospect’s first name. |
lastName | The prospect’s last name. |
phones | Array with prospect's phone numbers. |
country | The prospect’s country. The country names are defined here. Please, only use countries from this list. |
locality | The prospect’s locality. |
position | The prospect’s job title. |
companyName | The name of the prospect’s company. |
companySite | The prospect’s company website. Please, use the http://example.com format. |
updateContact | Updates an existing prospect. Accepts true or false.
|
createDuplicates | Creates a duplicate prospect. Accepts true or false.
Only one parameter, updateContact or createDuplicates, can be set to true. |
customFields[specialization] | You can add custom values into previously created custom fields. To do this specify the name of the custom field in the [brackets]. |
socialLinks[linkedIn] *Required if email is null | A link to the prospect’s social media profile. Specify the name of the social network in the [brackets] (LinkedIn, Facebook, or X). |
listId *Required | The identifier of the list the prospect belongs to. |
<?php function addProspectToList() { $token = getAccessToken(); $params = [ 'access_token' => $token, 'email' => 'john.doe@example.com', 'fullName' => 'John Doe', 'firstName' => 'John', 'lastName' => 'Doe', 'phones' => ['+18882073333', '+18882074444'], 'country' => 'United States', 'locality' => 'Woodbridge, New Jersey', 'socialLinks' => [ 'linkedIn' => 'https://www.linkedin.com/in/johndoe/&social', 'twiiter' => 'https://twitter.com/johndoe&social', ], 'customFields[specialization]'=> 'Software Engineering', 'position' => 'Vice President of Sales', 'companyName' => 'GoldenRule', 'companySite' => 'https://goldenrule.com', 'updateContact' => true, 'listId' => '12345', ]; $options = [ CURLOPT_URL => 'https://api.snov.io/v1/add-prospect-to-list', CURLOPT_POST => true, CURLOPT_POSTFIELDS => $params, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def add_prospect_to_list(): token = get_access_token() params = {'access_token':token, 'email':'john.doe@example.com', 'fullName': 'John Doe', 'firstName':'John', 'lastName':'Doe', 'phones':['+18882073333', '+18882074444'], 'country':'United States', 'locality':'Woodbridge, New Jersey', 'socialLinks[linkedIn]':'https://www.linkedin.com/in/johndoe/&social', 'social[twiiter]':'https://twitter.com/johndoe&social', 'customFields[specialization]':'Software Engineering', 'position':'Vice President of Sales', 'companyName':'GoldenRule', 'companySite':'https://goldenrule.com', 'updateContact':1, 'listId':'12345' } res = requests.post('https://api.snov.io/v1/add-prospect-to-list', data=params) return json.loads(res.text)
{ "email": "john.doe@example.com", "listId": 12345678, "createDuplicates": false, "updateContact": true, "fullName": "John Doe", "firstName": "John", "lastName": "Doe", "position": "Vice President of Sales", "companyName": "GoldenRule", "companySite": "https://goldenrule.com", "phones": [ "+18882073333", "+18882074444" ], "country": "United States", "locality": "Woodbridge, New Jersey", "customFields": { "specialization": "Software Engineering" }, "socialLinks": { "linkedIn": "https://www.linkedin.com/in/johndoe/&social", "twitter": "https://twitter.com/johndoe&social" } }
{
"success": true,
"id": "0Y2QzowWL1rHpIptwaRp0Q==",
"added": true,
"updated": false
}success | Is true if the prospect was successfully added to the list. |
id | Added prospect’s identifier. |
added | Is true if the prospect was added to the list. |
updated | Is true if the existing prospect’s data has been updated. |
errors | There’s been an error in adding the prospect to the list. |
POSTFind prospect by ID
FreeFind prospects from your lists by id. Knowing the id of a specific prospect you can get full information on the prospect, including the lists and campaigns they’ve been added to.
| POST | https://api.snov.io/v1/get-prospect-by-id |
id *Required | The prospect’s id. You can see it in the response when you add a prospect via Add prospect to list API method or in the URL when you view prospect’s page (see an example). |
<?php function getProspectById() { $token = getAccessToken(); $params = [ 'access_token' => $token, 'id' => 'xusD3-T_K5IktGoaa8Jc8A==' ]; $options = [ CURLOPT_URL => 'https://api.snov.io/v1/get-prospect-by-id', CURLOPT_POST => true, CURLOPT_POSTFIELDS => $params, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def getProspectById(): token = get_access_token() params = {'access_token':token, 'id':'xusD3-T_K5IktGoaa8Jc8A==' } res = requests.post('https://api.snov.io/v1/get-prospect-by-id', data=params) return json.loads(res.text)
{
"success": true,
"data": {
"id": "xusD3-T_K5IktGoaa8Jc8A==",
"name": "Gavin Vanrooyen",
"firstName": "Gavin",
"lastName": "Vanrooyen",
"industry": "Entertainment",
"country": "United States",
"locality": "Greater Atlanta Area",
"social": [
{
"link": "https:\/\/www.linkedin.com\/in\/gavin-vanrooyen-8090738\/",
"type": "linkedIn"
}
],
"lastUpdateDate": {
"date": "2019-09-11 12:37:58.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"currentJob": [
{
"companyName": "Octagon",
"position": "Senior Brand Director",
"socialLink": "https:\/\/www.linkedin.com\/company\/659312",
"site": "http:\/\/octagon.com",
"locality": "United States",
"state": null,
"city": null,
"street": null,
"street2": null,
"postal": null,
"founded": null,
"startDate": "2018-07-31",
"endDate": null,
"size": "1-10",
"industry": "Entertainment",
"companyType": "Public Company",
"country": "United States"
}
],
"previousJob": [
{
"companyName": "UPS",
"position": "Manager, Sponsorships and Events",
"socialLink": "https:\/\/www.linkedin.com\/company\/152322",
"site": "http:\/\/www.ups.com\/",
"locality": "United States",
"state": "GA",
"city": "Atlanta",
"street": "55 Glenlake Parkway, NE",
"street2": null,
"postal": "30328",
"founded": "1907",
"startDate": null,
"endDate": null,
"size": "10001+",
"industry": "Logistics and Supply Chain",
"companyType": "Public Company",
"country": "United States"
}
],
"lists": [
{
"id": 1250344,
"name": "People List"
}
],
"campaigns": []
}
}success | Is true if the prospect was found |
id | Unique profile identifier |
name | Prospect’s full name |
firstName | Prospect’s first name |
lastName | Prospect’s last name |
industry | Industry as indicated in the prospect’s profile |
country | Prospect’s country |
locality | Prospect’s locality |
social | Links to prospect’s social profiles |
currentJobs | Array contains information about the prospect’s current job title |
previousJobs | Array contains information about the prospect’s previous job titles |
lastUpdateDate | Date of last profile update |
lists | Lists that the prospect has been added to |
campaigns | List of campaigns this prospect has been added to as a recipient. Contains short statistics such as status, number of sent messages, opens and replies. |
POSTFind prospect by email
FreeFind prospect from your lists by email address. When you search by email, you receive a list of all prospects tied to this email address. Every element of the list contains full information on the prospect, including the lists and campaigns they’ve been added to.
| POST | https://api.snov.io/v1/get-prospects-by-email |
email *Required | The prospect’s email address. |
<?php function getProspectsByEmail() { $token = getAccessToken(); $params = [ 'access_token' => $token, 'email' => 'gavin.vanrooyen@octagon.com' ]; $options = [ CURLOPT_URL => 'https://api.snov.io/v1/get-prospects-by-email', CURLOPT_POST => true, CURLOPT_POSTFIELDS => $params, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def getProspectsByEmail(): token = get_access_token() params = {'access_token':token, 'email':'gavin.vanrooyen@octagon.com' } res = requests.post('https://api.snov.io/v1/get-prospects-by-email', data=params) return json.loads(res.text)
{
"success": true,
"data": [
{
"id": "xusD3-T_K5IktGoaa8Jc8A==",
"name": "Gavin Vanrooyen",
"firstName": "Gavin",
"lastName": "Vanrooyen",
"industry": "Entertainment",
"country": "United States",
"locality": "Greater Atlanta Area",
"social": [
{
"link": "https:\/\/www.linkedin.com\/in\/gavin-vanrooyen-809073755\/",
"type": "linkedIn"
}
],
"lastUpdateDate": {
"date": "2019-09-11 12:37:58.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"currentJob": [
{
"companyName": "Octagon",
"position": "Senior Brand Director",
"socialLink": "https:\/\/www.linkedin.com\/company\/659333",
"site": "http:\/\/octagon.com",
"locality": "United States",
"state": null,
"city": null,
"street": null,
"street2": null,
"postal": null,
"founded": null,
"startDate": "2018-07-31",
"endDate": null,
"size": "1-10",
"industry": "Entertainment",
"companyType": "Public Company",
"country": "United States"
}
],
"previousJob": [
{
"companyName": "UPS",
"position": "Manager, Sponsorships and Events",
"socialLink": "https:\/\/www.linkedin.com\/company\/1523574",
"site": "http:\/\/www.ups.com\/",
"locality": "United States",
"state": "GA",
"city": "Atlanta",
"street": "55 Glenlake Parkway, NE",
"street2": null,
"postal": "30328",
"founded": "1907",
"startDate": null,
"endDate": null,
"size": "10001+",
"industry": "Logistics and Supply Chain",
"companyType": "Public Company",
"country": "United States"
}
],
"lists": [
{
"id": 1250344,
"name": "People List"
}
],
"campaigns": []
}
]
}success | Is true if the prospect was found |
id | Unique profile identifier |
name | Prospect’s full name |
firstName | Prospect’s first name |
lastName | Prospect’s last name |
industry | Industry as indicated in the prospect’s profile |
country | Prospect’s country |
locality | Prospect’s locality |
social | Links to prospect’s social profiles |
currentJobs | Array contains information about the prospect’s current job title |
previousJobs | Array contains information about the prospect’s previous job titles |
lastUpdateDate | Date of last profile update |
lists | Lists that the prospect has been added to |
campaigns | List of campaigns this prospect has been added to as a recipient. Contains short statistics such as status, number of sent messages, opens and replies. |
GETFind prospect’s custom fields
FreeThis method returns a list of all custom fields created by the user, including the fields’ name, whether the field is optional or required, and the field’s data type.
| GET | https://api.snov.io/v1/prospect-custom-fields |
| There’s no input parameters for this method |
<?php function customFields() { $token = getAccessToken(); $params = [ 'access_token' => $token, ]; $params = http_build_query($params); $options = [ CURLOPT_URL => 'https://api.snov.io/v1/prospect-custom-fields?'.$params, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def custom_fields(): token = get_access_token() params = {'access_token':token } res = requests.get('https://api.snov.io/v1/prospect-custom-fields', data=params) return json.loads(res.text)
[
{
"key": "customFields['company']",
"label": "company",
"required": false,
"type": "string"
},
{
"key": "customFields['Project name']",
"label": "Project name",
"required": false,
"type": "string"
},
{
"key": "customFields['SEO']",
"label": "SEO",
"required": false,
"type": "string"
}
]
key | The field’s key in the customFields array. |
label | The field’s name. |
required | Is true if the custom field is required. |
type | The custom field’s data type (string, number, or date). |
GETSee user lists
FreeThis method returns all lists created by the user. You can use this method to review lists that can be used for an email drip campaign.
| GET | https://api.snov.io/v1/get-user-lists |
| There’s no input parameters for this method |
<?php function getUserLists() { $token = getAccessToken(); $params = [ 'access_token' => $token, ]; $params = http_build_query($params); $options = [ CURLOPT_URL => 'https://api.snov.io/v1/get-user-lists?'.$params, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def user_lists(): token = get_access_token() params = {'access_token':token } res = requests.get('https://api.snov.io/v1/get-user-lists', params=params) return json.loads(res.text)
[
{
"id": 1818597,
"name": "FirstSend",
"contacts": 1,
"isDeleted": false,
"creationDate": {
"date": "2020-04-07 08:25:44.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"deletionDate": null
},
{
"id": 1505383,
"name": "All prospects",
"contacts": 10,
"isDeleted": true,
"creationDate": {
"date": "2019-12-17 15:07:30.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"deletionDate": {
"date": "2020-02-17 14:05:44.000000",
"timezone_type": 3,
"timezone": "UTC"
}
},
{
"id": 1479070,
"name": "EMAIL",
"contacts": 13,
"isDeleted": true,
"creationDate": {
"date": "2019-12-06 10:51:01.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"deletionDate": {
"date": "2020-02-17 14:05:48.000000",
"timezone_type": 3,
"timezone": "UTC"
}
}
]
id | User’s list unique identifier. |
name | List name |
contacts | The number of prospects in the list. |
isDeleted | List’s status. Is true if the list has been deleted. |
creationDate | The date and time of list creation (includes date, time, and time zone info). |
deleteDate | If the list has been deleted, contains the date and time of list deletion (includes date, time, and time zone info). |
POSTView prospects in list
FreeThis method returns all the data on prospects in a specific list, including prospect’s data like email addresses and their status.
| POST | https://api.snov.io/v1/prospect-list |
listId *Required | The list’s unique identifier. |
page | You can choose on which page of the list you would like to begin your search. This field is optional. |
perPage | Set the maximum number of prospects to be included in the response. The maximum value is 5,000. |
<?php function prospectsInList() { $token = getAccessToken(); $params = [ 'access_token' => $token, 'listId' => '1234567', 'page' => '1', 'perPage' => '2' ]; $options = [ CURLOPT_URL => ' https://api.snov.io/v1/prospect-list', CURLOPT_POSTFIELDS => $params, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def prospect_in_list(): token = get_access_token() params = {'access_token':token, 'listId':'1234567', 'page':'1', 'perPage':'2' } res = requests.post('https://api.snov.io/v1/prospect-list', params=params) return json.loads(res.text)
Please note, the prospect results are displayed in reverse order from last to first.
{
"success": true,
"list": {
"name": "Lead LIST",
"contacts": 3,
"creationDate": {
"date": "2020-05-19 17:34:39.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"emailsCount": []
},
"prospects": [
{
"id": "226db935fc93422496fda5d5209e8cbf77cc77ec685891706028009b86608f7ce5877a3faf",
"name": "Andrew Garfiled",
"firstName": "Andrew",
"lastName": "Garfiled",
"emails": [
{
"email": "andrewexp@exp.com",
"probability": 99,
"isVerified": null,
"jobStatus": "any",
"domainType": "linkedin_email",
"isValidFormat": null,
"isDisposable": null,
"isWebmail": null,
"isGibberish": null,
"smtpStatus": null
}
]
},
{
"id": "f20d30219b039d1408d837a748a1e2ab843c97e65080f6cf8fa7d948477d9093d87413f05f",
"name": "John Doe",
"firstName": "John",
"lastName": "Doe",
"emails": [
{
"email": "johndoe@gmail.com",
"probability": 99,
"isVerified": null,
"jobStatus": "any",
"domainType": "linkedin_email",
"isValidFormat": true,
"isDisposable": false,
"isWebmail": true,
"isGibberish": false,
"smtpStatus": 3
}
]
}
]
}
list | An array with information about the list and the prospects in it. |
name | The name of the list. |
contacts | The number of prospects in the list. |
creation_date | The date of list creation (includes date, time, and time zone info). |
emailsCount | The number of emails in the list. |
prospects | A list of prospects in the list. |
id | A prospect’s unique identifier. |
name | A prospect’s full name. |
emails | A list of emails belonging to the prospect. |
POSTCreate new prospect list
FreeUse this method to create new prospect lists in your account.
| POST | https://api.snov.io/v1/lists |
name | The name of the new prospect list. |
<?php function createNewList() { $token = getAccessToken(); $params = [ 'access_token' => $token, 'name' => 'New list' ]; $options = [ CURLOPT_URL => 'https://api.snov.io/v1/lists', CURLOPT_POST => true, CURLOPT_POSTFIELDS => $params, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); } ?>
def add_prospect_list(): token = get_access_token() params = { 'access_token':token, 'name':'New list' } res = requests.post('https://api.snov.io/v1/lists', data=params) return json.loads(res.text)
[
{
"success": true,
"data": {
"id": 1234567
}
}
]
id | The ID of the created prospect list. |
GETGet list of pipelines
FreeThis method shows a list of all pipelines from the CRM (Deals) section, including the number and total value of deals in each pipeline.
| GET | https://api.snov.io/v2/pipelines |
| There's no input parameters for this method |
<?php function getUserPipelines() { $token = getAccessToken(); $options = [ CURLOPT_URL => 'https://api.snov.io/v2/pipelines', CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $token, 'Content-Type: application/json', ], ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def get_user_pipelines(): token = get_access_token() headers = { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' } res = requests.get('https://api.snov.io/v2/pipelines', headers=headers) return json.loads(res.text)
{
"data": [
{
"id": 1106350,
"name": "Test pipeline",
"deals_count": 65,
"deals_value": 1241600,
"created_at": "2022-05-27T00:00:00Z"
},
{
"id": 524548,
"name": "Pipeline",
"deals_count": 0,
"deals_value": 0,
"created_at": "2022-01-10T00:00:00Z"
}
]
}
id | Unique identifier of the pipeline. |
name | Name of the pipeline. |
deals_count | Number of deals currently in the pipeline. |
deals_value | Total value of all deals in the pipeline. |
created_at | Pipeline creation date and time in ISO 8601 format. |
GETGet list of pipeline stages
FreeThis method shows a list of all stages within a specific pipeline from the CRM (Deals) section.
| GET | https://api.snov.io/v2/pipelines/{pipeline_id}/stages |
pipeline_id | Unique identifier of the pipeline whose stages you want to retrieve. |
<?php function getPipelineStages($pipelineId) { $token = getAccessToken(); $options = [ CURLOPT_URL => 'https://api.snov.io/v2/pipelines/' . $pipelineId . '/stages', CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $token, 'Content-Type: application/json', ], ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def get_pipeline_stages(pipeline_id): token = get_access_token() headers = { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' } res = requests.get( f'https://api.snov.io/v2/pipelines/{pipeline_id}/stages', headers=headers ) return json.loads(res.text)
{
"data": [
{
"id": 10001,
"pipeline_id": 1106350,
"name": "Lead in",
"order": 1,
"deals_count": 54,
"deals_value": 1011
},
{
"id": 10002,
"pipeline_id": 1106350,
"name": "Contact made",
"order": 2,
"deals_count": 4,
"deals_value": 2108
}
]
}
id | Unique identifier of the stage. |
pipeline_id | ID of the pipeline this stage belongs to. |
name | Name of the stage. |
order | Position of the stage within the pipeline. |
deals_count | Number of deals currently in this stage. |
deals_value | Total value of all deals in this stage. |
GETCheck user balance
FreeUse this method to check your credit balance.
| GET | https://api.snov.io/v1/get-balance |
| There’s no input parameters for this method |
<?php function getBalance() { $token = getAccessToken(); $params = [ 'access_token' => $token, ]; $params = http_build_query($params); $options = [ CURLOPT_URL => 'https://api.snov.io/v1/get-balance?'.$params, CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true ]; $ch = curl_init(); curl_setopt_array($ch, $options); $res = json_decode(curl_exec($ch), true); curl_close($ch); return $res; } ?>
def get_balance(): token = get_access_token() headers = {'authorization':token } res = requests.get('https://api.snov.io/v1/get-balance', headers=headers) return json.loads(res.text)
{
"success": true,
"data": {
"balance": "25000.00",
"teamwork": false,
"unique_recipients_used": 0,
"limit_resets_in": 29,
"expires_in": 359
}
}
balance | User’s current balance in credits. |
teamwork | Is true if you are currently a team member or leader, false if you are not a part of a team. |
recipients_used | Number of unique recipients used this month. |
limit_resets_in | Days till the limit reset. |
expires_in | Days till the end of subscription. |
Webhooks
Webhooks allow you to get notified of events that happened in your Snov.io account.
You can use webhooks to call the endpoint (URL) on your server each time a subscribed event occurs in Snov.io and send real-time data to your application.
Whenever an event occurs, Snov.io sends an HTTP request with a JSON body to the specified URL-endpoint.
You can subscribe to and manage webhooks through a set of API calls.
Currently supported webhook objects and actions are listed below:
| Webhook object | Action | When triggered |
|---|---|---|
campaign_email | sent | When any email is sent to the recipient in any drip campaign |
| first_sent | When the first email is sent to the recipient in any drip campaign | |
| opened | When a recipient opens any email from any drip campaign | |
| bounced | When a campaign email bounces | |
| link_clicked | When a recipient clicked a link in a campaign email | |
campaign_reply | received | When the recipient responds to any email in any of the campaigns |
| first_received | When the recipient responds to the email for the first time in any of the campaigns | |
| autoreply_received | When you receive an auto-reply to a campaign email | |
campaign_li_reply | received | When the recipient sends a subsequent reply over LinkedIn — to a connection request, to a direct message or to an InMail — in any of the campaigns |
| first_received | When the recipient sends their first reply over LinkedIn — to a connection request, to a direct message or to an InMail — in any of the campaigns | |
campaign_li | connection_request_accepted | When the recipient accepts a LinkedIn connection request sent from a campaign |
company | found_domains_by_names | When you request a company's domain based on its name |
prospect | found_by_li_url | When you request a prospect's profile info based on their LinkedIn URL |
| found_emails_by_name_by_domain | When you search for a prospect's email | |
| campaign_finished | When a campaign is completed for a recipient (status: Finished) | |
| campaign_unsubscribed | When a campaign recipient unsubscribed from your emails | |
email_verification | verified | When you request email verification |
Limits: premium plan users can create up to 50 webhooks.
Retry policy: The webhook is successful if we receive an HTTP status from 200-299 range in response within 3 seconds.
If we get any other HTTP status or a timeout occurs, we make seven retry attempts with increasing intervals up to 38 hours after the event which triggered a webhook:
If all retries are unsuccessful, the webhook becomes deactivated.
- 1st: immediately after the event
- 2nd: 20 minutes after the last attempt (20 minutes after the event)
- 3rd: 40 minutes after the last attempt (1 hour after the event)
- 4th: 60 minutes after the last attempt (2 hours after the event)
- 5th: 4 hours after the last attempt (6 hours after the event)
- 6th: 8 hours after the last attempt (14 hours after the event)
- 7th: 24 hours after the last attempt (38 hours after the event)
GETList all webhooks
| GET | https://api.snov.io/v2/webhooks |
Content-Type: application/json |
| This method has no input parameters. |
{
"data": [
{
"data": {
"id": 8,
"end_point": "https://hooks.yourdomain.com/hooks/catch/1237321/awwwcz/",
"event_object": "campaign_email",
"event_action": "sent",
"status": "active",
"created_at": 1655847444
}
},
{
"data": {
"id": 14,
"end_point": "https://hooks.yourdomain.com/hooks/catch/1237321/abqqqpcz/",
"event_object": "campaign_email",
"event_action": "sent",
"status": "deactivated",
"created_at": 1655890563
}
},
{
"data": {
"id": 17,
"end_point": "https://hooks.yourdomain.com/hooks/catch/1237321/abwfpcz/",
"event_object": "campaign_email",
"event_action": "sent",
"status": "active",
"created_at": 1656057947
}
}
],
"meta": {
"webhooks_count": 3,
"user_id": 1313777
}
}
| Parameter | Data type | Data type |
|---|---|---|
data | array | Collection of webhook models |
id | int | Webhook ID |
end_point | string | The actual URL that you provided while adding the webhook and where it will be sent to |
event_object | string | The object the action is performed on |
event_action | string | Action on the object |
created_at | int | Webhook creation date in the Unix Timestamp format |
status | string | Webhook status: active, deactivated |
meta | object | Related data |
webhooks_count | int | Total number of webhooks in your account (max 50) |
user_id | int | Your user ID |
POSTAdd webhook
| POST | https://api.snov.io/v2/webhooks |
Content-Type: application/json |
event_object | the object the action is performed on (list of supported objects) |
event_action | the action performed on the object (list of supported actions) |
endpoint_url | the URL address where the webhook is sent |
{
"event_object": "campaign_email",
"event_action": "sent",
"endpoint_url": "https://hooks.yourdomain.com/hooks/catch/1237321/abwfpcz/"
}
{
"data": {
"id": 17,
"end_point": "https://hooks.yourdomain.com/hooks/catch/1237321/abwfpcz/",
"event_object": "campaign_email",
"event_action": "sent",
"created_at": 1656057947,
"status": "active"
},
"meta": {
"user_id": 1313777
}
}
| Parameter | Data type | Data type |
|---|---|---|
data | object | Webhook data |
id | int | Webhook ID |
end_point | string | The actual URL that you provided while adding the webhook and where it will be sent to |
event_object | string | The object the action is performed on |
event_action | string | Action on the object |
created_at | int | Webhook creation date in the Unix Timestamp format |
status | string | Webhook status: active, deactivated |
meta | object | Related data |
user_id | int | Your user ID |
PUTChange webhook status
Include the unique “id” value of the chosen webhook at the end of the request URL address.
Use List all webhooks method to get id values of your webhooks.
| PUT | https://api.snov.io/v2/webhooks/webhook_id |
Content-Type: application/json |
status | active or deactivated |
{
https://api.snov.io/v2/webhooks/14
"status": "deactivated"
}
{
"data": {
"id": 14,
"end_point": "https://hooks.yourdomain.com/hooks/catch/1237321/abqqqpcz/",
"event_object": "campaign_email",
"event_action": "sent",
"created_at": 1655890563,
"status": "deactivated"
},
"meta": {
"user_id": 1313777
}
}
| Parameter | Data type | Data type |
|---|---|---|
data | object | Webhook data |
id | int | Webhook ID |
end_point | string | The actual URL that you provided while adding the webhook and where it will be sent to |
event_object | string | The object the action is performed on |
event_action | string | Action on the object |
created_at | int | Webhook creation date in the Unix Timestamp format |
status | string | Webhook status: active, deactivated |
meta | object | Related data |
user_id | int | Your user ID |
DELETEDelete a webhook
Include the unique “id” value of the chosen webhook at the end of the request URL address.
Use List all webhooks method to get id values of your webhooks.
| DELETE | https://api.snov.io/v2/webhooks/webhook_id |
Content-Type: application/json |
{
https://api.snov.io/v2/webhooks/8
}
{
"data": {
"success": true
}
}
| Parameter | Data type | Data type |
|---|---|---|
success | boolean | Indicates if the webhook is removed |

