Snov.io Campaigns API

Create and manage multi-channel outreach campaigns

Operations 24

Each operation below carries the questions people ask an LLM about it and the instructions they give an agent to run it. Generated by API Evangelist overlay

GET /v1/user-campaigns List my outreach campaigns · List campaigns #
Ask an LLM
“Which outreach campaigns do I have set up in Snov.io?”
“Can I see all of my multi-channel campaigns in one list?”
Tell an agent
List all my outreach campaigns.
Show every multi-channel campaign on my account.
POST /v1/create-campaign Create an outreach campaign · Create campaign #
Ask an LLM
“How do I create a new multi-channel outreach campaign?”
“Can I turn on open and click tracking when I set up a new campaign?”
Tell an agent
Create a new campaign called {name}.
Create campaign {name} sending from account {sender_account_id} on schedule {schedule_id}.
GET /v1/campaign/{id} Get a campaign's details · Get campaign #
Ask an LLM
“What settings does one specific campaign have?”
“Can I look up a single campaign by its ID?”
Tell an agent
Show me the details of campaign {id}.
Pull up the settings for campaign {id}.
PUT /v1/campaign/{id} Update an existing campaign's settings · Update campaign #
Ask an LLM
“Can I rename a campaign I already created?”
“Is it possible to change the sender account or schedule on an existing campaign?”
Tell an agent
Rename campaign {id} to {name}.
Switch existing campaign {id} named {name} to send from account {sender_account_id}.
DELETE /v1/campaign/{id} Delete a campaign · Delete campaign #
Ask an LLM
“How do I permanently remove a campaign?”
“Is deleting a campaign reversible?”
Tell an agent destructive · confirm first
Delete campaign {id}.
Permanently remove campaign {id} from my account.
POST /v1/campaign/{id}/state Start, pause or stop a campaign · Change campaign state #
Ask an LLM
“Can I pause a running campaign and resume it later?”
“How do I launch a campaign so it starts sending?”
Tell an agent
Set campaign {id} to state {state}.
Pause campaign {id} by changing its state to {state}.
GET /v1/email-schedules List email send schedules · List email schedules #
Ask an LLM
“What send schedules are available for my campaign emails?”
“Which sending time windows can I pick for a campaign?”
Tell an agent
List my email send schedules.
Show the schedules I can attach to a campaign.
POST /v1/email-step-content Add an email step to a campaign · Create email step content #
Ask an LLM
“Can I add a follow-up email step to a campaign through the API?”
“How do I set the delay in days before a campaign email step goes out?”
Tell an agent
Add email step {step_number} to campaign {campaign_id} with subject {subject}.
Create a step in campaign {campaign_id} with body {body} sent {delay_days} days after the previous one.
GET /v1/email-step-content/{id} Get a campaign email step's content · Get email step content #
Ask an LLM
“What subject and body does a given campaign email step use?”
“Can I read back the content of one email step?”
Tell an agent
Show the content of email step {id}.
Get subject and body for campaign email step {id}.
PUT /v1/email-step-content/{id} Edit a campaign email step · Update email step content #
Ask an LLM
“Can I change the subject line of an email step that already exists?”
“Is it possible to edit the wording of a follow-up step after creating it?”
Tell an agent
Change the subject of email step {id} to {subject}.
Replace the body of existing email step {id} with {body}.
DELETE /v1/email-step-content/{id} Delete a campaign email step · Delete email step content #
Ask an LLM
“How do I remove an email step from a campaign sequence?”
“Can I delete one step without deleting the whole campaign?”
Tell an agent destructive · confirm first
Delete email step {id}.
Remove the email step content {id} from its campaign.
GET /v1/recipient-status Check a recipient's status in a campaign · Check recipient status #
Ask an LLM
“What status is a particular contact at in my campaign?”
“Can I check whether one email address is still active in a campaign?”
Tell an agent
Check the status of {email} in campaign {campaign_id}.
Tell me where {email} stands in campaign {campaign_id}.
POST /v1/recipient-status Change a recipient's status in a campaign · Change recipient status #
Ask an LLM
“Can I manually mark a contact's status in a campaign, for example to stop emailing them?”
“How do I update a recipient's campaign status by email?”
Tell an agent
Set {email} to status {status} in campaign {campaign_id}.
Change the campaign status of {email} in {campaign_id} to {status}.
GET /v1/finished-prospects List prospects who finished a campaign · List completed prospects #
Ask an LLM
“Which prospects have gone through every step of my campaign?”
“Can I get a list of contacts who completed a sequence?”
Tell an agent
List prospects who finished campaign {campaign_id}.
Show who has completed all steps in campaign {campaign_id}.
POST /v1/do-not-email-list Add emails to a do-not-email list · Add to do-not-email list #
Ask an LLM
“How do I stop certain addresses from ever being emailed by my campaigns?”
“Can I add several addresses to a specific suppression list at once?”
Tell an agent
Add {emails} to my do-not-email list.
Suppress {emails} by adding them to do-not-email list {list_id}.
GET /v1/do-not-email-lists List do-not-email suppression lists · List do-not-email lists #
Ask an LLM
“What suppression lists do I already have on my account?”
“Which do-not-email lists exist that I can add addresses to?”
Tell an agent
List my do-not-email lists.
Show all suppression lists on my account.
GET /v1/campaign-analytics Get aggregate analytics for a campaign · Get campaign analytics #
Ask an LLM
“How is my campaign performing overall?”
“Can I get summary analytics for one campaign?”
Tell an agent
Show aggregate analytics for campaign {campaign_id}.
Give me the overall performance numbers for campaign {campaign_id}.
GET /v1/campaign-progress Get progress of a running campaign · Get campaign progress #
Ask an LLM
“How far along is a campaign that's currently running?”
“What share of a running campaign's recipients have been processed so far?”
Tell an agent
Show progress statistics for campaign {campaign_id}.
Check how far running campaign {campaign_id} has gotten.
GET /v1/campaign-recipients-activity Get a recipient activity report for a campaign · Get recipients activity report #
Ask an LLM
“Can I see what each recipient did in a campaign?”
“Where do I get a detailed per-recipient activity report?”
Tell an agent
Get the recipients activity report for campaign {campaign_id}.
Show per-recipient activity in campaign {campaign_id}.
GET /v1/emails-sent List emails sent in a campaign · Get sent emails #
Ask an LLM
“Which emails has my campaign actually sent?”
“Can I see a list of every message that went out from a campaign?”
Tell an agent
List the emails sent in campaign {campaign_id}.
Show me what campaign {campaign_id} has sent so far.
GET /v1/emails-opens Get email opens for a campaign · Get campaign opens #
Ask an LLM
“Who opened the emails from my campaign?”
“Can I pull the open events for a campaign?”
Tell an agent
Get email open events for campaign {campaign_id}.
Show who opened emails in campaign {campaign_id}.
GET /v1/emails-clicks Get link clicks for a campaign · Get campaign link clicks #
Ask an LLM
“Which recipients clicked links in my campaign emails?”
“Can I see the link click events for one campaign?”
Tell an agent
Get link click events for campaign {campaign_id}.
Show who clicked links in campaign {campaign_id}.
GET /v1/campaign-replies Get all replies across a campaign · Get all campaign replies #
Ask an LLM
“Who replied to my campaign, across every step?”
“Can I get every reply a campaign received regardless of which email step prompted it?”
Tell an agent
Get all replies across every step of campaign {campaign_id}.
Show every reply campaign {campaign_id} has received.
GET /v1/campaign-email-replies Get replies to a specific campaign email step · Get campaign email replies #
Ask an LLM
“Can I see replies to just one email step of a campaign?”
“Which replies came in response to a particular step in my sequence?”
Tell an agent
Get step-level email replies for campaign {campaign_id}.
Show replies scoped to individual email steps in campaign {campaign_id}.

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/snov-io:snov-io-campaigns-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

snov-io-campaigns-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Snov.io 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:
  responses:
    BadRequest:
      description: Bad request — missing or invalid parameters
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: Unauthorized — missing or invalid Bearer token
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: Resource not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  schemas:
    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
    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
    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
    EmailEvent:
      type: object
      properties:
        email:
          type: string
          format: email
        occurred_at:
          type: string
          format: date-time
        step_number:
          type: integer
    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
    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
    SentEmail:
      type: object
      properties:
        id:
          type: integer
        recipient_email:
          type: string
          format: email
        subject:
          type: string
        sent_at:
          type: string
          format: date-time
    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
    Error:
      type: object
      properties:
        error:
          type: string
          description: Error code
        message:
          type: string
          description: Human-readable error message
    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
  parameters:
    CampaignId:
      name: id
      in: path
      required: true
      schema:
        type: integer
      description: Campaign ID
    ResourceId:
      name: id
      in: path
      required: true
      schema:
        type: integer
      description: Resource 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.