Skip to main content

AutoDM Monitors

Set up persistent monitors that automatically send private DMs to users who comment on your Instagram posts. Monitors run in the background 24/7 — no need to keep polling manually.


Start a Monitor​

Create a new AutoDM monitor for an Instagram post. The monitor will check for new comments at regular intervals and send a private reply (DM) to each new commenter.

Endpoint​

POST /api/uploadposts/autodms/start

Headers​

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

Body Parameters (JSON)​

NameTypeRequiredDescription
post_urlStringYesThe Instagram post URL to monitor for comments.
reply_messageStringYesThe DM message to send to each matching commenter.
profile_usernameStringYesProfile username (as configured in Upload-Post). Must have Instagram connected.
buttonsArrayNoUp 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.
trigger_keywordsArray / StringNoKeywords to filter comments. Only comments containing at least one keyword will receive a DM. Case-insensitive and accent-insensitive ("guide" matches "GUIDE", "guía", "güide", etc.). If omitted, all commenters receive a DM. 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 DM limits per plan. Free: 10 DMs/day. Paid: 500 DMs/day. When the limit is reached, the monitor pauses and resumes the next day.

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."
}

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.

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. Instagram only. AutoDM monitors currently support Instagram only, using Meta's official Private Replies API.

  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. Every monitoring_interval minutes, the monitor checks for new comments.
  3. For each new comment, it sends a private DM using Meta's Private Replies API.
  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.