Snov.io Campaigns API
Create and manage multi-channel outreach campaigns
Create and manage multi-channel outreach campaigns
openapi: 3.0.3
info:
title: Snov.io Authentication Campaigns API
description: Snov.io is a sales automation and lead generation platform. The REST API enables programmatic access to email finding, domain search, email verification, drip campaign management, email warm-up, prospect management, CRM pipeline, and webhook subscriptions. Authentication uses OAuth 2.0 client credentials to obtain short-lived Bearer tokens. All API operations consume credits from the account balance.
version: '2.0'
contact:
name: Snov.io Support
url: https://snov.io/knowledgebase/
termsOfService: https://snov.io/terms-of-service/
license:
name: Proprietary
url: https://snov.io/terms-of-service/
servers:
- url: https://api.snov.io
description: Snov.io API server
tags:
- name: Campaigns
description: Create and manage multi-channel outreach campaigns
paths:
/v1/user-campaigns:
get:
tags:
- Campaigns
summary: List campaigns
description: Returns all multi-channel outreach campaigns for the user.
operationId: listCampaigns
security:
- bearerAuth: []
responses:
'200':
description: List of campaigns
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/Campaign'
'401':
$ref: '#/components/responses/Unauthorized'
/v1/create-campaign:
post:
tags:
- Campaigns
summary: Create campaign
description: Create a new multi-channel outreach campaign.
operationId: createCampaign
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CampaignCreate'
responses:
'201':
description: Campaign created
content:
application/json:
schema:
$ref: '#/components/schemas/Campaign'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
/v1/campaign/{id}:
get:
tags:
- Campaigns
summary: Get campaign
description: Retrieve details of a specific campaign by ID.
operationId: getCampaign
security:
- bearerAuth: []
parameters:
- $ref: '#/components/parameters/CampaignId'
responses:
'200':
description: Campaign details
content:
application/json:
schema:
$ref: '#/components/schemas/Campaign'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
put:
tags:
- Campaigns
summary: Update campaign
description: Update an existing campaign's settings.
operationId: updateCampaign
security:
- bearerAuth: []
parameters:
- $ref: '#/components/parameters/CampaignId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CampaignCreate'
responses:
'200':
description: Campaign updated
content:
application/json:
schema:
$ref: '#/components/schemas/Campaign'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
delete:
tags:
- Campaigns
summary: Delete campaign
description: Permanently delete a campaign.
operationId: deleteCampaign
security:
- bearerAuth: []
parameters:
- $ref: '#/components/parameters/CampaignId'
responses:
'204':
description: Campaign deleted
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/v1/campaign/{id}/state:
post:
tags:
- Campaigns
summary: Change campaign state
description: Start, pause, or stop a campaign.
operationId: changeCampaignState
security:
- bearerAuth: []
parameters:
- $ref: '#/components/parameters/CampaignId'
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- state
properties:
state:
type: string
enum:
- start
- pause
- stop
responses:
'200':
description: State changed
content:
application/json:
schema:
$ref: '#/components/schemas/Campaign'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/v1/email-schedules:
get:
tags:
- Campaigns
summary: List email schedules
description: Returns all available email send schedules.
operationId: listEmailSchedules
security:
- bearerAuth: []
responses:
'200':
description: List of email schedules
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
type: object
properties:
id:
type: integer
name:
type: string
'401':
$ref: '#/components/responses/Unauthorized'
/v1/email-step-content:
post:
tags:
- Campaigns
summary: Create email step content
description: Create content for a campaign email step.
operationId: createEmailStepContent
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/EmailStepContent'
responses:
'201':
description: Email step content created
content:
application/json:
schema:
$ref: '#/components/schemas/EmailStepContent'
'401':
$ref: '#/components/responses/Unauthorized'
/v1/email-step-content/{id}:
get:
tags:
- Campaigns
summary: Get email step content
operationId: getEmailStepContent
security:
- bearerAuth: []
parameters:
- $ref: '#/components/parameters/ResourceId'
responses:
'200':
description: Email step content
content:
application/json:
schema:
$ref: '#/components/schemas/EmailStepContent'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
put:
tags:
- Campaigns
summary: Update email step content
operationId: updateEmailStepContent
security:
- bearerAuth: []
parameters:
- $ref: '#/components/parameters/ResourceId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/EmailStepContent'
responses:
'200':
description: Email step content updated
content:
application/json:
schema:
$ref: '#/components/schemas/EmailStepContent'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
delete:
tags:
- Campaigns
summary: Delete email step content
operationId: deleteEmailStepContent
security:
- bearerAuth: []
parameters:
- $ref: '#/components/parameters/ResourceId'
responses:
'204':
description: Email step content deleted
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/v1/recipient-status:
get:
tags:
- Campaigns
summary: Check recipient status
description: Check the campaign status of a specific recipient.
operationId: getRecipientStatus
security:
- bearerAuth: []
parameters:
- name: campaign_id
in: query
required: true
schema:
type: integer
- name: email
in: query
required: true
schema:
type: string
format: email
responses:
'200':
description: Recipient status
content:
application/json:
schema:
type: object
properties:
email:
type: string
status:
type: string
'401':
$ref: '#/components/responses/Unauthorized'
post:
tags:
- Campaigns
summary: Change recipient status
description: Update the campaign status of a recipient.
operationId: changeRecipientStatus
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- campaign_id
- email
- status
properties:
campaign_id:
type: integer
email:
type: string
format: email
status:
type: string
responses:
'200':
description: Status changed
'401':
$ref: '#/components/responses/Unauthorized'
/v1/finished-prospects:
get:
tags:
- Campaigns
summary: List completed prospects
description: Returns prospects who have completed all campaign steps.
operationId: listFinishedProspects
security:
- bearerAuth: []
parameters:
- name: campaign_id
in: query
required: true
schema:
type: integer
responses:
'200':
description: Completed prospects list
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/Prospect'
'401':
$ref: '#/components/responses/Unauthorized'
/v1/do-not-email-list:
post:
tags:
- Campaigns
summary: Add to do-not-email list
description: Add email addresses to a do-not-email suppression list.
operationId: addToDoNotEmailList
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- emails
properties:
emails:
type: array
items:
type: string
format: email
list_id:
type: integer
responses:
'200':
description: Emails added to suppression list
'401':
$ref: '#/components/responses/Unauthorized'
/v1/do-not-email-lists:
get:
tags:
- Campaigns
summary: List do-not-email lists
description: Returns all do-not-email suppression lists for the account.
operationId: listDoNotEmailLists
security:
- bearerAuth: []
responses:
'200':
description: List of suppression lists
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
type: object
properties:
id:
type: integer
name:
type: string
count:
type: integer
'401':
$ref: '#/components/responses/Unauthorized'
/v1/campaign-analytics:
get:
tags:
- Campaigns
summary: Get campaign analytics
description: Returns aggregate analytics data for a campaign.
operationId: getCampaignAnalytics
security:
- bearerAuth: []
parameters:
- name: campaign_id
in: query
required: true
schema:
type: integer
responses:
'200':
description: Campaign analytics
content:
application/json:
schema:
$ref: '#/components/schemas/CampaignAnalytics'
'401':
$ref: '#/components/responses/Unauthorized'
/v1/campaign-progress:
get:
tags:
- Campaigns
summary: Get campaign progress
description: Returns progress statistics for a running campaign.
operationId: getCampaignProgress
security:
- bearerAuth: []
parameters:
- name: campaign_id
in: query
required: true
schema:
type: integer
responses:
'200':
description: Campaign progress
content:
application/json:
schema:
type: object
properties:
total:
type: integer
sent:
type: integer
pending:
type: integer
finished:
type: integer
'401':
$ref: '#/components/responses/Unauthorized'
/v1/campaign-recipients-activity:
get:
tags:
- Campaigns
summary: Get recipients activity report
description: Returns detailed activity report for campaign recipients.
operationId: getCampaignRecipientsActivity
security:
- bearerAuth: []
parameters:
- name: campaign_id
in: query
required: true
schema:
type: integer
responses:
'200':
description: Recipients activity report
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/RecipientActivity'
'401':
$ref: '#/components/responses/Unauthorized'
/v1/emails-sent:
get:
tags:
- Campaigns
summary: Get sent emails
description: Returns list of emails sent in a campaign.
operationId: getSentEmails
security:
- bearerAuth: []
parameters:
- name: campaign_id
in: query
required: true
schema:
type: integer
responses:
'200':
description: Sent emails
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/SentEmail'
'401':
$ref: '#/components/responses/Unauthorized'
/v1/emails-opens:
get:
tags:
- Campaigns
summary: Get campaign opens
description: Returns email open events for a campaign.
operationId: getCampaignOpens
security:
- bearerAuth: []
parameters:
- name: campaign_id
in: query
required: true
schema:
type: integer
responses:
'200':
description: Campaign opens
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/EmailEvent'
'401':
$ref: '#/components/responses/Unauthorized'
/v1/emails-clicks:
get:
tags:
- Campaigns
summary: Get campaign link clicks
description: Returns link click events for a campaign.
operationId: getCampaignClicks
security:
- bearerAuth: []
parameters:
- name: campaign_id
in: query
required: true
schema:
type: integer
responses:
'200':
description: Campaign link clicks
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/EmailEvent'
'401':
$ref: '#/components/responses/Unauthorized'
/v1/campaign-replies:
get:
tags:
- Campaigns
summary: Get all campaign replies
description: Returns all reply events across all email steps in a campaign.
operationId: getCampaignReplies
security:
- bearerAuth: []
parameters:
- name: campaign_id
in: query
required: true
schema:
type: integer
responses:
'200':
description: Campaign replies
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/EmailReply'
'401':
$ref: '#/components/responses/Unauthorized'
/v1/campaign-email-replies:
get:
tags:
- Campaigns
summary: Get campaign email replies
description: Returns reply events scoped to a specific email step.
operationId: getCampaignEmailReplies
security:
- bearerAuth: []
parameters:
- name: campaign_id
in: query
required: true
schema:
type: integer
responses:
'200':
description: Campaign email replies
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/EmailReply'
'401':
$ref: '#/components/responses/Unauthorized'
components:
schemas:
CampaignAnalytics:
type: object
properties:
total_recipients:
type: integer
sent:
type: integer
delivered:
type: integer
opened:
type: integer
clicked:
type: integer
replied:
type: integer
bounced:
type: integer
unsubscribed:
type: integer
open_rate:
type: number
format: float
click_rate:
type: number
format: float
reply_rate:
type: number
format: float
Campaign:
type: object
properties:
id:
type: integer
name:
type: string
status:
type: string
enum:
- draft
- active
- paused
- stopped
- finished
created_at:
type: string
format: date-time
updated_at:
type: string
format: date-time
EmailEvent:
type: object
properties:
email:
type: string
format: email
occurred_at:
type: string
format: date-time
step_number:
type: integer
EmailReply:
type: object
properties:
email:
type: string
format: email
first_name:
type: string
last_name:
type: string
reply_text:
type: string
replied_at:
type: string
format: date-time
Prospect:
type: object
properties:
id:
type: string
email:
type: string
format: email
first_name:
type: string
last_name:
type: string
position:
type: string
company:
type: string
location:
type: string
custom_fields:
type: object
additionalProperties: true
SentEmail:
type: object
properties:
id:
type: integer
recipient_email:
type: string
format: email
subject:
type: string
sent_at:
type: string
format: date-time
EmailStepContent:
type: object
properties:
id:
type: integer
campaign_id:
type: integer
subject:
type: string
body:
type: string
step_number:
type: integer
delay_days:
type: integer
RecipientActivity:
type: object
properties:
email:
type: string
format: email
first_name:
type: string
last_name:
type: string
status:
type: string
opened:
type: boolean
clicked:
type: boolean
replied:
type: boolean
last_activity:
type: string
format: date-time
CampaignCreate:
type: object
required:
- name
properties:
name:
type: string
schedule_id:
type: integer
sender_account_id:
type: string
track_opens:
type: boolean
track_clicks:
type: boolean
Error:
type: object
properties:
error:
type: string
description: Error code
message:
type: string
description: Human-readable error message
responses:
Unauthorized:
description: Unauthorized — missing or invalid Bearer token
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
BadRequest:
description: Bad request — missing or invalid parameters
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
NotFound:
description: Resource not found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
parameters:
ResourceId:
name: id
in: path
required: true
schema:
type: integer
description: Resource ID
CampaignId:
name: id
in: path
required: true
schema:
type: integer
description: Campaign ID
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
description: Obtain a Bearer token via POST /v1/oauth/access_token using client credentials. Tokens expire after 3600 seconds.