Welcome to Slide Cold

Slide Cold is a full-stack Instagram outreach platform that handles the entire pipeline: scraping targeted audiences, warming your accounts to avoid detection, sending personalized DMs at scale, and tracking every conversation.

This documentation covers every feature in detail. Whether you're setting up your first account or fine-tuning custom warmup schedules, you'll find what you need here.

Slide Cold is designed for legitimate outreach — connecting businesses with potential customers. Always respect Instagram's terms of service and your recipients' preferences.

Quick Start Guide

Get up and running in 5 steps:

  1. Create your account — Sign up at /register
  2. Add an Instagram account — Go to Accounts and add your IG credentials + a proxy
  3. Enable warmup — Toggle warming on. Let it run for at least 7 days before sending DMs
  4. Build an audience — Create an audience from competitor followers, hashtags, or locations
  5. Launch a campaign — Create a campaign with templates, assign your warmed account, and activate
Do not skip warmup. Sending DMs from a cold account dramatically increases the risk of restrictions. We recommend at least 7-14 days of warmup before your first campaign.

Creating an Account

Visit /register and enter your email and password. After registration, you'll land on the dashboard.

Plans

FeatureFreePro ($29/mo)Agency ($99/mo)
Instagram Accounts15Unlimited
DMs per Day20200Unlimited
Audience ScrapingYesYesYes
WarmupYesYesYes
API AccessNoYesYes
WebhooksNoNoYes
Custom Warmup SchedulesNoNoYes

Instagram Accounts

Adding Accounts

Navigate to Accounts in the sidebar. Click Add Account and enter:

  • Username — Your Instagram handle (without the @)
  • Password — Your Instagram password

Slide Cold will log in using your credentials, establish a session, and store the session cookies securely. Your password is used only for the initial login and re-authentication.

Instagram may send a security code to your email or phone on first login. Have access to your IG-linked email ready.

Proxy Setup

Every account must have a proxy attached before enabling warmup or pre-warm campaigns. Proxies prevent Instagram from seeing all your accounts originate from the same IP.

Supported Formats

Enter your proxy in host:port:username:password format. Both HTTP and SOCKS5 proxies are supported.

Best Practices

  • Use residential proxies — datacenter proxies are easily detected
  • Use one proxy per account — shared proxies increase risk
  • Choose a proxy geographically close to where the account was originally created
  • Avoid free proxies — they're slow and often already flagged
You can test your proxy from the Proxies page to verify it connects before assigning it to an account.

Account Settings

Each account has configurable settings:

  • Display Name — A label for your reference (not shown on Instagram)
  • Max DMs per Day — Hard cap on total DMs sent from this account across all campaigns. Default: 100
  • User Agent — The browser fingerprint used for requests. Presets available for Chrome, Firefox, Safari. Change only if you know what you're doing
The Max DMs per Day setting is separate from the warmup schedule's cold DM ramp. Campaigns use this account-level cap, not the warmup ramp, so your campaigns can send at your configured rate regardless of warmup day.

Account Status

StatusMeaning
ACTIVEAccount is logged in and operational
LOGIN_REQUIREDSession expired — needs re-authentication
CHALLENGE_REQUIREDInstagram is asking for verification (SMS/email code)
LIMITEDAccount hit a rate limit — paused automatically. Usually resolves in 24-48h
BANNEDAccount has been restricted by Instagram

Warmup System

How Warmup Works

The warmup system automates human-like Instagram activity to build your account's trust score before sending DMs. A "cold" account that suddenly starts sending dozens of DMs will be flagged instantly. Warmup prevents this.

When you enable warmup on an account, Slide Cold will:

  1. Schedule multiple sessions per day (spread across your active hours)
  2. Perform gradually increasing actions — browsing, liking, following, watching stories
  3. Mimic natural usage patterns with randomized delays and session durations
  4. Track all activity in the warmup log for full transparency
A proxy is required to enable warmup. Attach a proxy to your account first.

The 21-Day Schedule

The default warmup follows a 21-day progressive ramp. Here's an overview of how activity scales:

