Platform Overview
Sharingtools is a multi-tenant SaaS platform for automating Instagram workflows. Built on a custom PHP framework with an event-driven plugin architecture, it gives users and agencies a single dashboard to manage dozens of accounts, schedule content, run engagement campaigns, and track performance.
The REST API exposes the platform's core functionality over HTTP so you can build custom integrations, automate account management, trigger campaigns programmatically, or pull data into your own analytics stack.
Multi-Account Management
List, inspect and control all connected social accounts. Check login status, proxy assignment, and automation state.
Repost Pro Automation
Configure repost schedules by hashtag, location, user, or direct post link. Control speed, captions, delays, and daily pause windows.
Reactions Pro Campaigns
Run like/follow/unfollow engagement campaigns with fine-grained speed control, daily limits, and per-account stats.
Caption Library
Create, read, update and delete saved captions and caption templates for use in automated publishing.
Post Scheduler
List and inspect posts by status: saved, scheduled, published, failed, or publishing. Query across all accounts.
Activity Logs
Retrieve per-account automation logs for Repost Pro and Reactions Pro with status details and timestamps.
Supported Platforms
Primary platform. Full automation suite: repost, reactions, DMs, story repost, engagement, bulk operations.
Quick Start
Make your first API call in under 2 minutes.
Generate an API Key
Log in to your Sharingtools account and navigate to the API Keys panel. Click Generate New Key, give it a name, and copy the key — it starts with sht_. Store it securely; it is shown only once.
Make Your First Request
Pass the key in the Authorization header as a Bearer token. Here's how to list all connected accounts:
curl https://sharingtools.services/api/v1/accounts \ -H "Authorization: Bearer sht_your_api_key_here" \ -H "Accept: application/json"
Handle the Response
Every response is a JSON object with a status field ("success" or "error"). On success, data lives in data; on error, details are in message.
{
"status": "success",
"data": {
"items": [
{
"id": 42,
"username": "my_instagram_account",
"platform": "instagram",
"is_active": true,
"login_required": false
}
],
"total": 1,
"page": 1,
"per_page": 20
}
}
Authentication
Bearer Token
Include your API key in the HTTP Authorization header on every request:
Authorization: Bearer sht_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
| Property | Detail |
|---|---|
| Prefix | sht_ followed by 64 hex characters |
| Header | Authorization: Bearer <key> |
| Storage | SHA-256 hash stored — raw key shown once on creation only |
| Scope | Tied to the generating user account; can only access that user's data |
| Revocation | Keys can be revoked any time from the API Keys panel |
| Admin keys | Keys generated by an admin account have cross-user access where noted |
Authentication Errors
| HTTP Status | message | Cause |
|---|---|---|
| 401 | Unauthorized | Missing or malformed Authorization header |
| 401 | Invalid API key | Key not found or revoked |
| 403 | Module not enabled | Your plan does not include the requested module |
| 403 | Admin access required | Admin-only endpoint accessed with a regular key |
Base URL & Response Format
Base URL
https://sharingtools.services/api/v1/
Replace sharingtools.services with the domain of your Sharingtools installation.
Response Envelope
All responses are JSON. Every response shares this envelope:
{
"status": "success", // always "success" or "error"
"data": { /* response payload */ }
}
{
"status": "error",
"message": "Human-readable error description",
"errors": { /* optional field-level validation errors */ }
}
Request Format
| Method | Body format | Content-Type header |
|---|---|---|
| GET, DELETE | Query string parameters only | Not required |
| POST, PATCH | JSON body | application/json |
Pagination
List endpoints return paginated results. Use query string parameters to navigate pages.
| Parameter | Default | Description |
|---|---|---|
| page | 1 | Page number (1-based) |
| per_page | 20 | Results per page (max 100) |
Paginated responses always include these fields in data:
{
"items": [ /* array of results */ ],
"total": 84, // total matching records
"page": 1,
"per_page": 20
}
HTTP Status Codes & Errors
| Status | Meaning | Common Cause |
|---|---|---|
| 200 | OK | Request succeeded |
| 201 | Created | Resource created (POST) |
| 400 | Bad Request | Malformed JSON or missing required field |
| 401 | Unauthorized | Missing, invalid, or revoked API key |
| 403 | Forbidden | Plan does not include this module / admin only |
| 404 | Not Found | Resource ID does not exist or belongs to another user |
| 409 | Conflict | Duplicate resource (e.g. target already exists) |
| 422 | Unprocessable Entity | Validation failed — see errors object |
| 503 | Service Unavailable | Required plugin/module not installed |
Endpoint Reference
All paths are relative to /api/v1/. All requests require Bearer auth.
Accounts
Manage connected social media accounts. Scoped to the authenticated user.
| Method | Path | Description |
|---|---|---|
| GET | /accounts | List all accounts. Filter by platform with ?platform=instagram |
| GET | /accounts/{id} | Get a single account by ID |
| GET | /accounts/{id}/stats | Account statistics (followers, following, posts count) |
Example — GET /accounts
{
"status": "success",
"data": {
"items": [
{
"id": 42,
"username": "my_account",
"full_name": "My Brand",
"platform": "instagram",
"is_active": true,
"login_required": false,
"is_slave": false,
"proxy": "192.168.1.1:8080",
"date": "2025-01-15 10:30:00"
}
],
"total": 5, "page": 1, "per_page": 20
}
}
Captions
CRUD operations on the caption library. Captions are reusable text templates for automation.
| Method | Path | Description |
|---|---|---|
| GET | /captions | List all captions (paginated). Filter with ?search=keyword |
| GET | /captions/{id} | Get a single caption by ID |
| POST | /captions | Create a new caption. Body: { title, caption } |
| PATCH | /captions/{id} | Update caption title or body |
| DELETE | /captions/{id} | Delete a caption permanently |
Posts
Query scheduled and published posts. Posts are read-only via the API.
| Method | Path | Description |
|---|---|---|
| GET | /posts | List posts. Filter: ?status=scheduled|published|saved|failed|publishing |
| GET | /posts/{id} | Get a single post by ID |
| GET | /posts/account/{account_id} | List posts for a specific account |
Post status values
| Status | Meaning |
|---|---|
| saved | Draft, not yet scheduled |
| scheduled | Queued for future publication |
| publishing | Currently being sent to the platform |
| published | Successfully published |
| failed | Publication attempt failed |
Reactions Pro Module: reactions
Manage engagement campaigns (like/follow/unfollow automation). Requires the Reactions Pro module to be enabled on the account's package.
| Method | Path | Description |
|---|---|---|
| GET | /reactions/schedules | List all Reactions Pro schedules |
| GET | /reactions/schedules/{account_id} | Get schedule for a specific account |
| POST | /reactions/schedules/{account_id}/activate | Activate (resume) the schedule |
| POST | /reactions/schedules/{account_id}/pause | Pause the schedule |
| GET | /reactions/schedules/{account_id}/settings | Get all configurable settings |
| PATCH | /reactions/schedules/{account_id}/settings | Update one or more settings |
| GET | /reactions/targets/types | List all valid target type keys |
| GET | /reactions/schedules/{account_id}/targets | List targets for an account |
| POST | /reactions/schedules/{account_id}/targets | Add a target to the schedule |
| DELETE | /reactions/schedules/{account_id}/targets/{target_id} | Remove a target |
| GET | /reactions/logs | List activity logs (all accounts) |
| GET | /reactions/logs/{account_id} | List activity logs for one account |
| GET | /reactions/stats/{account_id} | Engagement statistics for an account |
| POST | /reactions/bulk/activate | Activate schedules for multiple accounts at once |
| POST | /reactions/bulk/pause | Pause schedules for multiple accounts |
| POST | /reactions/bulk/stop | Force-stop running schedules |
Reactions Pro target types
| Type | Requires ID/value | Description |
|---|---|---|
| hashtag | hashtag name | React to posts with this hashtag |
| location | location ID | React to posts tagged at this location |
| people | username | React to posts from followers of this user |
| explore | — | React to posts in the Explore feed |
| feed | — | React to posts in the home feed |
| likers | post shortcode | React to likers of a specific post |
| user_followers | username | Follow/unfollow followers of a user |
| user_following | username | Follow/unfollow accounts this user follows |
Repost Pro Module: repost-pro
Configure and control Repost Pro schedules — Instagram sources, speed, captions, and activity logs. Requires the Repost Pro module.
| Method | Path | Description |
|---|---|---|
| GET | /repost/schedules | List all Repost Pro schedules |
| GET | /repost/schedules/{account_id} | Get schedule for a specific account |
| POST | /repost/schedules/{account_id}/activate | Activate (resume) the schedule |
| POST | /repost/schedules/{account_id}/pause | Pause the schedule |
| GET | /repost/schedules/{account_id}/settings | Get all configurable settings |
| PATCH | /repost/schedules/{account_id}/settings | Update one or more settings (partial) |
| GET | /repost/targets/types | List all valid target type keys |
| GET | /repost/schedules/{account_id}/targets | List repost sources for an account |
| POST | /repost/schedules/{account_id}/targets | Add a repost source (target) |
| DELETE | /repost/schedules/{account_id}/targets/{target_id} | Remove a repost source |
| GET | /repost/logs | List repost activity logs (all accounts) |
| GET | /repost/logs/{account_id} | List activity logs for one account |
| POST | /repost/bulk/activate | Bulk activate schedules |
| POST | /repost/bulk/pause | Bulk pause schedules |
Repost Pro target types (all 8)
| Type | Requires value | Description |
|---|---|---|
| hashtag | hashtag name | Repost from Instagram hashtag (top/recent) |
| hashtag_reels | hashtag name | Repost Reels from a hashtag |
| location | location ID | Repost from tagged location |
| people | username | Repost from a user's followers' posts |
| people_reels | username | Repost Reels from followers of a user |
| music | music ID | Repost from posts using a specific music track |
| collection | collection ID | Repost from a saved Instagram collection |
| instagram_post | post URL or shortcode | Repost a specific Instagram post by URL |
Settings fields for PATCH /repost/schedules/{id}/settings
| Field | Type | Description |
|---|---|---|
| Schedule | ||
| speed | string | very_slow | slow | medium | fast | very_fast |
| remove_delay | integer | Hours before auto-deleting the reposted content (0 = never) |
| daily_pause | boolean | Enable daily pause window |
| daily_pause_from | string HH:MM | Start of pause window (e.g. "23:00") |
| daily_pause_to | string HH:MM | End of pause window (e.g. "08:00") |
| Caption & Comment | ||
| caption | string | Caption template (supports spintax) |
| first_comment | string | Auto first comment text (supports spintax) |
| metadata_location | integer | Location ID to tag on reposted media |
| metadata_user | string | Username to tag on reposted media |
| Advanced | ||
| collections_shuffle | boolean | Shuffle collection order when reposting |
| data.photo | boolean | Include photo posts |
| data.video | boolean | Include video posts |
| data.album | boolean | Include album/carousel posts |
| data.reels | boolean | Include Reel posts |
| data.private_only | boolean | Only repost from private accounts (niche use) |
Post Actions Module: post-actions-api
Queue and monitor automated like, comment, and follow actions on Instagram posts or profiles. Jobs are executed asynchronously by the cron engine. Requires the Post Actions API module.
| Method | Path | Description |
|---|---|---|
| GET | /post-actions/actions | List allowed action types |
| POST | /post-actions/jobs | Create a new action job |
| GET | /post-actions/jobs | List all jobs (filter by ?status=) |
| GET | /post-actions/jobs/{id} | Get a single job by ID |
| DELETE | /post-actions/jobs/{id} | Cancel a pending job |
| GET | /post-actions/logs | List execution logs (filter by ?post_url=&action=) |
| GET | /post-actions/logs/{id} | Get per-account logs for a specific job |
| GET | /post-actions/usage | Show per-URL/action usage records |
POST /post-actions/jobs — request body fields
| Field | Type | Required | Description |
|---|---|---|---|
| post_url | string | Yes (like/comment) | Full Instagram post URL (/p/, /reel/, /tv/). For follow can be a post URL or profile URL. |
| target_username | string | No | follow only — directly specify the username to follow (overrides post_url). |
| action | string | Yes | like | comment | follow |
| count | integer | Yes | Number of accounts to perform the action (min 1). |
| comment_text | string | comment only | Text to post as comment. Supports spintax. |
Job status values & lifecycle
| Status | Meaning |
|---|---|
| pending | Queued, waiting for next cron run (scheduled ~1 min after creation) |
| processing | Cron is currently executing this job |
| success | All requested actions were performed successfully |
| partial | Some accounts performed the action; others were skipped or failed |
| failed | No actions could be performed |
| cancelled | Job was cancelled by the user before execution |
Only pending jobs can be cancelled. Once a job reaches processing it cannot be stopped.
Example: create a like job
POST /api/v1/post-actions/jobs
Authorization: Bearer sht_your_key
{
"post_url": "https://www.instagram.com/p/ABC123XYZ/",
"action": "like",
"count": 10
}
// 201 Created
{
"success": true,
"data": {
"id": 42,
"post_url": "https://www.instagram.com/p/ABC123XYZ/",
"action": "like",
"count": 10,
"comment_text": null,
"status": "pending",
"scheduled_at": "2026-03-15T10:01:00Z",
"created_at": "2026-03-15T10:00:05Z"
}
}
Example: follow by username
POST /api/v1/post-actions/jobs
Authorization: Bearer sht_your_key
{
"target_username": "cristiano",
"action": "follow",
"count": 5
}
// 201 Created — job queued for 5 accounts to follow @cristiano
Example: GET logs for a job
GET /api/v1/post-actions/logs/42
Authorization: Bearer sht_your_key
{
"success": true,
"data": [
{
"id": 88,
"schedule_id": 42,
"post_url": "https://www.instagram.com/p/ABC123XYZ/",
"action": "like",
"requested_count": 10,
"performed_count": 9,
"status": "partial",
"message": "1 account skipped (already liked)",
"details": {
"results": [
{ "account_id": 7, "username": "acct_one", "status": "success" },
{ "account_id": 12, "username": "acct_two", "status": "skipped", "reason": "already liked" }
]
},
"started_at": "2026-03-15T10:01:12Z",
"finished_at": "2026-03-15T10:01:48Z"
}
]
}
Leads Finder Module: parser
Manage Instagram profile-scraping schedules and export the collected leads as paginated text. Supports 14 target types (followers, following, hashtags, locations, explore, and more). Requires the parser module.
| Method | Path | Description |
|---|---|---|
| GET | /leads/schedules | List all leads schedules (paginated) |
| GET | /leads/schedules/{id} | Get a single schedule by ID |
| POST | /leads/schedules/{id}/start | Activate schedule — sets is_active=1, schedule_date=now |
| POST | /leads/schedules/{id}/stop | Stop schedule — sets is_active=0, is_running=0 |
| GET | /leads/schedules/{id}/export | Export collected leads (paginated lines from txt file) |
| GET | /leads/logs | List run logs (filter by ?account_id=&status=) |
| GET | /leads/logs/{id} | Get a single log entry |
| GET | /leads/stats | List parse stats (filter by ?account_id=&type=) |
Schedule object fields
| Field | Type | Description |
|---|---|---|
| id | int | Schedule ID. |
| account_id | int | Instagram account ID this schedule belongs to. |
| task_name | string | Optional task name set in the UI; used as the output file name. |
| status | string | running | active | scheduled | inactive |
| is_active | bool | Whether the schedule is enabled. |
| is_running | bool | Whether the cron is currently executing. |
| targets | array | Decoded target objects (type, value, id). |
| target_count | int | Number of targets in the array. |
| speed | int | Speed setting (1–5). |
| estimated_speed | int | Estimated leads-per-hour calculated by cron. |
| estimated_speed_parsed | int | Cumulative parsed count used for speed estimation. |
| analyzed_percentage | float | Percentage of target list analyzed so far (0–100). |
| parser_data_type | string | Which data type the cron collects (e.g. username). |
| data_fields | object | 15 boolean flags controlling which profile fields are written to the output file: nickname, user_id, user_link, full_name, is_business, business_category, city, link, profile_bio, followers_count, is_verified, home_country, whatsapp_number, is_new_to_instagram, is_new_to_instagram_30d. |
| filters | object | Profile filters: followers_min/max, followings_min/max, posts_min/max, last_posted_min/max. 0 = no limit. |
| language_filter | object | languages (array of selected language objects), language_detection_notices (bool). |
| telegram | object | Telegram notifications: analytics_enabled, errors_enabled (bools), chat_id (int), delay (int seconds). |
| accelerators | object | enabled (bool), accounts (array), stop_if_all_disconnected (bool), per-action limits: get_followers_limit, get_following_limit, get_hashtag_limit, get_location_limit, get_liker_limit, get_info_limit. |
| custom_delays | object | enabled (bool) + per-action delay in seconds: get_followers, get_following, get_hashtag, get_location, get_info, get_likers. |
| schedule_date | string | DateTime of last start or next queue tick. |
| end_date | string | Estimated completion DateTime. |
| last_action_date | string | DateTime of last cron action. |
Target types (14 supported)
| Type | Description |
|---|---|
| people_followers | Followers of a specific account |
| people_likers | Likers of a specific post |
| people_following | Accounts followed by a specific account |
| people_followers_following | Following list of an account's followers |
| people_followers_followers | Followers of an account's followers |
| people_following_followers | Followers of accounts followed by the target |
| people_following_following | Following list of accounts followed by the target |
| hashtag | Users who posted under a hashtag |
| hashtag_likers | Likers of posts under a hashtag |
| location | Users who posted at a location |
| location_likers | Likers of posts at a location |
| explore | Users appearing in Explore feed |
| explore_likers | Likers of posts in Explore feed |
| user_id_list | Custom list of user IDs |
Example: GET /leads/schedules response
GET /api/v1/leads/schedules
Authorization: Bearer sht_your_key
{
"status": "success",
"data": {
"items": [
{
"id": 12,
"account_id": 7,
"task_name": "fashion-followers-march",
"status": "active",
"is_active": true,
"is_running": false,
"targets": [{"type":"people_followers","value":"fashionnova","id":"123456789"}],
"target_count": 1,
"speed": 3,
"estimated_speed": 480,
"estimated_speed_parsed": 9600,
"analyzed_percentage": 34.5,
"parser_data_type": "username",
"data_fields": {
"nickname": true, "user_id": false, "user_link": false,
"full_name": true, "is_business": false, "business_category": false,
"city": false, "link": false, "profile_bio": false,
"followers_count": true, "is_verified": false, "home_country": false,
"whatsapp_number": false, "is_new_to_instagram": false,
"is_new_to_instagram_30d": false
},
"filters": {
"followers_min": 500, "followers_max": 50000,
"followings_min": 0, "followings_max": 0,
"posts_min": 3, "posts_max": 0,
"last_posted_min": 0, "last_posted_max": 90
},
"language_filter": {
"languages": [], "language_detection_notices": false
},
"telegram": {
"analytics_enabled": false, "errors_enabled": false,
"chat_id": 0, "delay": 0
},
"accelerators": {
"enabled": false, "accounts": [],
"stop_if_all_disconnected": false,
"get_followers_limit": 0, "get_following_limit": 0,
"get_hashtag_limit": 0, "get_location_limit": 0,
"get_liker_limit": 0, "get_info_limit": 0
},
"custom_delays": {
"enabled": false,
"get_followers": 0, "get_following": 0,
"get_hashtag": 0, "get_location": 0,
"get_info": 0, "get_likers": 0
},
"schedule_date": "2026-03-15 10:00:00",
"end_date": "2200-12-12 23:59:59",
"last_action_date": "2026-03-15 11:42:00"
}
],
"total": 1, "page": 1, "per_page": 20
}
}
Example: GET /leads/schedules/{id}/export
GET /api/v1/leads/schedules/12/export?page=1&per_page=500
Authorization: Bearer sht_your_key
// 200 OK — paginated list of collected usernames:
{
"status": "success",
"data": {
"items": ["johndoe", "janesmith", "insta_user_99"],
"total": 14872,
"page": 1,
"per_page": 500,
"file_path": "data-parsed-by-fashionnova_acc.txt"
}
}
// 404 if the parser has not produced a file yet:
{
"status": "error",
"message": "No exported leads file found for this schedule. The parser may not have run yet."
}
AI-DM Module: ai-dm
Manage AI-powered direct message schedules and browse conversation threads and messages. The AI-DM plugin uses OpenAI to generate contextual replies. Requires the ai-dm module.
| Method | Path | Description |
|---|---|---|
| GET | /ai-dm/schedules | List all AI-DM schedules (paginated) |
| GET | /ai-dm/schedules/{id} | Get a single schedule by ID |
| POST | /ai-dm/schedules/{id}/activate | Activate schedule — sets is_active=1 |
| POST | /ai-dm/schedules/{id}/pause | Pause schedule — sets is_active=0 |
| GET | /ai-dm/logs | List run logs (filter by ?account_id=&type=&status=) |
| GET | /ai-dm/logs/{id} | Get a single log entry |
| GET | /ai-dm/threads | List conversation threads (filter by ?account_id=) |
| GET | /ai-dm/threads/{id} | Get a single thread |
| GET | /ai-dm/threads/{id}/messages | List messages in a thread (paginated, chronological) |
Schedule object fields
| Field | Type | Description |
|---|---|---|
| id | int | Schedule ID. |
| account_id | int | Instagram account ID. |
| account_name | string | Instagram username of the account (if stored). |
| status | string | running | active | inactive |
| is_active | bool | Whether the schedule is enabled. |
| daily_pause | object | enabled (bool), from (time string), to (time string). |
| cta | object | Call-to-action: platform, username, spintax. |
| settings.system_prompt | string | System prompt given to the AI model. |
| settings.api_key_configured | bool | true if an OpenAI API key is saved. The key itself is never returned. |
| settings.model | string | OpenAI model name (e.g. gpt-3.5-turbo). |
| settings.folder | string | DM folder ID to scan (Instagram inbox folder). |
| settings.max_per_conversation | int | Max messages sent per conversation. |
| settings.max_per_day_requests | int | Max conversation checks per day. |
| settings.max_per_run_requests | int | Max conversation checks per cron run. |
| settings.max_per_day_messages | int | Max messages sent per day. |
| settings.max_per_run_messages | int | Max messages sent per cron run. |
| settings.max_time | int | Max cron runtime in seconds. |
| schedule_date | string | DateTime of last activation. |
| last_action_date | string | DateTime of last cron action. |
Thread and message object fields
| Thread field | Type | Description |
|---|---|---|
| id | int | Internal thread record ID. |
| account_id | int | Instagram account ID that owns this thread. |
| thread_v2_id | string | Instagram thread v2 identifier. |
| them_user_pk | string | Instagram user PK of the other party. |
| them_username | string | Username of the other party. |
| them_fullname | string | Full name of the other party. |
| item_count | int | Number of messages in the thread. |
| last_activity_at | string | DateTime of most recent activity. |
| last_seen_by_us | string | DateTime we last read this thread. |
| last_seen_by_them | string | DateTime they last read this thread. |
| last_permanent_item_at | string | DateTime of last permanent (non-ephemeral) message. |
| last_non_sender_item_at | string | DateTime of last message not sent by us. |
| last_checked | string | DateTime when the AI last processed this thread. |
| Message field | Type | Description |
|---|---|---|
| id | int | Internal message record ID. |
| thread_id | int | Parent thread ID. |
| item_id | string | Instagram message item ID. |
| timestamp | string | Message timestamp (microseconds, as stored by Instagram). |
| item_type | string | Instagram item type (e.g. text, like, media_share). |
| is_sent_by_us | bool | true if our account sent this message. |
| content | object | Decoded item_content JSON (text, media, etc.). |
Example: GET /ai-dm/schedules and GET /ai-dm/threads/{id}/messages
GET /api/v1/ai-dm/schedules
Authorization: Bearer sht_your_key
// 200 OK
{
"status": "success",
"data": {
"items": [{
"id": 7,
"account_id": 42,
"account_name": "my_brand_account",
"status": "active",
"is_active": true,
"daily_pause": { "enabled": false, "from": null, "to": null },
"cta": { "platform": "whatsapp", "username": "+1234567890", "spintax": null },
"settings": {
"system_prompt": "You are a helpful brand assistant...",
"api_key_configured": true,
"model": "gpt-4",
"folder": "0",
"max_per_conversation": 5,
"max_per_day_requests": 200,
"max_per_run_requests": 50,
"max_per_day_messages": 100,
"max_per_run_messages": 25,
"max_time": 300
},
"schedule_date": "2026-03-15 08:00:00",
"last_action_date": "2026-03-15 14:32:11"
}],
"total": 1, "page": 1, "per_page": 20
}
}
GET /api/v1/ai-dm/threads/3/messages?page=1&per_page=20
Authorization: Bearer sht_your_key
// 200 OK
{
"status": "success",
"data": {
"items": [
{ "id": 101, "thread_id": 3, "item_id": "340282...", "timestamp": "1710505200000000",
"item_type": "text", "is_sent_by_us": false, "content": { "text": "Hey, do you ship to EU?" } },
{ "id": 102, "thread_id": 3, "item_id": "340282...", "timestamp": "1710505260000000",
"item_type": "text", "is_sent_by_us": true, "content": { "text": "Yes! We ship worldwide. ..." } }
],
"total": 2, "page": 1, "per_page": 20
}
}
Welcome DM Module: welcomedm
Manage automated welcome direct message campaigns sent to new followers. Supports multiple message variants, daily pause windows, and attachment files. Requires the welcomedm module.
| Method | Path | Description |
|---|---|---|
| GET | /welcomedm/schedules | List all Welcome DM schedules (paginated) |
| GET | /welcomedm/schedules/{id} | Get a single schedule by ID |
| POST | /welcomedm/schedules/{id}/activate | Activate schedule — sets is_active=1 |
| POST | /welcomedm/schedules/{id}/pause | Pause schedule — sets is_active=0 |
| GET | /welcomedm/logs | List run logs (filter by ?account_id=&status=) |
| GET | /welcomedm/logs/{id} | Get a single log entry |
Schedule object fields
| Field | Type | Description |
|---|---|---|
| id | int | Schedule ID. |
| account_id | int | Instagram account ID this schedule belongs to. |
| is_active | bool | Whether the schedule is enabled. |
| status | string | active | inactive |
| messages | array | Decoded array of message variant objects (text, optional media). |
| message_count | int | Number of message variants configured. |
| speed | int | string | DM send speed. "auto" (string) or an integer (1–5). |
| daily_pause | object | enabled (bool), from (time string), to (time string). |
| settings.skip_opened | bool | Skip followers who have already opened a DM from us. |
| settings.mute_thread | bool | Mute the thread after sending the welcome message. |
| settings.has_attachment | bool | true if an attachment file is configured. File path is not exposed. |
| settings.debug_mode | bool | Debug mode — logs verbose output without sending real DMs. |
| schedule_date | string | DateTime of last activation. |
| end_date | string | Scheduled end DateTime (if configured). |
| last_action_date | string | DateTime of last cron action. |
Example: GET /welcomedm/schedules
GET /api/v1/welcomedm/schedules
Authorization: Bearer sht_your_key
// 200 OK
{
"status": "success",
"data": {
"items": [{
"id": 3,
"account_id": 42,
"is_active": true,
"status": "active",
"messages": [
{ "text": "Hey {username}, welcome! 👋 Check our latest drops at {link}" },
{ "text": "Thanks for following! Use code WELCOME10 for 10% off 🎉" }
],
"message_count": 2,
"speed": "auto",
"daily_pause": { "enabled": true, "from": "22:00", "to": "08:00" },
"settings": {
"skip_opened": true,
"mute_thread": false,
"has_attachment": false,
"debug_mode": false
},
"schedule_date": "2026-03-10 09:00:00",
"end_date": null,
"last_action_date": "2026-03-15 14:45:00"
}],
"total": 1, "page": 1, "per_page": 20
}
}
// Log entry:
GET /api/v1/welcomedm/logs/55
{
"status": "success",
"data": {
"id": 55, "account_id": 42,
"status": "sent",
"follower_id": "9876543210",
"message": null, "details": null,
"date": "2026-03-15 14:45:00"
}
}
Rate Limits & Automation Speed
The REST API itself has no fixed per-IP rate limit, but the underlying automation engine enforces per-account execution rates controlled by the speed setting on each schedule.
Setting a schedule to very_fast does not bypass Instagram's rate limits — it only affects how frequently the cron job processes that account.
| Speed (Repost Pro) | Speed (Reactions Pro) | Approx. actions/hour | Recommended for |
|---|---|---|---|
| very_slow | 1 | ~5–10 | Aged accounts, cautious growth |
| slow | 2 | ~20–30 | Default safe mode |
| medium | 3 | ~50–70 | Active accounts |
| fast | 4 | ~100–130 | High-volume campaigns |
| very_fast | 5 | ~200+ | Short-term bursts only |
fast or very_fast on new or unverified Instagram accounts significantly increases the risk of action blocks or permanent bans. Use a proxy per account and start new accounts on slow.
Ready to build?
Create a free account, generate your first API key from the dashboard, and start automating in minutes.