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.
Quick Start Guide
Get up and running in 5 steps:
- Create your account — Sign up at /register
- Add an Instagram account — Go to Accounts and add your IG credentials + a proxy
- Enable warmup — Toggle warming on. Let it run for at least 7 days before sending DMs
- Build an audience — Create an audience from competitor followers, hashtags, or locations
- Launch a campaign — Create a campaign with templates, assign your warmed account, and activate
Creating an Account
Visit /register and enter your email and password. After registration, you'll land on the dashboard.
Plans
| Feature | Free | Pro ($29/mo) | Agency ($99/mo) |
|---|---|---|---|
| Instagram Accounts | 1 | 5 | Unlimited |
| DMs per Day | 20 | 200 | Unlimited |
| Audience Scraping | Yes | Yes | Yes |
| Warmup | Yes | Yes | Yes |
| API Access | No | Yes | Yes |
| Webhooks | No | No | Yes |
| Custom Warmup Schedules | No | No | Yes |
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.
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
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
Account Status
| Status | Meaning |
|---|---|
ACTIVE | Account is logged in and operational |
LOGIN_REQUIRED | Session expired — needs re-authentication |
CHALLENGE_REQUIRED | Instagram is asking for verification (SMS/email code) |
LIMITED | Account hit a rate limit — paused automatically. Usually resolves in 24-48h |
BANNED | Account 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:
- Schedule multiple sessions per day (spread across your active hours)
- Perform gradually increasing actions — browsing, liking, following, watching stories
- Mimic natural usage patterns with randomized delays and session durations
- Track all activity in the warmup log for full transparency
The 21-Day Schedule
The default warmup follows a 21-day progressive ramp. Here's an overview of how activity scales:
| Phase | Days | Activity |
|---|---|---|
| Light | 1-3 | Minimal browsing. A few likes, story views. Getting Instagram used to seeing activity from your IP/device. |
| Building | 4-7 | More likes (5-10/day), first follows (2-3), longer feed sessions, reel watching. |
| Moderate | 8-14 | Likes ramp to 15-25/day, follows to 8-12, explore browsing, comment scrolling, saves. Account looks like a regular user. |
| Full | 15-21 | Peak activity: 25-35 likes, 10-15 follows, searches, shares. Account has established behavioral patterns. Ready for DMs. |
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
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 Type | Description | Example |
|---|---|---|
| Followers | Users who follow a specific account | Scrape followers of @competitor |
| Following | Users that a specific account follows | Scrape who @influencer follows |
| Hashtag | Users who posted with a specific hashtag | #saasfounder, #realestate |
| Location | Users who posted from a location | Posts from "WeWork NYC" |
| Post Likers | Users who liked a specific post | Likers of a viral post |
| Post Commenters | Users who commented on a post | Commenters on competitor content |
How to Scrape
- Open an audience
- Click Add Source
- Select the source type and enter the target (username, hashtag, post URL, etc.)
- Set a limit (how many users to extract)
- Select which account to scrape with (must be active with a proxy)
- Click Start Scraping
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
- Name — A descriptive name for your campaign
- Audience — Select which audience to target
- Accounts — Select one or more Instagram accounts to send from
- 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:
| Variable | Replaced 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 ..."
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
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
- Recipient is picked from the audience
- Slide Cold visits their profile, likes 2-3 posts, optionally follows
- After a cooldown period, the DM is sent
- The recipient sees your likes/follow before the DM — making it feel organic
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.
Managing Campaigns
Campaign States
| Status | Description |
|---|---|
DRAFT | Campaign created but not activated |
ACTIVE | Campaign is running — DMs being sent |
PAUSED | Manually paused or auto-paused (rate limit). Can resume |
COMPLETED | All recipients have been messaged |
ARCHIVED | Moved to archive. Searchable but inactive |
Recipient States
| Status | Meaning |
|---|---|
PENDING | Queued but not yet sent |
WARMING | Being pre-warmed (likes/follows) |
WARM_DONE | Pre-warm complete, waiting for DM |
QUEUED | DM job is in the queue |
SENT | DM delivered successfully |
FAILED | DM failed to send (see error reason) |
UNDELIVERABLE | Recipient can't receive DMs (privacy settings) |
SKIPPED | Skipped (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
Conversation Status
| Status | Meaning |
|---|---|
SENT | Initial DM sent, no reply yet |
REPLIED | Recipient has replied |
READ | Recipient saw the message but hasn't replied |
CLOSED | Conversation manually closed |
UNSUBSCRIBED | Recipient 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
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.
Response Format
All endpoints return JSON. Successful responses return the resource directly. Errors return:
{
"error": "Description of what went wrong"
}Status Codes
200— Success201— Created400— Bad request (invalid parameters)401— Unauthorized (missing or invalid API key)403— Forbidden (plan limitation)404— Resource not found500— 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>
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
}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
}Need more help? Reach out at [email protected]