Skip to main content

AutoDM Monitors

Set up persistent monitors that automatically answer people who comment on your posts, for example everyone who comments "POST". Monitors run in the background 24/7, so there is no need to keep polling manually.

PlatformHow each matching comment is answered
InstagramPrivate DM (Meta's Private Replies API), with optional link buttons
TikTokPublic reply under the comment
YouTubePublic reply under the comment
FacebookPublic reply under the comment (Pages)
ThreadsPublic reply under the comment. Needs a Threads connection with permission to read replies. If you connected Threads before November 2026, reconnect it once
BlueskyPublic reply under the comment

On TikTok, YouTube, Facebook, Threads and Bluesky the monitor answers with a public reply under the comment. See Public auto-replies.

How fast comments are answered:

PlatformWhen a matching comment is answered
Instagram, TikTokWithin seconds. The platform notifies Upload-Post of each new comment as it is posted
YouTube, Facebook, Threads, BlueskyOn the next comment check, every monitoring_interval minutes (15 by default)

On Instagram and TikTok the monitor still reads the post's comments every 2 hours as a safety net, and goes back to monitoring_interval if the platform's notifications stop arriving for the account.


Start a Monitor​

Create a new monitor for a post. The monitor answers each new matching commenter, within seconds on Instagram and TikTok and at the next comment check on the other platforms: a private reply (DM) on Instagram, a public reply on the other platforms.

Endpoint​

POST /api/uploadposts/autodms/start

Headers​

NameValueDescription
AuthorizationApikey your-api-key-hereYour API key for authentication

Body Parameters (JSON)​

NameTypeRequiredDescription
platformStringNoinstagram (default), tiktok, youtube, facebook, threads or bluesky.
post_urlStringInstagram: YesThe post URL to monitor for comments. On the other platforms you can send post_id instead.
post_idStringOther platforms: Yes (or post_url)The post to monitor: TikTok video id, YouTube video id, Facebook post id ({pageId}_{postId}), Threads post id, or Bluesky at:// URI. TikTok and YouTube URLs are also accepted.
reply_messageStringYesThe text sent to each matching commenter: a DM on Instagram, a public reply elsewhere.
reply_messagesArrayNoPublic replies only. Up to 5 alternative texts, rotated across comments so the same reply is not posted over and over. reply_message is always the first one.
profile_usernameStringYesProfile username (as configured in Upload-Post). Must have the platform connected.
buttonsArrayNoInstagram only. Up to 3 web_url buttons added to each auto-DM. Each item is an object {title, url} (title max 20 chars, url must be http/https).
monitoring_intervalIntegerNoMinutes between comment checks. Default: 15. Minimum: 15. Instagram and TikTok answer new comments within seconds, so there it only paces the backup check.
trigger_keywordsArray / StringNoKeywords to filter comments. Only comments containing at least one keyword are answered. Case-insensitive and accent-insensitive ("guide" matches "GUIDE", "guía", "güide", etc.). If omitted, every commenter is answered. Accepts a single string or an array of strings.

Limits​

  • 2 new monitors per profile per day. You can create up to 2 monitors per profile in a 24-hour period.
  • No duplicate posts. If there's already an active monitor for a post URL, you must stop it before creating a new one.
  • Auto-expiration. Monitors automatically stop after 15 days.
  • Daily limits per plan. Free: 10/day. Paid: 500/day. DMs and public auto-replies share this allowance. When the limit is reached, the monitor pauses and resumes the next day.
  • Replies per check. At most 25 answers per check (10 on YouTube, where every reply uses a large share of the API quota). Anything left is answered on the next check.

Example Request​

curl -X POST https://api.upload-post.com/api/uploadposts/autodms/start \
-H 'Authorization: Apikey your-api-key-here' \
-H 'Content-Type: application/json' \
-d '{
"post_url": "https://www.instagram.com/p/ABC123/",
"reply_message": "Hey! Here is your free guide: https://example.com/guide",
"profile_username": "my-profile",
"monitoring_interval": 15,
"trigger_keywords": ["guide", "link"],
"buttons": [
{ "title": "Get the guide", "url": "https://example.com/guide" }
]
}'