PhaseDaysActivity
Light1-3Minimal browsing. A few likes, story views. Getting Instagram used to seeing activity from your IP/device.
Building4-7More likes (5-10/day), first follows (2-3), longer feed sessions, reel watching.
Moderate8-14Likes ramp to 15-25/day, follows to 8-12, explore browsing, comment scrolling, saves. Account looks like a regular user.
Full15-21Peak activity: 25-35 likes, 10-15 follows, searches, shares. Account has established behavioral patterns. Ready for DMs.
After day 21, the schedule holds at full activity levels. You can keep warmup enabled permanently — it maintains your account health while campaigns run.

Warmup Actions

The warmup system performs these actions, each designed to mimic real user behavior:

  • Browse Feed — Scrolls through the home feed, viewing posts naturally
  • Watch Reels — Views reels with realistic watch times (some watched longer, some skipped)
  • Like Posts — Likes posts from the feed with natural timing
  • Follow Accounts — Follows users discovered through browsing. Auto-unfollows after a configurable period
  • Watch Stories — Views stories from accounts you follow
  • Browse Explore — Navigates the Explore page like a real user
  • Search — Performs searches for accounts, hashtags, and places
  • Save Posts — Saves posts to collections
  • Share Posts — Opens the share sheet on posts (doesn't actually share)
  • Scroll Comments — Opens comment sections and scrolls through them
  • Check Notifications — Views the notifications inbox

Custom Schedules

On Agency plans, you can create fully custom per-day schedules that override the default 21-day ramp. On the account page, scroll to Custom Per-Day Schedule.

What You Can Customize

  • Exact action counts per day (likes, follows, saves, etc.)
  • Session count per day
  • Session time windows (e.g., session 1 between 9-11 AM, session 2 between 2-4 PM)
  • Rest days per day
  • Max DMs override per day

Quick Settings

For simpler customization, use the Quick Settings panel:

  • Speed — Slow (0.5x), Moderate (1x), Aggressive (1.5x), or Max (2x) multiplier on all action counts
  • Daily Sessions — How many warmup sessions per day (default: auto)
  • Active Hours — Time range during which sessions can be scheduled
  • Rest Days — Days of the week where no warmup runs

Rest Days

Real users don't use Instagram the same amount every day. Rest days add natural variance to your account's activity pattern.

  • On rest days, no warmup sessions are scheduled
  • The warmup day counter does not advance on rest days
  • Default: no rest days. Configure in Quick Settings
Setting 1-2 rest days per week (e.g., Sunday) makes your account's behavior look more natural.

Monitoring Progress

Each account page shows a live warmup progress panel with:

  • Day X of 21 — Current warmup day and overall progress
  • Per-action progress bars — Shows done vs. quota for each action type
  • Session status — Whether sessions are completed, in progress, or upcoming
  • Recent Activity log — Chronological list of every action taken
  • Full History — Link to see all warmup activity for the account

If you see "Partial — ran out of content" on an action, it means the warmup tried to perform the action but Instagram returned no more content (e.g., end of feed). This is normal and not an error.

Audiences

Creating Audiences

Audiences are collections of Instagram users that you'll target with campaigns. Go to Audiences and click New Audience.

Give your audience a name (e.g., "Competitor X Followers") and optionally assign it to a folder for organization.

Scraping Sources

Slide Cold can extract audiences from multiple Instagram sources:

Source TypeDescriptionExample
FollowersUsers who follow a specific accountScrape followers of @competitor
FollowingUsers that a specific account followsScrape who @influencer follows
HashtagUsers who posted with a specific hashtag#saasfounder, #realestate
LocationUsers who posted from a locationPosts from "WeWork NYC"
Post LikersUsers who liked a specific postLikers of a viral post
Post CommentersUsers who commented on a postCommenters on competitor content

How to Scrape

  1. Open an audience
  2. Click Add Source
  3. Select the source type and enter the target (username, hashtag, post URL, etc.)
  4. Set a limit (how many users to extract)
  5. Select which account to scrape with (must be active with a proxy)
  6. Click Start Scraping
Scraping runs in the background. You can navigate away and come back — progress is tracked automatically. Large scrapes (10K+ users) may take several minutes.

Managing Members

Once scraped, audience members are listed with their username, follower count, and other metadata. You can:

  • Remove individual members — Click the X next to a username
  • View on Instagram — Click their username to open their profile
  • See member count — Total members shown at the top

Folders

Organize audiences into folders for better management. Folders can be created from the Audiences page and audiences can be moved between folders.

Campaigns

Creating Campaigns

A campaign connects an audience with templates and Instagram accounts to send DMs. Navigate to Campaigns → New Campaign.

Required Setup

  1. Name — A descriptive name for your campaign
  2. Audience — Select which audience to target
  3. Accounts — Select one or more Instagram accounts to send from
  4. Templates — Create at least one message template

Configuration

  • Daily Limit — Max DMs to send per day across all accounts in this campaign
  • Send Delay — Min/max seconds between each DM (randomized)
  • Send Window — Time range during which DMs are sent (respects timezone)
  • Timezone — The timezone for the send window

Templates & Spintax

Templates define the message content. You can create multiple templates per campaign — the system will randomly select from them based on weight.

Variables

Use these variables in your templates — they're replaced per recipient:

VariableReplaced With
{username}Recipient's Instagram username
{full_name}Recipient's full name (if available)

Spintax

Spintax creates message variations to avoid Instagram detecting identical messages. Wrap alternatives in curly braces, separated by pipes:

{Hey|Hi|What's up} {username}! {I noticed|I saw} you follow similar accounts. {Would you be interested in|Have you considered} ...

This generates combinations like:

  • "Hey @john! I noticed you follow similar accounts. Would you be interested in ..."
  • "Hi @john! I saw you follow similar accounts. Have you considered ..."
Create 3-5 templates with different angles (question-based, value-based, social proof) and let Slide Cold rotate between them. This significantly improves reply rates.

Send Windows & Scheduling

The send window controls when DMs are sent. DMs are only dispatched during the configured time range in the campaign's timezone.

  • Start Time — When to start sending (e.g., 9:00 AM)
  • End Time — When to stop sending (e.g., 5:00 PM)
  • Timezone — All times are relative to this timezone
Best practice: Send during business hours in your target audience's timezone (9 AM - 6 PM). DMs sent at 3 AM look automated.

Send Delays

Between each DM, Slide Cold waits a randomized delay between your min and max settings. Default: 45-180 seconds. This prevents burst patterns that Instagram detects.

Account Rotation

When a campaign has multiple accounts assigned, DMs are distributed across them. The scheduler checks each account's remaining daily capacity and assigns DMs accordingly.

Benefits of rotation:

  • Higher total daily volume (each account has its own limit)
  • Reduced per-account risk
  • If one account gets limited, others continue

Pre-Warm

Pre-warm is an optional feature that warms your relationship with each recipient before sending them a DM. When enabled, Slide Cold will like their recent posts and optionally follow them before the DM is sent.

How It Works

  1. Recipient is picked from the audience
  2. Slide Cold visits their profile, likes 2-3 posts, optionally follows
  3. After a cooldown period, the DM is sent
  4. The recipient sees your likes/follow before the DM — making it feel organic
Pre-warm requires all campaign accounts to have proxies attached. If any account lacks a proxy, you'll see an error listing which accounts need proxies.

Pre-warm actions (likes, follows) count toward the account's warmup quotas, so the warmup system won't double-fire those actions.

Follow-Up Messages

You can configure automatic follow-up messages for recipients who haven't replied. Follow-ups are sent after a configurable delay (e.g., 2 days after the initial DM).

  • Each follow-up step has its own template
  • Follow-ups stop automatically when the recipient replies
  • Multiple follow-up steps can be chained (e.g., Day 2, Day 5, Day 10)

Campaign Images

You can attach an image to your campaign. The image is sent as a photo message after the text DM. This is useful for sharing product screenshots, infographics, or visual pitches.

Images are sent after the text message creates the conversation thread. If the image fails to send, the text DM is still delivered successfully.

Managing Campaigns

Campaign States

StatusDescription
DRAFTCampaign created but not activated
ACTIVECampaign is running — DMs being sent
PAUSEDManually paused or auto-paused (rate limit). Can resume
COMPLETEDAll recipients have been messaged
ARCHIVEDMoved to archive. Searchable but inactive

Recipient States

StatusMeaning
PENDINGQueued but not yet sent
WARMINGBeing pre-warmed (likes/follows)
WARM_DONEPre-warm complete, waiting for DM
QUEUEDDM job is in the queue
SENTDM delivered successfully
FAILEDDM failed to send (see error reason)
UNDELIVERABLERecipient can't receive DMs (privacy settings)
SKIPPEDSkipped (user unsubscribed or duplicate)

Conversations

Inbox Overview

The Conversations page shows all DM threads across all your accounts. It works like a CRM inbox — every sent DM creates a conversation, and incoming replies are synced automatically.

DM Listening

Enable DM Listening on an account to sync incoming messages in real-time. This uses a persistent MQTT connection to Instagram's messaging infrastructure.

When listening is active:

  • New messages appear in the Conversations page within seconds
  • Conversation status updates automatically (SENT → REPLIED)
  • Unread counts are tracked per conversation
DM listening uses the same connection for sending DMs. When a listener is active for an account, all DMs from that account go through the existing connection — this is more reliable than creating new connections per message.

Managing Replies

Click any conversation to open the message thread. You can:

  • Reply — Send a response directly from Slide Cold
  • Delete messages — Removes the message locally and unsends it on Instagram
  • View conversation info — See the recipient's username, campaign source, and message history

Conversation Status

StatusMeaning
SENTInitial DM sent, no reply yet
REPLIEDRecipient has replied
READRecipient saw the message but hasn't replied
CLOSEDConversation manually closed
UNSUBSCRIBEDRecipient opted out of future messages

Unsubscribe Handling

When a conversation is marked as UNSUBSCRIBED, that user is automatically excluded from all future campaigns. The DM worker checks for unsubscribed conversations before sending.

You can mark a conversation as unsubscribed from the conversation info panel. This is important for respecting user preferences and avoiding spam complaints.

Analytics

Dashboard

The dashboard shows key metrics at a glance:

  • DMs Sent Today — Total across all accounts
  • Total Conversations — All-time conversation count
  • Reply Rate — Percentage of DMs that received replies
  • Active Accounts — How many accounts are currently active
  • DMs Sent (Last 14 Days) — Bar chart showing daily send volume
  • Recent Activity — Latest warmup and campaign actions

Analytics Page

The dedicated Analytics page offers deeper insights with configurable date ranges (7, 14, 30, 90 days):

  • DMs Sent Per Day — Daily volume with per-account breakdown
  • Cold Reply Rate Over Time — Tracks the rate of first replies over time
  • Hourly Activity — Shows which hours generate the most sends and replies

Cold Reply Rate

The cold reply rate measures how many of your initial DMs get a first reply. This is different from overall reply rate because it only counts the first inbound message per conversation, not follow-up messages in ongoing threads.

Formula: (Conversations with at least one reply / Total DMs sent) × 100

A good cold reply rate is 5-15%. Above 15% is excellent. Below 3% means your targeting or templates need work.

Template Performance

Each template tracks how many times it was sent. Compare templates to identify which messaging angles resonate best with your audience.

Settings & API

API Keys

On Pro and Agency plans, you can generate API keys to access Slide Cold programmatically. Navigate to Settings → API Keys.

API keys are shown once on creation. Store them securely — they grant full access to your account's data.

Webhooks

Agency plans include webhook integrations. Webhooks fire HTTP POST requests to your URL when events occur:

  • conversation.reply — When a recipient replies to your DM
  • campaign.sent — When a DM is successfully sent
  • account.flagged — When an account gets rate-limited or session expires
  • lead.imported — When a conversation is exported as a CRM lead

You can test webhooks from the Settings page to verify your endpoint receives the payload correctly.

Billing & Plans

Manage your subscription from Settings → Billing. Slide Cold uses Stripe for payment processing. You can upgrade, downgrade, or cancel at any time.

Troubleshooting

Common Issues

Account shows LOGIN_REQUIRED

Instagram sessions expire periodically. Go to the account settings, enter your password, and click Save Changes to re-authenticate.

Warmup shows "Partial — ran out of content"

This means the warmup tried to browse/like but Instagram returned no more content. This is normal — it happens when the feed is exhausted or explore returns limited results. The action still counts toward the daily quota.

DMs showing as UNDELIVERABLE

The recipient has privacy settings that prevent receiving DMs from non-followers. This isn't an error — Slide Cold marks these correctly so they're not retried.

Campaign auto-paused

Campaigns auto-pause when an account hits a rate limit. The account is marked as LIMITED. Wait 24-48 hours, then re-activate the campaign.

Rate Limits & Bans

Instagram enforces several types of limits:

  • Action blocks — Temporary blocks on specific actions (liking, following, DMing). Usually 24-48h
  • Shadowban — Your content/messages don't appear to others. Hard to detect
  • Account restriction — Full account limitation. Can last days to permanent

How to Minimize Risk

  • Complete the full 21-day warmup before sending
  • Use residential proxies (not datacenter)
  • Keep daily DM volume reasonable (start with 20-30/day per account)
  • Use spintax to vary messages
  • Don't send identical messages from multiple accounts
  • Set rest days in warmup schedule
  • Use pre-warm to build rapport before DMing

Session Problems

CHALLENGE_REQUIRED

Instagram is asking for a verification code. This typically happens on first login from a new IP. Check your IG-linked email or phone for the code and re-authenticate.

Session keeps expiring

Frequent session expiration can indicate:

  • Your proxy IP changed (use sticky/static residential proxies)
  • You're also logged into the same IG account on another device/browser (avoid this)
  • Instagram flagged the session (wait 24h and re-login)

FAQ

Can I use Slide Cold without warming up?

Technically yes — you can create a campaign and activate it immediately. But this dramatically increases the chance of getting action-blocked or restricted. We strongly recommend at least 7 days of warmup.

How many accounts should I use per campaign?

For best results, use 3-5 accounts per campaign. This distributes volume and provides redundancy if one account gets limited.

What happens if I pause a campaign?

Pending recipients are preserved. When you resume, sending picks up where it left off. Recipients already in the BullMQ queue are reverted to PENDING so they can be re-queued.

Can I send to the same person from different campaigns?

Yes, but be careful. If the same username appears in multiple campaign audiences, they'll receive DMs from each. The unsubscribe system works per-conversation, not globally.

How does account rotation work exactly?

The scheduler runs every 60 seconds. For each active campaign, it checks all assigned accounts, calculates remaining daily capacity per account, and queues DMs distributed across accounts with remaining capacity.

API Reference

Authentication

All API endpoints accept a Bearer token in the Authorization header. Generate API keys from Settings → API Keys.

curl https://yourdomain.com/api/v1/campaigns \
  -H "Authorization: Bearer cs_your_api_key_here"

Keys are prefixed with cs_ followed by a random hex string. The full key is only shown once at creation — store it securely.

API keys grant full access to your account. Never expose them in client-side code or public repositories.

Response Format

All endpoints return JSON. Successful responses return the resource directly. Errors return:

{
  "error": "Description of what went wrong"
}

Status Codes

  • 200 — Success
  • 201 — Created
  • 400 — Bad request (invalid parameters)
  • 401 — Unauthorized (missing or invalid API key)
  • 403 — Forbidden (plan limitation)
  • 404 — Resource not found
  • 500 — Internal server error

Campaigns

List Campaigns

GET /api/v1/campaigns
GET /api/v1/campaigns?folderId=<id>
GET /api/v1/campaigns?archived=true

Create Campaign

POST /api/v1/campaigns
Content-Type: application/json

{
  "name": "My Campaign",
  "audienceId": "audience_id",
  "accountIds": ["account_id_1", "account_id_2"],
  "templates": [
    {
      "body": "Hey {{name}}, love your content!",
      "imageUrl": null
    }
  ],
  "followups": [
    {
      "body": "Just following up — any interest?",
      "delayHours": 24,
      "imageUrl": null
    }
  ],
  "sendWindowStart": "09:00",
  "sendWindowEnd": "18:00",
  "minDelay": 60,
  "maxDelay": 180,
  "preWarmEnabled": false
}

Get Campaign

GET /api/v1/campaigns/<id>

Update Campaign

PATCH /api/v1/campaigns/<id>
Content-Type: application/json

{
  "name": "Updated Name",
  "status": "ACTIVE"
}

Campaign Stats

GET /api/v1/campaigns/<id>/stats

Returns send counts, reply rates, and per-template performance.

Campaign Recipients

GET /api/v1/campaigns/<id>/recipients
GET /api/v1/campaigns/<id>/recipients?status=SENT

Filter by status: PENDING, SENT, REPLIED,FAILED, UNDELIVERABLE.

Audiences

List Audiences

GET /api/v1/audiences
GET /api/v1/audiences?folderId=<id>

Create Audience

POST /api/v1/audiences
Content-Type: application/json

{
  "name": "Fitness Influencers",
  "source": "HASHTAG",
  "sourceValue": "#fitness"
}

Get Audience

GET /api/v1/audiences/<id>

Audience Members

GET /api/v1/audiences/<id>/members?page=1&limit=50
GET /api/v1/audiences/<id>/members?search=username

Import Members

POST /api/v1/audiences/<id>/import
Content-Type: application/json

{
  "members": [
    { "username": "user1" },
    { "username": "user2", "fullName": "John Doe" }
  ]
}

Export Audience

GET /api/v1/audiences/<id>/export

Returns a downloadable CSV of all audience members.

Delete Audience

DELETE /api/v1/audiences/<id>

Conversations

List Conversations

GET /api/v1/conversations?page=1&limit=20
GET /api/v1/conversations?status=REPLIED
GET /api/v1/conversations?campaignId=<id>
GET /api/v1/conversations?accountId=<id>

Get Conversation

GET /api/v1/conversations/<id>

Returns the conversation with all messages.

Update Conversation

PATCH /api/v1/conversations/<id>
Content-Type: application/json

{
  "status": "CLOSED",
  "notes": "Not interested"
}

Send Reply

POST /api/v1/conversations/<id>/reply
Content-Type: application/json

{
  "body": "Thanks for getting back to me!"
}

Send Photo

POST /api/v1/conversations/<id>/photo
Content-Type: multipart/form-data

photo: <file>

Export as CRM Lead

POST /api/v1/conversations/<id>/crm

Exports the conversation as a lead to your connected CRM. Triggers the lead.imported webhook event.

Accounts

List Accounts

GET /api/v1/accounts
GET /api/v1/accounts?folderId=<id>

Get Account

GET /api/v1/accounts/<id>

Update Account

PATCH /api/v1/accounts/<id>
Content-Type: application/json

{
  "displayName": "Main Account",
  "dailyDMLimit": 50,
  "proxy": "host:port:user:pass"
}

Delete Account

DELETE /api/v1/accounts/<id>
Deleting an account removes all associated conversations, warmup logs, and campaign assignments. This cannot be undone.

Check Session

GET /api/v1/accounts/<id>/check-session

Returns whether the Instagram session is still valid.

Re-login

POST /api/v1/accounts/<id>/relogin

Re-authenticates the account with stored credentials.

Webhooks

Webhooks let you receive real-time HTTP POST notifications when events occur in your account. Configure webhooks from Settings → Webhooks or via the API.

List Webhook Endpoints

GET /api/v1/webhooks

Create Webhook Endpoint

POST /api/v1/webhooks
Content-Type: application/json

{
  "url": "https://your-server.com/webhook",
  "events": ["lead.imported"]
}

Returns the endpoint with a secret field (prefixed with whsec_). Store this secret — it's used to verify webhook signatures.

Delete Webhook Endpoint

DELETE /api/v1/webhooks?id=<endpoint_id>

Test Webhook

POST /api/v1/webhooks/<id>/test

Sends a test.ping event to verify your endpoint is receiving payloads correctly.

Verifying Signatures

Every webhook request includes an X-SlideCold-Signature header containing an HMAC-SHA256 signature of the request body, signed with your endpoint's secret.

// Node.js verification example
const crypto = require("crypto");

function verifyWebhook(body, signature, secret) {
  const expected = crypto
    .createHmac("sha256", secret)
    .update(body)
    .digest("hex");
  return expected === signature;
}

// Express middleware
app.post("/webhook", (req, res) => {
  const sig = req.headers["x-slidecold-signature"];
  const raw = JSON.stringify(req.body);

  if (!verifyWebhook(raw, sig, process.env.WEBHOOK_SECRET)) {
    return res.status(401).send("Invalid signature");
  }

  // Process the event
  const { event, data, timestamp } = req.body;
  console.log("Received:", event, data);
  res.sendStatus(200);
});

Webhook Events

All webhook payloads share this structure:

{
  "event": "event.name",
  "data": { ... },
  "timestamp": 1709913600
}

conversation.reply

Fired when an inbound reply is received from a recipient.

{
  "event": "conversation.reply",
  "data": {
    "conversationId": "clx...",
    "recipientUsername": "johndoe",
    "message": "Hey, thanks for reaching out!",
    "repliedAt": "2025-03-08T14:30:00Z",
    "campaignId": "clx..."
  },
  "timestamp": 1709913600
}
The campaignId field is only included if the conversation is linked to a campaign.

campaign.sent

Fired when a DM is successfully sent to a recipient.

{
  "event": "campaign.sent",
  "data": {
    "campaignId": "clx...",
    "recipientUsername": "johndoe",
    "recipientUserId": "12345678",
    "message": "Hey John, love your content!",
    "threadId": "340282366841710301949128532879...",
    "sentAt": "2025-03-08T10:00:00Z"
  },
  "timestamp": 1709913600
}

account.flagged

Fired when an Instagram account gets rate-limited, session expires, or authentication fails.

{
  "event": "account.flagged",
  "data": {
    "accountId": "clx...",
    "username": "myaccount",
    "status": "LIMITED",
    "reason": "RATE_LIMITED_DM",
    "flaggedAt": "2025-03-08T12:00:00Z"
  },
  "timestamp": 1709913600
}

Possible status values:

  • LIMITED — Account hit a rate limit (reason: RATE_LIMITED_DM)
  • NEEDS_RELOGIN — Session expired or auth failed (reason: SESSION_EXPIRED, MQTT_AUTH_FAILED)

lead.imported

Fired when a conversation is exported as a CRM lead.

{
  "event": "lead.imported",
  "data": {
    "conversationId": "clx...",
    "recipientUsername": "johndoe",
    "recipientUserId": "12345678",
    "fullName": "John Doe",
    "bio": "Fitness coach | DM for collabs",
    "conversationStatus": "REPLIED",
    "notes": "Interested in pricing",
    "campaignName": "Fitness Outreach",
    "conversationSummary": [
      {
        "direction": "OUTBOUND",
        "body": "Hey John, love your content!",
        "sentAt": "2025-03-08T10:00:00Z"
      },
      {
        "direction": "INBOUND",
        "body": "Thanks! What do you offer?",
        "sentAt": "2025-03-08T14:30:00Z"
      }
    ],
    "exportedAt": "2025-03-08T15:00:00Z"
  },
  "timestamp": 1709913600
}

test.ping

Sent when you test a webhook endpoint from the Settings page.

{
  "event": "test.ping",
  "data": {
    "message": "This is a test webhook from Slide Cold"
  },
  "timestamp": 1709913600
}
Webhooks are delivered with a 10-second timeout. If your endpoint doesn't respond in time, the delivery is considered failed. There are no automatic retries — ensure your endpoint is reliable.

Need more help? Reach out at [email protected]