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.
| Platform | How each matching comment is answered |
|---|---|
| Private DM (Meta's Private Replies API), with optional link buttons | |
| TikTok | Public reply under the comment |
| YouTube | Public reply under the comment |
| Public reply under the comment (Pages) | |
| Threads | Public reply under the comment. Needs a Threads connection with permission to read replies. If you connected Threads before November 2026, reconnect it once |
| Bluesky | Public 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:
| Platform | When a matching comment is answered |
|---|---|
| Instagram, TikTok | Within seconds. The platform notifies Upload-Post of each new comment as it is posted |
| YouTube, Facebook, Threads, Bluesky | On 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
| Name | Value | Description |
|---|---|---|
| Authorization | Apikey your-api-key-here | Your API key for authentication |
Body Parameters (JSON)
| Name | Type | Required | Description |
|---|---|---|---|
| platform | String | No | instagram (default), tiktok, youtube, facebook, threads or bluesky. |
| post_url | String | Instagram: Yes | The post URL to monitor for comments. On the other platforms you can send post_id instead. |
| post_id | String | Other 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_message | String | Yes | The text sent to each matching commenter: a DM on Instagram, a public reply elsewhere. |
| reply_messages | Array | No | Public 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_username | String | Yes | Profile username (as configured in Upload-Post). Must have the platform connected. |
| buttons | Array | No | Instagram 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_interval | Integer | No | Minutes between comment checks. Default: 15. Minimum: 15. Instagram and TikTok answer new comments within seconds, so there it only paces the backup check. |
| trigger_keywords | Array / String | No | Keywords 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_messagesto rotate a few versions. - Pause, resume, stop, delete, status and logs work exactly as for Instagram monitors.
GET /autodms/statusreturnsplatformfor 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
| Name | Value | Description |
|---|---|---|
| Authorization | Apikey your-api-key-here | Your API key for authentication |
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| include_inactive | Bool | No | When 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 viaPOST /autodms/stop. Only returned wheninclude_inactive=true.expired— auto-stopped after the 15-day lifetime. Only returned wheninclude_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 statusrunning,paused, orresuming. Unchanged byinclude_inactiveso existing dashboards keep working.total— count of every monitor in the response.stopped_at/stop_reason— only set for monitors withis_active: false.
Get Monitor Logs
Retrieve activity logs for a specific monitor.
Endpoint
GET /api/uploadposts/autodms/logs
Headers
| Name | Value | Description |
|---|---|---|
| Authorization | Apikey your-api-key-here | Your API key for authentication |
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| monitor_id | String | Yes | The 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
| Name | Value | Description |
|---|---|---|
| Authorization | Apikey your-api-key-here | Your API key for authentication |
Body Parameters (JSON)
| Name | Type | Required | Description |
|---|---|---|---|
| monitor_id | String | Yes | The 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
| Name | Value | Description |
|---|---|---|
| Authorization | Apikey your-api-key-here | Your API key for authentication |
Body Parameters (JSON)
| Name | Type | Required | Description |
|---|---|---|---|
| monitor_id | String | Yes | The 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
| Name | Value | Description |
|---|---|---|
| Authorization | Apikey your-api-key-here | Your API key for authentication |
Body Parameters (JSON)
| Name | Type | Required | Description |
|---|---|---|---|
| monitor_id | String | Yes | The 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
| Name | Value | Description |
|---|---|---|
| Authorization | Apikey your-api-key-here | Your API key for authentication |
Body Parameters (JSON)
| Name | Type | Required | Description |
|---|---|---|---|
| monitor_id | String | Yes | The 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
-
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.
-
One DM per comment. Each comment can only receive one private reply. Duplicate attempts are automatically prevented.
-
7-day comment window. Private replies can only be sent to comments less than 7 days old.
-
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.
-
Auto-expiration. Monitors automatically stop after 15 days to prevent stale monitors from running indefinitely.
-
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
- You start a monitor with a post URL and reply message.
- 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_intervalminutes. - For each new matching comment, it sends a private DM using Meta's Private Replies API (a public reply on the other platforms).
- 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.
- After 15 days, the monitor automatically stops.
Related Endpoints
- Comments — Read and reply to comments on every platform manually.
- Instagram Comments — Read comments and send one-off private replies manually.
- Instagram Direct Messages — Send follow-up DMs and read conversations.
- Media List — Find post IDs and URLs for your Instagram content.