Responses​

  • 200 OK (monitor started)
{
"success": true,
"message": "AutoDMs monitoring started successfully",
"monitor_id": "[email protected]_my-profile_1234567890",
"config": {
"post_url": "https://www.instagram.com/p/ABC123/",
"reply_message": "Hey! Here is your free guide: https://example.com/guide",
"profile_username": "my-profile",
"monitoring_interval": 15
}
}
  • 400 Bad Request (missing fields, no Instagram connected, or duplicate post)
{
"success": false,
"error": "There is already an active monitor for this post. Stop it first before creating a new one."
}
  • 429 Too Many Requests (daily limit reached)
{
"success": false,
"error": "Limit reached: maximum 2 monitors per profile per day."
}

Public auto-replies (TikTok, YouTube, Facebook, Threads, Bluesky)​

Same endpoint, same monitor, with platform set. Each comment that matches trigger_keywords gets a public reply under it, posted by your account.

curl -X POST https://api.upload-post.com/api/uploadposts/autodms/start \
-H 'Authorization: Apikey your-api-key-here' \
-H 'Content-Type: application/json' \
-d '{
"platform": "tiktok",
"post_id": "7401234567890123456",
"profile_username": "my-profile",
"trigger_keywords": ["POST"],
"reply_message": "Done! The link is in my bio",
"reply_messages": ["Sent! Check the link in my bio", "It is in my bio, enjoy!"]
}'

200 OK

{
"success": true,
"message": "Auto-replies started: matching tiktok comments get a public reply",
"monitor_id": "[email protected]_my-profile_9f2c1e0a7b3d4c51",
"config": {
"platform": "tiktok",
"reply_mode": "public_reply",
"post_id": "7401234567890123456",
"post_url": "7401234567890123456",
"reply_message": "Done! The link is in my bio",
"reply_messages": ["Done! The link is in my bio", "Sent! Check the link in my bio", "It is in my bio, enjoy!"],
"profile_username": "my-profile",
"monitoring_interval": 15,
"trigger_keywords": ["post"],
"max_replies_per_cycle": 25
}
}

Before the monitor is created, Upload-Post reads the post's comments once. If that fails, the monitor is not created and you get the platform's error, for example 400 with error_code: "tiktok_reconnect_required" when the TikTok connection cannot manage comments (see Comments), or error_code: "threads_read_replies_required" on Threads.

Things to know:

  • Only top-level comments are answered, never replies, and never comments written by your own account.
  • Comments older than 7 days when the monitor first sees them are skipped.
  • Links in TikTok comments are not clickable. Point people to your bio instead.
  • Vary the text. TikTok and YouTube can hide repeated identical replies as spam. Use reply_messages to rotate a few versions.
  • Pause, resume, stop, delete, status and logs work exactly as for Instagram monitors. GET /autodms/status returns platform for every monitor.
  • If the account is disconnected or loses permission, the monitor stops with stop_reason: "reconnect_required". Reconnect it and start a new monitor.

Get Monitor Status​

Retrieve the status of AutoDM monitors for your account. By default returns active monitors (running / paused). Pass include_inactive=true to also receive stopped and expired monitors so you can recover monitor IDs without keeping your own database.

Endpoint​

GET /api/uploadposts/autodms/status

Headers​

NameValueDescription
AuthorizationApikey your-api-key-hereYour API key for authentication

Query Parameters​

NameTypeRequiredDescription
include_inactiveBoolNoWhen true, also returns stopped and expired monitors. Deleted monitors are always excluded. Default: false.

Example Requests​

# Default — active monitors only
curl 'https://api.upload-post.com/api/uploadposts/autodms/status' \
-H 'Authorization: Apikey your-api-key-here'

# All monitors (active + stopped + expired)
curl 'https://api.upload-post.com/api/uploadposts/autodms/status?include_inactive=true' \
-H 'Authorization: Apikey your-api-key-here'

Responses​

  • 200 OK
{
"success": true,
"monitors": [
{
"monitor_id": "[email protected]_my-profile_1234567890",
"post_url": "https://www.instagram.com/p/ABC123/",
"reply_message": "Hey! Here is your free guide: https://example.com/guide",
"profile_username": "my-profile",
"monitoring_interval": 15,
"is_active": true,
"is_running": true,
"is_paused": false,
"status": "running",
"stats": {
"total_comments": 47,
"new_comments": 5,
"successful_replies": 31,
"failed_replies": 2
},
"created_at": "2026-03-28T10:00:00",
"last_check": "2026-03-28T14:30:00",
"paused_at": null,
"stopped_at": null,
"stop_reason": null
},
{
"monitor_id": "[email protected]_my-profile_1234567000",
"post_url": "https://www.instagram.com/p/XYZ987/",
"reply_message": "Hey! Here is your free guide: https://example.com/guide",
"profile_username": "my-profile",
"monitoring_interval": 15,
"is_active": false,
"is_running": false,
"is_paused": false,
"status": "stopped",
"stats": {
"total_comments": 120,
"new_comments": 0,
"successful_replies": 88,
"failed_replies": 3
},
"created_at": "2026-03-20T10:00:00",
"last_check": "2026-03-27T18:00:00",
"paused_at": null,
"stopped_at": "2026-03-27T18:05:00",
"stop_reason": null
}
],
"total_active": 1,
"total": 2
}

Status values: running, paused, resuming, stopped, expired

  • running — thread is currently checking comments and replying.
  • paused — temporarily halted (data preserved, can be resumed).
  • resuming — monitor was active in DB but no live thread; one was just started.
  • stopped — manually stopped via POST /autodms/stop. Only returned when include_inactive=true.
  • expired — auto-stopped after the 15-day lifetime. Only returned when include_inactive=true.

A monitor that can never succeed stops by itself, with one of these stop_reason values:

  • post_not_found — the post was deleted or does not belong to the connected account. Three checks in a row must fail before the monitor stops.
  • reconnect_required — the account was disconnected or its session expired. Reconnect it and start a new monitor.

Response fields:

  • total_active — count of monitors with status running, paused, or resuming. Unchanged by include_inactive so existing dashboards keep working.
  • total — count of every monitor in the response.
  • stopped_at / stop_reason — only set for monitors with is_active: false.

Get Monitor Logs​

Retrieve activity logs for a specific monitor.

Endpoint​

GET /api/uploadposts/autodms/logs

Headers​

NameValueDescription
AuthorizationApikey your-api-key-hereYour API key for authentication

Query Parameters​

NameTypeRequiredDescription
monitor_idStringYesThe monitor ID to query.

Example Request​

curl 'https://api.upload-post.com/api/uploadposts/autodms/[email protected]_my-profile_1234567890' \
-H 'Authorization: Apikey your-api-key-here'

Responses​

  • 200 OK
{
"success": true,
"logs": [
{
"type": "start",
"timestamp": "2026-03-28T10:00:00",
"message": "Monitor started"
},
{
"type": "success",
"timestamp": "2026-03-28T10:15:00",
"message": "31 DMs sent successfully"
}
],
"monitor_info": {
"post_url": "https://www.instagram.com/p/ABC123/",
"profile_username": "my-profile",
"is_active": true
}
}

Pause a Monitor​

Temporarily pause a monitor without losing its configuration. The monitor stops checking for comments but can be resumed later.

Endpoint​

POST /api/uploadposts/autodms/pause

Headers​

NameValueDescription
AuthorizationApikey your-api-key-hereYour API key for authentication

Body Parameters (JSON)​

NameTypeRequiredDescription
monitor_idStringYesThe monitor ID to pause.

Example Request​

curl -X POST https://api.upload-post.com/api/uploadposts/autodms/pause \
-H 'Authorization: Apikey your-api-key-here' \
-H 'Content-Type: application/json' \
-d '{"monitor_id": "[email protected]_my-profile_1234567890"}'

Responses​

  • 200 OK
{
"success": true,
"message": "Monitor paused successfully"
}

Resume a Monitor​

Resume a previously paused monitor. It will continue checking for new comments from where it left off.

Endpoint​

POST /api/uploadposts/autodms/resume

Headers​

NameValueDescription
AuthorizationApikey your-api-key-hereYour API key for authentication

Body Parameters (JSON)​

NameTypeRequiredDescription
monitor_idStringYesThe monitor ID to resume.

Example Request​

curl -X POST https://api.upload-post.com/api/uploadposts/autodms/resume \
-H 'Authorization: Apikey your-api-key-here' \
-H 'Content-Type: application/json' \
-d '{"monitor_id": "[email protected]_my-profile_1234567890"}'

Responses​

  • 200 OK
{
"success": true,
"message": "Monitor resumed successfully"
}

Stop a Monitor​

Deactivate a monitor. The monitor stops running but its data is preserved.

Endpoint​

POST /api/uploadposts/autodms/stop

Headers​

NameValueDescription
AuthorizationApikey your-api-key-hereYour API key for authentication

Body Parameters (JSON)​

NameTypeRequiredDescription
monitor_idStringYesThe monitor ID to stop.

Example Request​

curl -X POST https://api.upload-post.com/api/uploadposts/autodms/stop \
-H 'Authorization: Apikey your-api-key-here' \
-H 'Content-Type: application/json' \
-d '{"monitor_id": "[email protected]_my-profile_1234567890"}'

Responses​

  • 200 OK
{
"success": true,
"message": "Monitor stopped successfully"
}

Delete a Monitor​

Permanently delete a monitor and all its data.

Endpoint​

POST /api/uploadposts/autodms/delete

Headers​

NameValueDescription
AuthorizationApikey your-api-key-hereYour API key for authentication

Body Parameters (JSON)​

NameTypeRequiredDescription
monitor_idStringYesThe monitor ID to delete.

Example Request​

curl -X POST https://api.upload-post.com/api/uploadposts/autodms/delete \
-H 'Authorization: Apikey your-api-key-here' \
-H 'Content-Type: application/json' \
-d '{"monitor_id": "[email protected]_my-profile_1234567890"}'

Responses​

  • 200 OK
{
"success": true,
"message": "Monitor deleted successfully"
}
  • 404 Not Found
{
"success": false,
"error": "Monitor not found or not owned by this account."
}

Important Notes​

  1. Private DMs on Instagram, public replies elsewhere. Instagram monitors use Meta's official Private Replies API. TikTok, YouTube, Facebook, Threads and Bluesky monitors post a public reply (see Public auto-replies). Notes 2, 3 and 6 below are about Instagram.

  2. One DM per comment. Each comment can only receive one private reply. Duplicate attempts are automatically prevented.

  3. 7-day comment window. Private replies can only be sent to comments less than 7 days old.

  4. Daily DM limits. Upload-Post enforces daily DM limits per account (varies by plan). When the limit is reached, the monitor pauses and resumes the next day.

  5. Auto-expiration. Monitors automatically stop after 15 days to prevent stale monitors from running indefinitely.

  6. Rate limits. Meta enforces a limit of 200 DMs per hour per Instagram account. The monitor includes built-in delays between DMs to stay within limits.

How It Works​

  1. You start a monitor with a post URL and reply message.
  2. When someone comments, Meta notifies Upload-Post within seconds (on TikTok, TikTok does). YouTube, Facebook, Threads and Bluesky have no such notification, so there the monitor checks for new comments every monitoring_interval minutes.
  3. For each new matching comment, it sends a private DM using Meta's Private Replies API (a public reply on the other platforms).
  4. It tracks which comments have already been replied to, avoiding duplicates. Meta allows a single private reply per comment, so a comment that already received one is marked as done and never retried. Comments written by the monitored account itself are ignored.
  5. After 15 days, the monitor automatically stops.